HAND
Dependencies: mbed BMI160 MLX90614 max32630fthr Adafruit_FeatherOLED MAX30100
main.cpp@0:d36fd4cabb70, 2021-11-03 (annotated)
- Committer:
- condato_mbed
- Date:
- Wed Nov 03 15:59:51 2021 +0000
- Revision:
- 0:d36fd4cabb70
HAND FINAL
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
condato_mbed | 0:d36fd4cabb70 | 1 | #include "mbed.h" |
condato_mbed | 0:d36fd4cabb70 | 2 | #include "functions.h" |
condato_mbed | 0:d36fd4cabb70 | 3 | #include "ble_functions.h" |
condato_mbed | 0:d36fd4cabb70 | 4 | |
condato_mbed | 0:d36fd4cabb70 | 5 | #include "RawSerial.h" |
condato_mbed | 0:d36fd4cabb70 | 6 | #include "bmi160.h" |
condato_mbed | 0:d36fd4cabb70 | 7 | #include "max32630fthr.h" |
condato_mbed | 0:d36fd4cabb70 | 8 | #include "max3263x.h" |
condato_mbed | 0:d36fd4cabb70 | 9 | #include "MAX14690.h" |
condato_mbed | 0:d36fd4cabb70 | 10 | #include "Adafruit_SSD1306.h" |
condato_mbed | 0:d36fd4cabb70 | 11 | #include "MAX30100_PulseOximeter.h" |
condato_mbed | 0:d36fd4cabb70 | 12 | #include "mlx90614.h" |
condato_mbed | 0:d36fd4cabb70 | 13 | |
condato_mbed | 0:d36fd4cabb70 | 14 | #include <BLE.h> |
condato_mbed | 0:d36fd4cabb70 | 15 | #include "ble/BLE.h" |
condato_mbed | 0:d36fd4cabb70 | 16 | #include "ble/Gap.h" |
condato_mbed | 0:d36fd4cabb70 | 17 | |
condato_mbed | 0:d36fd4cabb70 | 18 | #include "SDBlockDevice.h" |
condato_mbed | 0:d36fd4cabb70 | 19 | #include "FATFileSystem.h" |
condato_mbed | 0:d36fd4cabb70 | 20 | |
condato_mbed | 0:d36fd4cabb70 | 21 | #include <errno.h> |
condato_mbed | 0:d36fd4cabb70 | 22 | #include <stdio.h> |
condato_mbed | 0:d36fd4cabb70 | 23 | #include <time.h> |
condato_mbed | 0:d36fd4cabb70 | 24 | #include <stdint.h> |
condato_mbed | 0:d36fd4cabb70 | 25 | #include <InterruptIn.h> |
condato_mbed | 0:d36fd4cabb70 | 26 | #include <InterruptManager.h> |
condato_mbed | 0:d36fd4cabb70 | 27 | |
condato_mbed | 0:d36fd4cabb70 | 28 | //MAX32630FTHR |
condato_mbed | 0:d36fd4cabb70 | 29 | MAX32630FTHR pegasus(MAX32630FTHR::VIO_3V3); |
condato_mbed | 0:d36fd4cabb70 | 30 | |
condato_mbed | 0:d36fd4cabb70 | 31 | //MAX14690 Wearable Power-Management Solution Driver |
condato_mbed | 0:d36fd4cabb70 | 32 | I2C i2cm2(I2C2_SDA, I2C2_SCL); |
condato_mbed | 0:d36fd4cabb70 | 33 | MAX14690 max14690(&i2cm2); |
condato_mbed | 0:d36fd4cabb70 | 34 | |
condato_mbed | 0:d36fd4cabb70 | 35 | char device_id[10]; |
condato_mbed | 0:d36fd4cabb70 | 36 | |
condato_mbed | 0:d36fd4cabb70 | 37 | Mutex stdio_mutex; |
condato_mbed | 0:d36fd4cabb70 | 38 | |
condato_mbed | 0:d36fd4cabb70 | 39 | int sensor_temp = 1; |
condato_mbed | 0:d36fd4cabb70 | 40 | unsigned short int measure_id = 0; |
condato_mbed | 0:d36fd4cabb70 | 41 | unsigned short int log_id = 0; |
condato_mbed | 0:d36fd4cabb70 | 42 | |
condato_mbed | 0:d36fd4cabb70 | 43 | //SD-Karte |
condato_mbed | 0:d36fd4cabb70 | 44 | FATFileSystem fileSystem("fs"); |
condato_mbed | 0:d36fd4cabb70 | 45 | SDBlockDevice blockDevice(P0_5, P0_6, P0_4, P0_7); // mosi, miso, sck, cs |
condato_mbed | 0:d36fd4cabb70 | 46 | |
condato_mbed | 0:d36fd4cabb70 | 47 | //Bluetooth-Modul PAN1326B |
condato_mbed | 0:d36fd4cabb70 | 48 | RawSerial pan1326b(P0_1, P0_0); //TX, RX |
condato_mbed | 0:d36fd4cabb70 | 49 | DigitalOut bt_rst (P1_6); //Bluetooth reset |
condato_mbed | 0:d36fd4cabb70 | 50 | |
condato_mbed | 0:d36fd4cabb70 | 51 | //I2C |
condato_mbed | 0:d36fd4cabb70 | 52 | I2C i2c(P3_4, P3_5); //SDA, SCL |
condato_mbed | 0:d36fd4cabb70 | 53 | |
condato_mbed | 0:d36fd4cabb70 | 54 | //Akku |
condato_mbed | 0:d36fd4cabb70 | 55 | AnalogIn battery(AIN_0); |
condato_mbed | 0:d36fd4cabb70 | 56 | |
condato_mbed | 0:d36fd4cabb70 | 57 | //LED |
condato_mbed | 0:d36fd4cabb70 | 58 | DigitalOut r (P2_4); |
condato_mbed | 0:d36fd4cabb70 | 59 | DigitalOut g (P2_5); |
condato_mbed | 0:d36fd4cabb70 | 60 | DigitalOut b (P2_6); |
condato_mbed | 0:d36fd4cabb70 | 61 | DigitalOut RGBs[] = {r, g, b}; // r, g, b |
condato_mbed | 0:d36fd4cabb70 | 62 | |
condato_mbed | 0:d36fd4cabb70 | 63 | //Button interrupt |
condato_mbed | 0:d36fd4cabb70 | 64 | InterruptIn button(P2_3, PullUp); |
condato_mbed | 0:d36fd4cabb70 | 65 | |
condato_mbed | 0:d36fd4cabb70 | 66 | //I2C OLED |
condato_mbed | 0:d36fd4cabb70 | 67 | Adafruit_SSD1306_I2c featherOLED(i2c); |
condato_mbed | 0:d36fd4cabb70 | 68 | |
condato_mbed | 0:d36fd4cabb70 | 69 | //OLED |
condato_mbed | 0:d36fd4cabb70 | 70 | InterruptIn aButton(P5_3, PullUp); |
condato_mbed | 0:d36fd4cabb70 | 71 | InterruptIn bButton(P3_3, PullUp); |
condato_mbed | 0:d36fd4cabb70 | 72 | InterruptIn cButton(P3_2, PullUp); |
condato_mbed | 0:d36fd4cabb70 | 73 | |
condato_mbed | 0:d36fd4cabb70 | 74 | AnalogIn ain0(AIN_4); |
condato_mbed | 0:d36fd4cabb70 | 75 | AnalogIn ain1(AIN_5); |
condato_mbed | 0:d36fd4cabb70 | 76 | AnalogIn ain2(AIN_2); |
condato_mbed | 0:d36fd4cabb70 | 77 | AnalogIn ain3(AIN_3); |
condato_mbed | 0:d36fd4cabb70 | 78 | |
condato_mbed | 0:d36fd4cabb70 | 79 | //MAX30100 |
condato_mbed | 0:d36fd4cabb70 | 80 | Timer t; |
condato_mbed | 0:d36fd4cabb70 | 81 | PulseOximeter pox; |
condato_mbed | 0:d36fd4cabb70 | 82 | uint32_t tsLastReport = 0; |
condato_mbed | 0:d36fd4cabb70 | 83 | |
condato_mbed | 0:d36fd4cabb70 | 84 | //PulseSensor |
condato_mbed | 0:d36fd4cabb70 | 85 | /* |
condato_mbed | 0:d36fd4cabb70 | 86 | PulseSensor* sensor; |
condato_mbed | 0:d36fd4cabb70 | 87 | static volatile uint8_t hrmCounter; |
condato_mbed | 0:d36fd4cabb70 | 88 | static volatile bool triggerSensorPolling; |
condato_mbed | 0:d36fd4cabb70 | 89 | */ |
condato_mbed | 0:d36fd4cabb70 | 90 | |
condato_mbed | 0:d36fd4cabb70 | 91 | AnalogIn ain = AIN_4; |
condato_mbed | 0:d36fd4cabb70 | 92 | double anSignal; |
condato_mbed | 0:d36fd4cabb70 | 93 | int bpm; |
condato_mbed | 0:d36fd4cabb70 | 94 | int signal; |
condato_mbed | 0:d36fd4cabb70 | 95 | int ibi; |
condato_mbed | 0:d36fd4cabb70 | 96 | |
condato_mbed | 0:d36fd4cabb70 | 97 | //MLX90614 |
condato_mbed | 0:d36fd4cabb70 | 98 | MLX90614 IR_thermometer(&i2c); |
condato_mbed | 0:d36fd4cabb70 | 99 | float ir_temp; //temperature in degrees C |
condato_mbed | 0:d36fd4cabb70 | 100 | |
condato_mbed | 0:d36fd4cabb70 | 101 | float buffer_temp; |
condato_mbed | 0:d36fd4cabb70 | 102 | struct tm current = {0}; |
condato_mbed | 0:d36fd4cabb70 | 103 | struct tm actual = {0}; |
condato_mbed | 0:d36fd4cabb70 | 104 | |
condato_mbed | 0:d36fd4cabb70 | 105 | //char ble_buff[255]; |
condato_mbed | 0:d36fd4cabb70 | 106 | int counter_ble = 0; |
condato_mbed | 0:d36fd4cabb70 | 107 | |
condato_mbed | 0:d36fd4cabb70 | 108 | Timeout after_BLE; |
condato_mbed | 0:d36fd4cabb70 | 109 | Timeout led_check; //Zum Überprüfen, ob Datenlogger an ist |
condato_mbed | 0:d36fd4cabb70 | 110 | Timeout turnoff; //Zum Auschalten (nicht implementiert) |
condato_mbed | 0:d36fd4cabb70 | 111 | Timeout flipper; //Zum Bluetooth an / aus |
condato_mbed | 0:d36fd4cabb70 | 112 | Timeout advertise_cancel; //Zum abbrechen von BT bei keinem Verbindungsaufbau |
condato_mbed | 0:d36fd4cabb70 | 113 | Timeout connected_cancel; //Zum abbrechen von BT bei kein Befehlempfang |
condato_mbed | 0:d36fd4cabb70 | 114 | Ticker mess_timer; //ticker eventuell nur bis 30 Minuten geeignet |
condato_mbed | 0:d36fd4cabb70 | 115 | Ticker ticker; |
condato_mbed | 0:d36fd4cabb70 | 116 | Ticker hearth; |
condato_mbed | 0:d36fd4cabb70 | 117 | |
condato_mbed | 0:d36fd4cabb70 | 118 | time_t now; |
condato_mbed | 0:d36fd4cabb70 | 119 | time_t raw; |
condato_mbed | 0:d36fd4cabb70 | 120 | |
condato_mbed | 0:d36fd4cabb70 | 121 | volatile int quit = 0; |
condato_mbed | 0:d36fd4cabb70 | 122 | volatile int ble_return = 0; |
condato_mbed | 0:d36fd4cabb70 | 123 | volatile int conn_state = 0; //Verbindungsstatus für BLE |
condato_mbed | 0:d36fd4cabb70 | 124 | |
condato_mbed | 0:d36fd4cabb70 | 125 | bool after_BT = false; |
condato_mbed | 0:d36fd4cabb70 | 126 | bool in_BT = false; //Flag für BLE ist an |
condato_mbed | 0:d36fd4cabb70 | 127 | bool error_status = false; //Wenn es ein Fehler beim Initialisierung gab |
condato_mbed | 0:d36fd4cabb70 | 128 | bool BT_error = false; //Wenn es BLE oder SD Fehler ist, dann werden die Button Interrupts nicht deklariert |
condato_mbed | 0:d36fd4cabb70 | 129 | bool shipping = false; //Sendevorgang Status |
condato_mbed | 0:d36fd4cabb70 | 130 | bool pause = true; //Pause während Sendevorgang |
condato_mbed | 0:d36fd4cabb70 | 131 | bool init_status = false; //Erfolgreiche Initialisierung Status |
condato_mbed | 0:d36fd4cabb70 | 132 | bool charge = false; //Wenn DL an Stromnetz angeschlossen ist |
condato_mbed | 0:d36fd4cabb70 | 133 | |
condato_mbed | 0:d36fd4cabb70 | 134 | struct tm user_config_time; |
condato_mbed | 0:d36fd4cabb70 | 135 | struct user_config_struct user_config_para = {0, 0, 0, 0, 0, 0, 0}; |
condato_mbed | 0:d36fd4cabb70 | 136 | |
condato_mbed | 0:d36fd4cabb70 | 137 | int next_state = 0; // State-Machine |
condato_mbed | 0:d36fd4cabb70 | 138 | |
condato_mbed | 0:d36fd4cabb70 | 139 | int unsigned long t_diff = 0; |
condato_mbed | 0:d36fd4cabb70 | 140 | int unsigned long unix_time = 0; |
condato_mbed | 0:d36fd4cabb70 | 141 | |
condato_mbed | 0:d36fd4cabb70 | 142 | int default_advertise_time = 300; |
condato_mbed | 0:d36fd4cabb70 | 143 | int default_connected_time = 180; |
condato_mbed | 0:d36fd4cabb70 | 144 | |
condato_mbed | 0:d36fd4cabb70 | 145 | int alert_count = 0; |
condato_mbed | 0:d36fd4cabb70 | 146 | |
condato_mbed | 0:d36fd4cabb70 | 147 | float heartRate; |
condato_mbed | 0:d36fd4cabb70 | 148 | uint8_t sp02; |
condato_mbed | 0:d36fd4cabb70 | 149 | |
condato_mbed | 0:d36fd4cabb70 | 150 | void turnOFF(){ |
condato_mbed | 0:d36fd4cabb70 | 151 | flipper.detach(); |
condato_mbed | 0:d36fd4cabb70 | 152 | turnoff.detach(); |
condato_mbed | 0:d36fd4cabb70 | 153 | printf("\nTEST 2\n"); |
condato_mbed | 0:d36fd4cabb70 | 154 | char string[] = "Shutting down Coldchainlogger..."; |
condato_mbed | 0:d36fd4cabb70 | 155 | write_to_sd_log_single(string); |
condato_mbed | 0:d36fd4cabb70 | 156 | printf("\nTEST 3\n"); |
condato_mbed | 0:d36fd4cabb70 | 157 | printf("\n__________________________\n\nColdcahinlogger - OFF\n__________________________\n\n"); |
condato_mbed | 0:d36fd4cabb70 | 158 | wait(0.2); |
condato_mbed | 0:d36fd4cabb70 | 159 | |
condato_mbed | 0:d36fd4cabb70 | 160 | max14690.shutdown(); |
condato_mbed | 0:d36fd4cabb70 | 161 | } |
condato_mbed | 0:d36fd4cabb70 | 162 | |
condato_mbed | 0:d36fd4cabb70 | 163 | void flip(){ |
condato_mbed | 0:d36fd4cabb70 | 164 | in_BT = !in_BT; |
condato_mbed | 0:d36fd4cabb70 | 165 | if(in_BT == true){ |
condato_mbed | 0:d36fd4cabb70 | 166 | BT_true(); |
condato_mbed | 0:d36fd4cabb70 | 167 | }else if(in_BT == false){ |
condato_mbed | 0:d36fd4cabb70 | 168 | BT_false(); |
condato_mbed | 0:d36fd4cabb70 | 169 | } |
condato_mbed | 0:d36fd4cabb70 | 170 | } |
condato_mbed | 0:d36fd4cabb70 | 171 | |
condato_mbed | 0:d36fd4cabb70 | 172 | void onCheck(){ |
condato_mbed | 0:d36fd4cabb70 | 173 | g = 1; |
condato_mbed | 0:d36fd4cabb70 | 174 | r = 1; |
condato_mbed | 0:d36fd4cabb70 | 175 | } |
condato_mbed | 0:d36fd4cabb70 | 176 | |
condato_mbed | 0:d36fd4cabb70 | 177 | void pushed() |
condato_mbed | 0:d36fd4cabb70 | 178 | { |
condato_mbed | 0:d36fd4cabb70 | 179 | flipper.attach(&flip, 1); // Button für eine Sekunde gedrückt halten um BT zu aktivieren |
condato_mbed | 0:d36fd4cabb70 | 180 | turnoff.attach(&turnOFF, 5); // Button für eine Sekunde gedrückt halten um BT zu aktivieren |
condato_mbed | 0:d36fd4cabb70 | 181 | } |
condato_mbed | 0:d36fd4cabb70 | 182 | |
condato_mbed | 0:d36fd4cabb70 | 183 | void released() { |
condato_mbed | 0:d36fd4cabb70 | 184 | if(quit == 0 && charge == false && after_BT == false){ |
condato_mbed | 0:d36fd4cabb70 | 185 | g = 0; |
condato_mbed | 0:d36fd4cabb70 | 186 | led_check.attach(&onCheck, 3); |
condato_mbed | 0:d36fd4cabb70 | 187 | } |
condato_mbed | 0:d36fd4cabb70 | 188 | flipper.detach(); |
condato_mbed | 0:d36fd4cabb70 | 189 | turnoff.detach(); |
condato_mbed | 0:d36fd4cabb70 | 190 | } |
condato_mbed | 0:d36fd4cabb70 | 191 | |
condato_mbed | 0:d36fd4cabb70 | 192 | void mess_handler(){ |
condato_mbed | 0:d36fd4cabb70 | 193 | next_state = 3; |
condato_mbed | 0:d36fd4cabb70 | 194 | } |
condato_mbed | 0:d36fd4cabb70 | 195 | |
condato_mbed | 0:d36fd4cabb70 | 196 | void states(){ |
condato_mbed | 0:d36fd4cabb70 | 197 | switch(next_state){ |
condato_mbed | 0:d36fd4cabb70 | 198 | case 0: |
condato_mbed | 0:d36fd4cabb70 | 199 | { |
condato_mbed | 0:d36fd4cabb70 | 200 | mess_timer.detach(); |
condato_mbed | 0:d36fd4cabb70 | 201 | printf("No Finger\n"); |
condato_mbed | 0:d36fd4cabb70 | 202 | while ( next_state == 0 ){ |
condato_mbed | 0:d36fd4cabb70 | 203 | loop(); |
condato_mbed | 0:d36fd4cabb70 | 204 | if(battery.read() > 0.95){ |
condato_mbed | 0:d36fd4cabb70 | 205 | r = 0; |
condato_mbed | 0:d36fd4cabb70 | 206 | g = 0; |
condato_mbed | 0:d36fd4cabb70 | 207 | charge = true; |
condato_mbed | 0:d36fd4cabb70 | 208 | }else{ |
condato_mbed | 0:d36fd4cabb70 | 209 | r = 1; |
condato_mbed | 0:d36fd4cabb70 | 210 | charge = false; |
condato_mbed | 0:d36fd4cabb70 | 211 | } |
condato_mbed | 0:d36fd4cabb70 | 212 | loop(); |
condato_mbed | 0:d36fd4cabb70 | 213 | featherOLED.display(); |
condato_mbed | 0:d36fd4cabb70 | 214 | featherOLED.clearDisplay(); |
condato_mbed | 0:d36fd4cabb70 | 215 | featherOLED.setTextCursor(0,0); |
condato_mbed | 0:d36fd4cabb70 | 216 | featherOLED.printf("No Finger"); |
condato_mbed | 0:d36fd4cabb70 | 217 | featherOLED.display(); |
condato_mbed | 0:d36fd4cabb70 | 218 | } |
condato_mbed | 0:d36fd4cabb70 | 219 | break; |
condato_mbed | 0:d36fd4cabb70 | 220 | } |
condato_mbed | 0:d36fd4cabb70 | 221 | case 1: |
condato_mbed | 0:d36fd4cabb70 | 222 | { |
condato_mbed | 0:d36fd4cabb70 | 223 | mess_timer.attach(&mess_handler, (float)user_config_para.interval); |
condato_mbed | 0:d36fd4cabb70 | 224 | while ( next_state == 1 ){ |
condato_mbed | 0:d36fd4cabb70 | 225 | loop(); |
condato_mbed | 0:d36fd4cabb70 | 226 | featherOLED.display(); |
condato_mbed | 0:d36fd4cabb70 | 227 | featherOLED.clearDisplay(); |
condato_mbed | 0:d36fd4cabb70 | 228 | featherOLED.setTextCursor(0,0); |
condato_mbed | 0:d36fd4cabb70 | 229 | featherOLED.printf("Heart rate: %f\n",heartRate); |
condato_mbed | 0:d36fd4cabb70 | 230 | featherOLED.printf("SpO2: %d%\r\n",sp02); |
condato_mbed | 0:d36fd4cabb70 | 231 | featherOLED.display(); |
condato_mbed | 0:d36fd4cabb70 | 232 | } |
condato_mbed | 0:d36fd4cabb70 | 233 | break; |
condato_mbed | 0:d36fd4cabb70 | 234 | } |
condato_mbed | 0:d36fd4cabb70 | 235 | case 2: |
condato_mbed | 0:d36fd4cabb70 | 236 | { |
condato_mbed | 0:d36fd4cabb70 | 237 | conn_state = 0; |
condato_mbed | 0:d36fd4cabb70 | 238 | quit = 1; |
condato_mbed | 0:d36fd4cabb70 | 239 | BLE_handler(); |
condato_mbed | 0:d36fd4cabb70 | 240 | break; |
condato_mbed | 0:d36fd4cabb70 | 241 | } |
condato_mbed | 0:d36fd4cabb70 | 242 | case 3: |
condato_mbed | 0:d36fd4cabb70 | 243 | { |
condato_mbed | 0:d36fd4cabb70 | 244 | get_Messwert(); |
condato_mbed | 0:d36fd4cabb70 | 245 | next_state = 1; |
condato_mbed | 0:d36fd4cabb70 | 246 | break; |
condato_mbed | 0:d36fd4cabb70 | 247 | } |
condato_mbed | 0:d36fd4cabb70 | 248 | } |
condato_mbed | 0:d36fd4cabb70 | 249 | } |
condato_mbed | 0:d36fd4cabb70 | 250 | |
condato_mbed | 0:d36fd4cabb70 | 251 | int main() { |
condato_mbed | 0:d36fd4cabb70 | 252 | init(); |
condato_mbed | 0:d36fd4cabb70 | 253 | BLE& ble = BLE::Instance(BLE::DEFAULT_INSTANCE); |
condato_mbed | 0:d36fd4cabb70 | 254 | if(BT_error == true){ |
condato_mbed | 0:d36fd4cabb70 | 255 | printf("\nBluetooth or SD initialize error: bluetooth can not be used\n"); |
condato_mbed | 0:d36fd4cabb70 | 256 | }else{ |
condato_mbed | 0:d36fd4cabb70 | 257 | __enable_irq(); |
condato_mbed | 0:d36fd4cabb70 | 258 | button.fall(&pushed); |
condato_mbed | 0:d36fd4cabb70 | 259 | button.rise(&released); |
condato_mbed | 0:d36fd4cabb70 | 260 | } |
condato_mbed | 0:d36fd4cabb70 | 261 | while(true) { |
condato_mbed | 0:d36fd4cabb70 | 262 | states(); |
condato_mbed | 0:d36fd4cabb70 | 263 | } |
condato_mbed | 0:d36fd4cabb70 | 264 | } |