HAND

Dependencies:   mbed BMI160 MLX90614 max32630fthr Adafruit_FeatherOLED MAX30100

Committer:
condato_mbed
Date:
Wed Nov 03 16:10:15 2021 +0000
Revision:
1:774d50d6f9d6
Parent:
0:d36fd4cabb70
HAND

Who changed what in which revision?

UserRevisionLine numberNew 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 }