Version beta
Dependencies: BLE_API Definiciones Funciones HeartRate_ Hotboards_rtcc LM_35 MAX_30100 MMA8451Q Pines SDFileSystem mbed nRF51822
Fork of MAX30100_oxullo by
main.cpp@1:5ecac6e368d2, 2017-01-19 (annotated)
- Committer:
- arturogasca
- Date:
- Thu Jan 19 20:26:20 2017 +0000
- Revision:
- 1:5ecac6e368d2
- Parent:
- 0:80ecccd27646
Version beta para equipos biometricos
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| arturogasca | 1:5ecac6e368d2 | 1 | #include "mbed.h" |
| arturogasca | 1:5ecac6e368d2 | 2 | #include "pines.h" |
| arturogasca | 1:5ecac6e368d2 | 3 | #include "ble/BLE.h" |
| arturogasca | 1:5ecac6e368d2 | 4 | #include "ble/services/UARTService.h" |
| arturogasca | 1:5ecac6e368d2 | 5 | #include "MMA8451Q.h" |
| arturogasca | 1:5ecac6e368d2 | 6 | #include "MAX30100_PulseOximeter.h" |
| arturogasca | 1:5ecac6e368d2 | 7 | #include "SDFileSystem.h" |
| arturogasca | 1:5ecac6e368d2 | 8 | #include "LM35.h" |
| arturogasca | 1:5ecac6e368d2 | 9 | #include "Hotboards_rtcc.h" |
| arturogasca | 1:5ecac6e368d2 | 10 | #include "HeartRate.h" |
| arturogasca | 1:5ecac6e368d2 | 11 | |
| arturogasca | 1:5ecac6e368d2 | 12 | |
| arturogasca | 1:5ecac6e368d2 | 13 | //////////////////////////////Definiciones BLE |
| arturogasca | 1:5ecac6e368d2 | 14 | |
| arturogasca | 1:5ecac6e368d2 | 15 | #define WAIT_CONECTION_TIMEOUT 20 |
| arturogasca | 1:5ecac6e368d2 | 16 | const char *bleName = "BIOMETRICOS"; |
| arturogasca | 1:5ecac6e368d2 | 17 | BLEDevice ble; |
| arturogasca | 1:5ecac6e368d2 | 18 | UARTService *uartServicePtr; |
| arturogasca | 1:5ecac6e368d2 | 19 | bool BLE_DATA_AVAILABLE = false; |
| arturogasca | 1:5ecac6e368d2 | 20 | bool BLE_AVAILABLE =true; |
| arturogasca | 1:5ecac6e368d2 | 21 | bool BLE_TIMEOUT = true; |
| arturogasca | 1:5ecac6e368d2 | 22 | int BleSeconds = 0; |
| arturogasca | 1:5ecac6e368d2 | 23 | uint8_t datosBle[20]; |
| arturogasca | 1:5ecac6e368d2 | 24 | |
| arturogasca | 1:5ecac6e368d2 | 25 | |
| arturogasca | 1:5ecac6e368d2 | 26 | #define NEED_CONSOLE_OUTPUT 1 /* Set this if you need debug messages on the console; |
| arturogasca | 1:5ecac6e368d2 | 27 | * it will have an impact on code-size and power consumption. */ |
| arturogasca | 1:5ecac6e368d2 | 28 | #if NEED_CONSOLE_OUTPUT |
| arturogasca | 1:5ecac6e368d2 | 29 | #define DEBUG(STR) { if (uartServicePtr) uartServicePtr->write(STR, strlen(STR)); } |
| arturogasca | 1:5ecac6e368d2 | 30 | #else |
| arturogasca | 1:5ecac6e368d2 | 31 | #define DEBUG(...) /* nothing */ |
| arturogasca | 1:5ecac6e368d2 | 32 | #endif /* #if NEED_CONSOLE_OUTPUT */ |
| arturogasca | 1:5ecac6e368d2 | 33 | |
| arturogasca | 1:5ecac6e368d2 | 34 | |
| arturogasca | 1:5ecac6e368d2 | 35 | ///////////////////////////Definiciones para RTC |
| arturogasca | 1:5ecac6e368d2 | 36 | |
| arturogasca | 1:5ecac6e368d2 | 37 | const char *week[] = {"Domingo", "Lunes", "Martes", "Miercoles", "Jueves", "Viernes", "Sabado"};//days of the week |
| arturogasca | 1:5ecac6e368d2 | 38 | const char *months[] = {"ENE","FEB","MAR","ABR","MAY","JUN", "JUL", "AGO","SEP","OCT","NOV","DIC"};//months of the year |
| arturogasca | 1:5ecac6e368d2 | 39 | I2C device(I2C_SDA,I2C_SCL); //sda scl |
| arturogasca | 1:5ecac6e368d2 | 40 | Hotboards_rtcc rtcc(device); |
| arturogasca | 1:5ecac6e368d2 | 41 | |
| arturogasca | 1:5ecac6e368d2 | 42 | |
| arturogasca | 1:5ecac6e368d2 | 43 | //////////////////Variables de sensores para almacenamiento / envio |
| arturogasca | 1:5ecac6e368d2 | 44 | |
| arturogasca | 1:5ecac6e368d2 | 45 | float Temperatura; |
| arturogasca | 1:5ecac6e368d2 | 46 | float RitmoCardiaco; |
| arturogasca | 1:5ecac6e368d2 | 47 | uint16_t Oxigeno; |
| arturogasca | 1:5ecac6e368d2 | 48 | uint16_t Pasos; |
| arturogasca | 1:5ecac6e368d2 | 49 | |
| arturogasca | 1:5ecac6e368d2 | 50 | ///////////////////////Definicion para Sensor de temperatura |
| AVELARDEV | 0:80ecccd27646 | 51 | |
| arturogasca | 1:5ecac6e368d2 | 52 | LM35 SensorTemp(PIN_ADC1); //PIN_ADC |
| arturogasca | 1:5ecac6e368d2 | 53 | |
| arturogasca | 1:5ecac6e368d2 | 54 | //////////////////////Definicion para Thermistor |
| arturogasca | 1:5ecac6e368d2 | 55 | |
| arturogasca | 1:5ecac6e368d2 | 56 | AnalogIn thermistor(PIN_ADC2); |
| arturogasca | 1:5ecac6e368d2 | 57 | |
| arturogasca | 1:5ecac6e368d2 | 58 | ///////////////////////////////////////Definicion de SD |
| arturogasca | 1:5ecac6e368d2 | 59 | |
| arturogasca | 1:5ecac6e368d2 | 60 | SDFileSystem sd(MOSI,MISO,SCLK,CS, "sd"); // // mosi, miso, sclk, cs, name |
| arturogasca | 1:5ecac6e368d2 | 61 | const char* PathSensores = "/sd/LogSensores/sensores.txt"; |
| arturogasca | 1:5ecac6e368d2 | 62 | const char* PathECG = "/sd/LogSensores/ECG.txt"; |
| arturogasca | 1:5ecac6e368d2 | 63 | const char* PathAxis = "/sd/LogSensores/Axis.txt"; |
| arturogasca | 1:5ecac6e368d2 | 64 | bool archivo = true; |
| arturogasca | 1:5ecac6e368d2 | 65 | |
| arturogasca | 1:5ecac6e368d2 | 66 | |
| arturogasca | 1:5ecac6e368d2 | 67 | //////////////////////////Definicion de tiempos |
| arturogasca | 1:5ecac6e368d2 | 68 | |
| arturogasca | 1:5ecac6e368d2 | 69 | #define REGISTER_TIME 30 |
| arturogasca | 1:5ecac6e368d2 | 70 | #define UPDATE_TIME 1 |
| arturogasca | 1:5ecac6e368d2 | 71 | int RegisterSeconds = 0; |
| arturogasca | 1:5ecac6e368d2 | 72 | int UpdateSeconds = 0; |
| arturogasca | 1:5ecac6e368d2 | 73 | bool SampleTime = false; |
| arturogasca | 1:5ecac6e368d2 | 74 | //Ticker t1; |
| arturogasca | 1:5ecac6e368d2 | 75 | //Ticker t2; |
| arturogasca | 1:5ecac6e368d2 | 76 | |
| AVELARDEV | 0:80ecccd27646 | 77 | |
| arturogasca | 1:5ecac6e368d2 | 78 | /////////////////////////Definicion de sensor ECG |
| arturogasca | 1:5ecac6e368d2 | 79 | |
| arturogasca | 1:5ecac6e368d2 | 80 | #define MUESTRAS_ECG 100 |
| arturogasca | 1:5ecac6e368d2 | 81 | bool ECG_SAMPLE_READY = false; |
| arturogasca | 1:5ecac6e368d2 | 82 | int ecg_idx = 0; |
| arturogasca | 1:5ecac6e368d2 | 83 | unsigned short ecgSamples[MUESTRAS_ECG]; |
| arturogasca | 1:5ecac6e368d2 | 84 | float ecgSamples_f[MUESTRAS_ECG]; |
| arturogasca | 1:5ecac6e368d2 | 85 | HeartRate HR(ECG_OUT, ECG_LO_PLS, ECG_LO_MIN); |
| arturogasca | 1:5ecac6e368d2 | 86 | |
| arturogasca | 1:5ecac6e368d2 | 87 | ////////////////////Definicion de sensor RESPIRACION |
| AVELARDEV | 0:80ecccd27646 | 88 | |
| arturogasca | 1:5ecac6e368d2 | 89 | #define MUESTRAS_RESP 100 |
| arturogasca | 1:5ecac6e368d2 | 90 | bool RESP_SAMPLE_READY = false; |
| arturogasca | 1:5ecac6e368d2 | 91 | int resp_idx = 0; |
| arturogasca | 1:5ecac6e368d2 | 92 | unsigned short respSamples[MUESTRAS_RESP]; |
| arturogasca | 1:5ecac6e368d2 | 93 | float respSamples_f[MUESTRAS_RESP]; |
| arturogasca | 1:5ecac6e368d2 | 94 | |
| arturogasca | 1:5ecac6e368d2 | 95 | ////////////////////Definicion de muestras ACELEROMETRO |
| arturogasca | 1:5ecac6e368d2 | 96 | #define MMA8451_I2C_ADDRESS (0x1d<<1) |
| arturogasca | 1:5ecac6e368d2 | 97 | MMA8451Q acc(I2C_SDA, I2C_SCL, MMA8451_I2C_ADDRESS); |
| arturogasca | 1:5ecac6e368d2 | 98 | |
| arturogasca | 1:5ecac6e368d2 | 99 | #define MUESTRAS_AXIS 100 |
| arturogasca | 1:5ecac6e368d2 | 100 | bool AXIS_SAMPLE_READY = false; |
| arturogasca | 1:5ecac6e368d2 | 101 | int axis_idx = 0; |
| arturogasca | 1:5ecac6e368d2 | 102 | float axisSamples[MUESTRAS_AXIS][3]; //100 muestras, 3 ejes |
| arturogasca | 1:5ecac6e368d2 | 103 | //float axisSamples_f[MUESTRAS_axis]; |
| arturogasca | 1:5ecac6e368d2 | 104 | |
| AVELARDEV | 0:80ecccd27646 | 105 | |
| AVELARDEV | 0:80ecccd27646 | 106 | // PulseOximeter is the higher level interface to the sensor |
| AVELARDEV | 0:80ecccd27646 | 107 | // it offers: |
| AVELARDEV | 0:80ecccd27646 | 108 | // * beat detection reporting |
| AVELARDEV | 0:80ecccd27646 | 109 | // * heart rate calculation |
| AVELARDEV | 0:80ecccd27646 | 110 | // * SpO2 (oxidation level) calculation |
| AVELARDEV | 0:80ecccd27646 | 111 | |
| arturogasca | 1:5ecac6e368d2 | 112 | ///////////////////////////Definiciones para sensor OXIMETRIA |
| arturogasca | 1:5ecac6e368d2 | 113 | |
| arturogasca | 1:5ecac6e368d2 | 114 | PulseOximeter pox; |
| AVELARDEV | 0:80ecccd27646 | 115 | |
| AVELARDEV | 0:80ecccd27646 | 116 | bool newValueMAX30100 = 0; |
| AVELARDEV | 0:80ecccd27646 | 117 | float heartRate; |
| AVELARDEV | 0:80ecccd27646 | 118 | float finalHeartRate; |
| AVELARDEV | 0:80ecccd27646 | 119 | uint8_t sp02; |
| AVELARDEV | 0:80ecccd27646 | 120 | uint16_t finalSp02; |
| AVELARDEV | 0:80ecccd27646 | 121 | std::vector<float> valuesHeartRate; |
| AVELARDEV | 0:80ecccd27646 | 122 | std::vector<uint8_t> valuesSp02; |
| arturogasca | 1:5ecac6e368d2 | 123 | |
| arturogasca | 1:5ecac6e368d2 | 124 | uint32_t REPORTING_PERIOD_MS = 1000; |
| AVELARDEV | 0:80ecccd27646 | 125 | uint8_t samplesMAX30100 = 10; |
| AVELARDEV | 0:80ecccd27646 | 126 | uint8_t counterMAX30100 = 0;; |
| arturogasca | 1:5ecac6e368d2 | 127 | ///////////////////////////////////////////////////////////////// |
| AVELARDEV | 0:80ecccd27646 | 128 | |
| arturogasca | 1:5ecac6e368d2 | 129 | Serial pc(SERIAL_TX, SERIAL_RX); |
| arturogasca | 1:5ecac6e368d2 | 130 | |
| arturogasca | 1:5ecac6e368d2 | 131 | DigitalOut led1(LED_R); |
| arturogasca | 1:5ecac6e368d2 | 132 | DigitalOut led2(LED_N); |
| arturogasca | 1:5ecac6e368d2 | 133 | |
| arturogasca | 1:5ecac6e368d2 | 134 | |
| arturogasca | 1:5ecac6e368d2 | 135 | |
| arturogasca | 1:5ecac6e368d2 | 136 | |
| arturogasca | 1:5ecac6e368d2 | 137 | |
| arturogasca | 1:5ecac6e368d2 | 138 | |
| arturogasca | 1:5ecac6e368d2 | 139 | FILE *fp; |
| arturogasca | 1:5ecac6e368d2 | 140 | |
| arturogasca | 1:5ecac6e368d2 | 141 | |
| arturogasca | 1:5ecac6e368d2 | 142 | |
| arturogasca | 1:5ecac6e368d2 | 143 | |
| arturogasca | 1:5ecac6e368d2 | 144 | ///////////////////////////////////////////////////////////////////////////////////// |
| arturogasca | 1:5ecac6e368d2 | 145 | |
| arturogasca | 1:5ecac6e368d2 | 146 | |
| arturogasca | 1:5ecac6e368d2 | 147 | //////////////Declaracion de funciones///////////////////////// |
| arturogasca | 1:5ecac6e368d2 | 148 | void onBeatDetected(); |
| arturogasca | 1:5ecac6e368d2 | 149 | void CadaSegundo() ; |
| arturogasca | 1:5ecac6e368d2 | 150 | void TiempoSample(); |
| arturogasca | 1:5ecac6e368d2 | 151 | bool inicia_sd(); |
| arturogasca | 1:5ecac6e368d2 | 152 | bool setup(); |
| arturogasca | 1:5ecac6e368d2 | 153 | void do_remove(const char *fsrc); |
| arturogasca | 1:5ecac6e368d2 | 154 | void getOxi(); |
| arturogasca | 1:5ecac6e368d2 | 155 | void getTemp(); |
| arturogasca | 1:5ecac6e368d2 | 156 | void registraSamples(); |
| arturogasca | 1:5ecac6e368d2 | 157 | void registraSensores(); |
| arturogasca | 1:5ecac6e368d2 | 158 | void getSample_ECG(); |
| arturogasca | 1:5ecac6e368d2 | 159 | void getSample_RESP(); |
| arturogasca | 1:5ecac6e368d2 | 160 | void getSample_AXIS(); |
| arturogasca | 1:5ecac6e368d2 | 161 | void write_ECG_file(); |
| arturogasca | 1:5ecac6e368d2 | 162 | void write_AXIS_file(); |
| arturogasca | 1:5ecac6e368d2 | 163 | void updateSensors (); |
| arturogasca | 1:5ecac6e368d2 | 164 | |
| arturogasca | 1:5ecac6e368d2 | 165 | |
| arturogasca | 1:5ecac6e368d2 | 166 | |
| arturogasca | 1:5ecac6e368d2 | 167 | |
| arturogasca | 1:5ecac6e368d2 | 168 | ///////////////////////////////////////////////////// |
| arturogasca | 1:5ecac6e368d2 | 169 | |
| arturogasca | 1:5ecac6e368d2 | 170 | |
| arturogasca | 1:5ecac6e368d2 | 171 | |
| arturogasca | 1:5ecac6e368d2 | 172 | |
| arturogasca | 1:5ecac6e368d2 | 173 | void waitEvent() |
| arturogasca | 1:5ecac6e368d2 | 174 | { |
| arturogasca | 1:5ecac6e368d2 | 175 | if(BLE_DATA_AVAILABLE) |
| arturogasca | 1:5ecac6e368d2 | 176 | { |
| arturogasca | 1:5ecac6e368d2 | 177 | BLE_DATA_AVAILABLE = false; |
| arturogasca | 1:5ecac6e368d2 | 178 | |
| arturogasca | 1:5ecac6e368d2 | 179 | switch(datosBle[0]) |
| arturogasca | 1:5ecac6e368d2 | 180 | { |
| arturogasca | 1:5ecac6e368d2 | 181 | case '1': DEBUG("Recibi 1\r\n"); |
| arturogasca | 1:5ecac6e368d2 | 182 | { |
| arturogasca | 1:5ecac6e368d2 | 183 | break; |
| arturogasca | 1:5ecac6e368d2 | 184 | } |
| arturogasca | 1:5ecac6e368d2 | 185 | case '2': DEBUG("Recibi 2\r\n"); |
| arturogasca | 1:5ecac6e368d2 | 186 | { |
| arturogasca | 1:5ecac6e368d2 | 187 | break; |
| arturogasca | 1:5ecac6e368d2 | 188 | } |
| arturogasca | 1:5ecac6e368d2 | 189 | case '3': DEBUG("Recibi 3\r\n"); |
| arturogasca | 1:5ecac6e368d2 | 190 | { |
| arturogasca | 1:5ecac6e368d2 | 191 | break; |
| arturogasca | 1:5ecac6e368d2 | 192 | } |
| arturogasca | 1:5ecac6e368d2 | 193 | case '4': DEBUG("Recibi 4\r\n"); |
| arturogasca | 1:5ecac6e368d2 | 194 | { |
| arturogasca | 1:5ecac6e368d2 | 195 | break; |
| arturogasca | 1:5ecac6e368d2 | 196 | } |
| arturogasca | 1:5ecac6e368d2 | 197 | } |
| arturogasca | 1:5ecac6e368d2 | 198 | |
| arturogasca | 1:5ecac6e368d2 | 199 | } |
| arturogasca | 1:5ecac6e368d2 | 200 | } |
| arturogasca | 1:5ecac6e368d2 | 201 | |
| arturogasca | 1:5ecac6e368d2 | 202 | |
| arturogasca | 1:5ecac6e368d2 | 203 | |
| arturogasca | 1:5ecac6e368d2 | 204 | void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params) |
| arturogasca | 1:5ecac6e368d2 | 205 | { |
| arturogasca | 1:5ecac6e368d2 | 206 | led2=0; |
| arturogasca | 1:5ecac6e368d2 | 207 | ble.startAdvertising(); |
| arturogasca | 1:5ecac6e368d2 | 208 | BLE_AVAILABLE = false; |
| arturogasca | 1:5ecac6e368d2 | 209 | } |
| arturogasca | 1:5ecac6e368d2 | 210 | void connectionCallback(const Gap::ConnectionCallbackParams_t *params) |
| arturogasca | 1:5ecac6e368d2 | 211 | { |
| arturogasca | 1:5ecac6e368d2 | 212 | BLE_TIMEOUT = false; |
| arturogasca | 1:5ecac6e368d2 | 213 | led2=1; |
| arturogasca | 1:5ecac6e368d2 | 214 | } |
| arturogasca | 1:5ecac6e368d2 | 215 | |
| arturogasca | 1:5ecac6e368d2 | 216 | |
| arturogasca | 1:5ecac6e368d2 | 217 | void onDataWritten(const GattWriteCallbackParams *params) |
| arturogasca | 1:5ecac6e368d2 | 218 | { |
| arturogasca | 1:5ecac6e368d2 | 219 | if ((uartServicePtr != NULL) && (params->handle == uartServicePtr->getTXCharacteristicHandle())) { |
| arturogasca | 1:5ecac6e368d2 | 220 | uint16_t bytesRead = params->len; |
| arturogasca | 1:5ecac6e368d2 | 221 | pc.printf("received %u bytes\r\n", bytesRead); |
| arturogasca | 1:5ecac6e368d2 | 222 | |
| arturogasca | 1:5ecac6e368d2 | 223 | for(int i=0;i<bytesRead;i++){ |
| arturogasca | 1:5ecac6e368d2 | 224 | |
| arturogasca | 1:5ecac6e368d2 | 225 | datosBle[i] = params->data[i]; |
| arturogasca | 1:5ecac6e368d2 | 226 | |
| arturogasca | 1:5ecac6e368d2 | 227 | } |
| arturogasca | 1:5ecac6e368d2 | 228 | BLE_DATA_AVAILABLE = true; |
| arturogasca | 1:5ecac6e368d2 | 229 | } |
| arturogasca | 1:5ecac6e368d2 | 230 | } |
| arturogasca | 1:5ecac6e368d2 | 231 | |
| arturogasca | 1:5ecac6e368d2 | 232 | |
| arturogasca | 1:5ecac6e368d2 | 233 | /* |
| arturogasca | 1:5ecac6e368d2 | 234 | void inicia_ble() |
| arturogasca | 1:5ecac6e368d2 | 235 | { |
| arturogasca | 1:5ecac6e368d2 | 236 | t1.attach(&CadaSegundo,1); |
| arturogasca | 1:5ecac6e368d2 | 237 | t2.attach(&TiempoSample,0.01); |
| arturogasca | 1:5ecac6e368d2 | 238 | pc.printf("Initialising the nRF51822\n\r"); |
| arturogasca | 1:5ecac6e368d2 | 239 | ble.init(); |
| arturogasca | 1:5ecac6e368d2 | 240 | ble.onDisconnection(disconnectionCallback); |
| arturogasca | 1:5ecac6e368d2 | 241 | ble.onDataWritten(onDataWritten); |
| arturogasca | 1:5ecac6e368d2 | 242 | |
| arturogasca | 1:5ecac6e368d2 | 243 | /// setup advertising |
| arturogasca | 1:5ecac6e368d2 | 244 | ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED); |
| arturogasca | 1:5ecac6e368d2 | 245 | ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); |
| arturogasca | 1:5ecac6e368d2 | 246 | ble.accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME, |
| arturogasca | 1:5ecac6e368d2 | 247 | (const uint8_t *)bleName, strlen(bleName)); |
| arturogasca | 1:5ecac6e368d2 | 248 | ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS, |
| arturogasca | 1:5ecac6e368d2 | 249 | (const uint8_t *)UARTServiceUUID_reversed, sizeof(UARTServiceUUID_reversed)); |
| arturogasca | 1:5ecac6e368d2 | 250 | |
| arturogasca | 1:5ecac6e368d2 | 251 | ble.setAdvertisingInterval(160); // 100ms; in multiples of 0.625ms. |
| arturogasca | 1:5ecac6e368d2 | 252 | ble.startAdvertising(); |
| arturogasca | 1:5ecac6e368d2 | 253 | |
| arturogasca | 1:5ecac6e368d2 | 254 | UARTService uartService(ble); |
| arturogasca | 1:5ecac6e368d2 | 255 | uartServicePtr = &uartService; |
| arturogasca | 1:5ecac6e368d2 | 256 | |
| arturogasca | 1:5ecac6e368d2 | 257 | } |
| arturogasca | 1:5ecac6e368d2 | 258 | */ |
| arturogasca | 1:5ecac6e368d2 | 259 | |
| arturogasca | 1:5ecac6e368d2 | 260 | void blink1(int times1, float wait1) |
| arturogasca | 1:5ecac6e368d2 | 261 | { |
| arturogasca | 1:5ecac6e368d2 | 262 | for(int b =0; b< times1; b++) |
| arturogasca | 1:5ecac6e368d2 | 263 | { |
| arturogasca | 1:5ecac6e368d2 | 264 | led1= 1; |
| arturogasca | 1:5ecac6e368d2 | 265 | wait(wait1); |
| arturogasca | 1:5ecac6e368d2 | 266 | led1 =0 ; |
| arturogasca | 1:5ecac6e368d2 | 267 | wait(wait1); |
| arturogasca | 1:5ecac6e368d2 | 268 | } |
| arturogasca | 1:5ecac6e368d2 | 269 | } |
| arturogasca | 1:5ecac6e368d2 | 270 | void blink2(int times2, float wait2) |
| arturogasca | 1:5ecac6e368d2 | 271 | { |
| arturogasca | 1:5ecac6e368d2 | 272 | for(int a =0; a< times2; a++) |
| arturogasca | 1:5ecac6e368d2 | 273 | { |
| arturogasca | 1:5ecac6e368d2 | 274 | led2= 1; |
| arturogasca | 1:5ecac6e368d2 | 275 | wait(wait2); |
| arturogasca | 1:5ecac6e368d2 | 276 | led2 =0 ; |
| arturogasca | 1:5ecac6e368d2 | 277 | wait(wait2); |
| arturogasca | 1:5ecac6e368d2 | 278 | } |
| arturogasca | 1:5ecac6e368d2 | 279 | } |
| arturogasca | 1:5ecac6e368d2 | 280 | |
| arturogasca | 1:5ecac6e368d2 | 281 | |
| arturogasca | 1:5ecac6e368d2 | 282 | |
| arturogasca | 1:5ecac6e368d2 | 283 | ///////////////////////////////////////////////////////////////////////////////////// |
| arturogasca | 1:5ecac6e368d2 | 284 | |
| arturogasca | 1:5ecac6e368d2 | 285 | |
| arturogasca | 1:5ecac6e368d2 | 286 | int main() |
| arturogasca | 1:5ecac6e368d2 | 287 | { |
| arturogasca | 1:5ecac6e368d2 | 288 | |
| arturogasca | 1:5ecac6e368d2 | 289 | pc.printf("Inicio main\n\r"); |
| arturogasca | 1:5ecac6e368d2 | 290 | blink1(4,0.1); |
| arturogasca | 1:5ecac6e368d2 | 291 | blink2(8,0.2); |
| arturogasca | 1:5ecac6e368d2 | 292 | |
| arturogasca | 1:5ecac6e368d2 | 293 | //t1.attach(&CadaSegundo,1); |
| arturogasca | 1:5ecac6e368d2 | 294 | //t2.attach(&TiempoSample,0.01); |
| arturogasca | 1:5ecac6e368d2 | 295 | |
| arturogasca | 1:5ecac6e368d2 | 296 | pc.printf("Initialising the nRF51822\n\r"); |
| arturogasca | 1:5ecac6e368d2 | 297 | ble.init(); |
| arturogasca | 1:5ecac6e368d2 | 298 | ble.onDisconnection(disconnectionCallback); |
| arturogasca | 1:5ecac6e368d2 | 299 | ble.onConnection(connectionCallback); |
| arturogasca | 1:5ecac6e368d2 | 300 | ble.onDataWritten(onDataWritten); |
| arturogasca | 1:5ecac6e368d2 | 301 | |
| arturogasca | 1:5ecac6e368d2 | 302 | //setup advertising |
| arturogasca | 1:5ecac6e368d2 | 303 | ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED); |
| arturogasca | 1:5ecac6e368d2 | 304 | ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); |
| arturogasca | 1:5ecac6e368d2 | 305 | ble.accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME, |
| arturogasca | 1:5ecac6e368d2 | 306 | (const uint8_t *)bleName, strlen(bleName)); |
| arturogasca | 1:5ecac6e368d2 | 307 | ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS, |
| arturogasca | 1:5ecac6e368d2 | 308 | (const uint8_t *)UARTServiceUUID_reversed, sizeof(UARTServiceUUID_reversed)); |
| arturogasca | 1:5ecac6e368d2 | 309 | |
| arturogasca | 1:5ecac6e368d2 | 310 | ble.setAdvertisingInterval(160); // 100ms; in multiples of 0.625ms. |
| arturogasca | 1:5ecac6e368d2 | 311 | ble.startAdvertising(); |
| arturogasca | 1:5ecac6e368d2 | 312 | |
| arturogasca | 1:5ecac6e368d2 | 313 | UARTService uartService(ble); |
| arturogasca | 1:5ecac6e368d2 | 314 | uartServicePtr = &uartService; |
| arturogasca | 1:5ecac6e368d2 | 315 | |
| arturogasca | 1:5ecac6e368d2 | 316 | |
| arturogasca | 1:5ecac6e368d2 | 317 | |
| arturogasca | 1:5ecac6e368d2 | 318 | |
| arturogasca | 1:5ecac6e368d2 | 319 | //inicia_ble(); |
| arturogasca | 1:5ecac6e368d2 | 320 | |
| arturogasca | 1:5ecac6e368d2 | 321 | if(setup()) |
| arturogasca | 1:5ecac6e368d2 | 322 | pc.printf("Sensores Inicializados\r\n"); |
| arturogasca | 1:5ecac6e368d2 | 323 | else |
| arturogasca | 1:5ecac6e368d2 | 324 | pc.printf("Error en inicializacion\r\n"); |
| arturogasca | 1:5ecac6e368d2 | 325 | |
| arturogasca | 1:5ecac6e368d2 | 326 | |
| arturogasca | 1:5ecac6e368d2 | 327 | pc.printf("Inicio del programa\r\n"); |
| arturogasca | 1:5ecac6e368d2 | 328 | |
| arturogasca | 1:5ecac6e368d2 | 329 | while(BLE_AVAILABLE) |
| arturogasca | 1:5ecac6e368d2 | 330 | { |
| arturogasca | 1:5ecac6e368d2 | 331 | ble.waitForEvent(); |
| arturogasca | 1:5ecac6e368d2 | 332 | waitEvent(); |
| arturogasca | 1:5ecac6e368d2 | 333 | } |
| arturogasca | 1:5ecac6e368d2 | 334 | |
| arturogasca | 1:5ecac6e368d2 | 335 | while(1) { |
| arturogasca | 1:5ecac6e368d2 | 336 | updateSensors(); |
| arturogasca | 1:5ecac6e368d2 | 337 | led1 = !led1; |
| arturogasca | 1:5ecac6e368d2 | 338 | wait(0.2); |
| arturogasca | 1:5ecac6e368d2 | 339 | } |
| arturogasca | 1:5ecac6e368d2 | 340 | |
| arturogasca | 1:5ecac6e368d2 | 341 | |
| arturogasca | 1:5ecac6e368d2 | 342 | } |
| arturogasca | 1:5ecac6e368d2 | 343 | |
| arturogasca | 1:5ecac6e368d2 | 344 | |
| arturogasca | 1:5ecac6e368d2 | 345 | |
| arturogasca | 1:5ecac6e368d2 | 346 | |
| arturogasca | 1:5ecac6e368d2 | 347 | |
| arturogasca | 1:5ecac6e368d2 | 348 | |
| arturogasca | 1:5ecac6e368d2 | 349 | |
| arturogasca | 1:5ecac6e368d2 | 350 | // Callback (registered below) fired when a pulse is detected |
| arturogasca | 1:5ecac6e368d2 | 351 | |
| arturogasca | 1:5ecac6e368d2 | 352 | void onBeatDetected() |
| arturogasca | 1:5ecac6e368d2 | 353 | { |
| arturogasca | 1:5ecac6e368d2 | 354 | // pc.printf("Beat!\r\n"); |
| arturogasca | 1:5ecac6e368d2 | 355 | } |
| arturogasca | 1:5ecac6e368d2 | 356 | |
| arturogasca | 1:5ecac6e368d2 | 357 | void CadaSegundo() //Aumenta dos contadores cada segundo para registro y actualizacion |
| arturogasca | 1:5ecac6e368d2 | 358 | { |
| arturogasca | 1:5ecac6e368d2 | 359 | RegisterSeconds++; |
| arturogasca | 1:5ecac6e368d2 | 360 | UpdateSeconds++; |
| arturogasca | 1:5ecac6e368d2 | 361 | if(BLE_TIMEOUT){ |
| arturogasca | 1:5ecac6e368d2 | 362 | BleSeconds++; |
| arturogasca | 1:5ecac6e368d2 | 363 | pc.printf("timeout: %d\r\n",BleSeconds); |
| arturogasca | 1:5ecac6e368d2 | 364 | if(BleSeconds == WAIT_CONECTION_TIMEOUT){ |
| arturogasca | 1:5ecac6e368d2 | 365 | BLE_AVAILABLE = false; |
| arturogasca | 1:5ecac6e368d2 | 366 | BLE_TIMEOUT = false; |
| arturogasca | 1:5ecac6e368d2 | 367 | } |
| arturogasca | 1:5ecac6e368d2 | 368 | |
| arturogasca | 1:5ecac6e368d2 | 369 | } |
| arturogasca | 1:5ecac6e368d2 | 370 | |
| arturogasca | 1:5ecac6e368d2 | 371 | } |
| arturogasca | 1:5ecac6e368d2 | 372 | void TiempoSample() //Timer para samples de Ritmocardiaco,Respiracion y acelerometro |
| arturogasca | 1:5ecac6e368d2 | 373 | { |
| arturogasca | 1:5ecac6e368d2 | 374 | SampleTime = true; |
| arturogasca | 1:5ecac6e368d2 | 375 | } |
| arturogasca | 1:5ecac6e368d2 | 376 | bool inicia_sd() |
| arturogasca | 1:5ecac6e368d2 | 377 | { |
| arturogasca | 1:5ecac6e368d2 | 378 | bool response; |
| arturogasca | 1:5ecac6e368d2 | 379 | |
| arturogasca | 1:5ecac6e368d2 | 380 | /* fp = fopen(PathSensores, "a"); //Intento abrir el archivo... "append" |
| arturogasca | 1:5ecac6e368d2 | 381 | if(fp == NULL) { |
| arturogasca | 1:5ecac6e368d2 | 382 | pc.printf("No pude abrir el archivo\r\n"); |
| arturogasca | 1:5ecac6e368d2 | 383 | archivo = false; //no existe el archivo |
| arturogasca | 1:5ecac6e368d2 | 384 | } |
| arturogasca | 1:5ecac6e368d2 | 385 | else |
| arturogasca | 1:5ecac6e368d2 | 386 | { |
| arturogasca | 1:5ecac6e368d2 | 387 | fprintf(fp, "Dispositivo reiniciado : \r\n"); //Fue un reinicio, solo se logea |
| arturogasca | 1:5ecac6e368d2 | 388 | pc.printf("Si existe un archivo\n"); |
| arturogasca | 1:5ecac6e368d2 | 389 | response = true; |
| arturogasca | 1:5ecac6e368d2 | 390 | } |
| arturogasca | 1:5ecac6e368d2 | 391 | fclose(fp); |
| arturogasca | 1:5ecac6e368d2 | 392 | |
| arturogasca | 1:5ecac6e368d2 | 393 | if (!archivo) |
| arturogasca | 1:5ecac6e368d2 | 394 | { |
| arturogasca | 1:5ecac6e368d2 | 395 | pc.printf("Creando Carpeta de Logs\r\n"); |
| arturogasca | 1:5ecac6e368d2 | 396 | mkdir("/sd/LogSensores", 0777); |
| arturogasca | 1:5ecac6e368d2 | 397 | fp = fopen(PathSensores, "w"); |
| arturogasca | 1:5ecac6e368d2 | 398 | if(fp == NULL) |
| arturogasca | 1:5ecac6e368d2 | 399 | { |
| arturogasca | 1:5ecac6e368d2 | 400 | pc.printf("No pude abrir el archivo log %s\r\n",PathSensores); |
| arturogasca | 1:5ecac6e368d2 | 401 | response = false; |
| arturogasca | 1:5ecac6e368d2 | 402 | } |
| arturogasca | 1:5ecac6e368d2 | 403 | else |
| arturogasca | 1:5ecac6e368d2 | 404 | { |
| arturogasca | 1:5ecac6e368d2 | 405 | fprintf(fp, "LOG %s creado:\r\n",PathSensores); |
| arturogasca | 1:5ecac6e368d2 | 406 | pc.printf("Archivo %s creado por primera vez!\r\n",PathSensores); |
| arturogasca | 1:5ecac6e368d2 | 407 | fclose(fp); |
| arturogasca | 1:5ecac6e368d2 | 408 | wait(0.2); |
| arturogasca | 1:5ecac6e368d2 | 409 | fp = fopen(PathECG, "w"); |
| arturogasca | 1:5ecac6e368d2 | 410 | |
| arturogasca | 1:5ecac6e368d2 | 411 | if(fp == NULL){ |
| arturogasca | 1:5ecac6e368d2 | 412 | pc.printf("No pude abrir el archivo log %s\r\n",PathECG); |
| arturogasca | 1:5ecac6e368d2 | 413 | response = false; |
| arturogasca | 1:5ecac6e368d2 | 414 | } |
| arturogasca | 1:5ecac6e368d2 | 415 | else |
| arturogasca | 1:5ecac6e368d2 | 416 | { |
| arturogasca | 1:5ecac6e368d2 | 417 | fprintf(fp, "LOG %s creado:\r\n",PathECG); |
| arturogasca | 1:5ecac6e368d2 | 418 | pc.printf("Archivo %s creado por primera vez!\r\n",PathECG); |
| arturogasca | 1:5ecac6e368d2 | 419 | fclose(fp); |
| arturogasca | 1:5ecac6e368d2 | 420 | |
| arturogasca | 1:5ecac6e368d2 | 421 | wait(0.2); |
| arturogasca | 1:5ecac6e368d2 | 422 | fp = fopen(PathAxis, "w"); |
| arturogasca | 1:5ecac6e368d2 | 423 | if(fp == NULL){ |
| arturogasca | 1:5ecac6e368d2 | 424 | pc.printf("No pude abrir el archivo log %s\r\n",PathAxis); |
| arturogasca | 1:5ecac6e368d2 | 425 | response = false; |
| arturogasca | 1:5ecac6e368d2 | 426 | } |
| arturogasca | 1:5ecac6e368d2 | 427 | else |
| arturogasca | 1:5ecac6e368d2 | 428 | { |
| arturogasca | 1:5ecac6e368d2 | 429 | fprintf(fp, "LOG %s creado:\r\n",PathAxis); |
| arturogasca | 1:5ecac6e368d2 | 430 | pc.printf("Archivo %s creado por primera vez!\r\n",PathAxis); |
| arturogasca | 1:5ecac6e368d2 | 431 | response = true; |
| arturogasca | 1:5ecac6e368d2 | 432 | } |
| arturogasca | 1:5ecac6e368d2 | 433 | } |
| arturogasca | 1:5ecac6e368d2 | 434 | fclose(fp); |
| arturogasca | 1:5ecac6e368d2 | 435 | } |
| arturogasca | 1:5ecac6e368d2 | 436 | |
| arturogasca | 1:5ecac6e368d2 | 437 | }*/ |
| arturogasca | 1:5ecac6e368d2 | 438 | return response; |
| arturogasca | 1:5ecac6e368d2 | 439 | } |
| arturogasca | 1:5ecac6e368d2 | 440 | |
| arturogasca | 1:5ecac6e368d2 | 441 | bool setup() |
| arturogasca | 1:5ecac6e368d2 | 442 | { |
| arturogasca | 1:5ecac6e368d2 | 443 | |
| arturogasca | 1:5ecac6e368d2 | 444 | pc.printf("Start program!\r\n"); |
| arturogasca | 1:5ecac6e368d2 | 445 | |
| arturogasca | 1:5ecac6e368d2 | 446 | //incializacion SD y archivos de log |
| arturogasca | 1:5ecac6e368d2 | 447 | inicia_sd(); |
| arturogasca | 1:5ecac6e368d2 | 448 | rtcc.begin(); |
| arturogasca | 1:5ecac6e368d2 | 449 | /* set the time (12:30:00) and date 28/nov/2016 */ |
| arturogasca | 1:5ecac6e368d2 | 450 | // rtcc.adjust( DateTime( 2016, 10, 28, 12, 30, 0) ); //year,month,day,hour,min, sec,dow |
| arturogasca | 1:5ecac6e368d2 | 451 | |
| arturogasca | 1:5ecac6e368d2 | 452 | |
| arturogasca | 1:5ecac6e368d2 | 453 | // Initialize the PulseOximeter instance and register a beat-detected callback |
| arturogasca | 1:5ecac6e368d2 | 454 | if(!pox.begin()) |
| arturogasca | 1:5ecac6e368d2 | 455 | return false; |
| arturogasca | 1:5ecac6e368d2 | 456 | pox.setOnBeatDetectedCallback(onBeatDetected); |
| arturogasca | 1:5ecac6e368d2 | 457 | return true; |
| arturogasca | 1:5ecac6e368d2 | 458 | } |
| arturogasca | 1:5ecac6e368d2 | 459 | void do_remove(const char *fsrc) |
| arturogasca | 1:5ecac6e368d2 | 460 | { |
| arturogasca | 1:5ecac6e368d2 | 461 | DIR *d = opendir(fsrc); |
| arturogasca | 1:5ecac6e368d2 | 462 | struct dirent *p; |
| arturogasca | 1:5ecac6e368d2 | 463 | char path[30] = {0}; |
| arturogasca | 1:5ecac6e368d2 | 464 | while((p = readdir(d)) != NULL) { |
| arturogasca | 1:5ecac6e368d2 | 465 | strcpy(path, fsrc); |
| arturogasca | 1:5ecac6e368d2 | 466 | strcat(path, "/"); |
| arturogasca | 1:5ecac6e368d2 | 467 | strcat(path, p->d_name); |
| arturogasca | 1:5ecac6e368d2 | 468 | remove(path); |
| arturogasca | 1:5ecac6e368d2 | 469 | } |
| arturogasca | 1:5ecac6e368d2 | 470 | closedir(d); |
| arturogasca | 1:5ecac6e368d2 | 471 | remove(fsrc); |
| arturogasca | 1:5ecac6e368d2 | 472 | } |
| arturogasca | 1:5ecac6e368d2 | 473 | |
| arturogasca | 1:5ecac6e368d2 | 474 | void getOxi() |
| arturogasca | 1:5ecac6e368d2 | 475 | { |
| arturogasca | 1:5ecac6e368d2 | 476 | heartRate = pox.getHeartRate(); |
| arturogasca | 1:5ecac6e368d2 | 477 | sp02 = pox.getSpO2(); |
| arturogasca | 1:5ecac6e368d2 | 478 | |
| arturogasca | 1:5ecac6e368d2 | 479 | if(heartRate != 0 && sp02 != 0) { |
| arturogasca | 1:5ecac6e368d2 | 480 | pc.printf("Heart rate: %f",heartRate); |
| arturogasca | 1:5ecac6e368d2 | 481 | pc.printf(" bpm / SpO2: %d%\r\n",sp02); |
| arturogasca | 1:5ecac6e368d2 | 482 | valuesHeartRate.push_back(heartRate); |
| arturogasca | 1:5ecac6e368d2 | 483 | valuesSp02.push_back(sp02); |
| arturogasca | 1:5ecac6e368d2 | 484 | counterMAX30100 ++; |
| arturogasca | 1:5ecac6e368d2 | 485 | } else { |
| arturogasca | 1:5ecac6e368d2 | 486 | pc.printf("Valor Oximetria cero\r\n"); |
| arturogasca | 1:5ecac6e368d2 | 487 | Oxigeno = 0; |
| arturogasca | 1:5ecac6e368d2 | 488 | RitmoCardiaco = 0.00; |
| arturogasca | 1:5ecac6e368d2 | 489 | pc.printf("No finger\r\n"); |
| arturogasca | 1:5ecac6e368d2 | 490 | } |
| arturogasca | 1:5ecac6e368d2 | 491 | if(samplesMAX30100 == counterMAX30100) { |
| arturogasca | 1:5ecac6e368d2 | 492 | |
| arturogasca | 1:5ecac6e368d2 | 493 | finalHeartRate = 0; |
| arturogasca | 1:5ecac6e368d2 | 494 | finalSp02 = 0; |
| arturogasca | 1:5ecac6e368d2 | 495 | for(int i=0; i<samplesMAX30100; i++) { |
| arturogasca | 1:5ecac6e368d2 | 496 | finalHeartRate += valuesHeartRate[i]; |
| arturogasca | 1:5ecac6e368d2 | 497 | finalSp02 += valuesSp02[i]; |
| arturogasca | 1:5ecac6e368d2 | 498 | } |
| arturogasca | 1:5ecac6e368d2 | 499 | |
| arturogasca | 1:5ecac6e368d2 | 500 | finalHeartRate /= samplesMAX30100; |
| arturogasca | 1:5ecac6e368d2 | 501 | finalSp02 /= samplesMAX30100; |
| arturogasca | 1:5ecac6e368d2 | 502 | |
| arturogasca | 1:5ecac6e368d2 | 503 | counterMAX30100 = 0; |
| arturogasca | 1:5ecac6e368d2 | 504 | valuesHeartRate.clear(); |
| arturogasca | 1:5ecac6e368d2 | 505 | valuesSp02.clear(); |
| arturogasca | 1:5ecac6e368d2 | 506 | newValueMAX30100 = true; |
| arturogasca | 1:5ecac6e368d2 | 507 | } |
| arturogasca | 1:5ecac6e368d2 | 508 | |
| arturogasca | 1:5ecac6e368d2 | 509 | if(newValueMAX30100) { |
| arturogasca | 1:5ecac6e368d2 | 510 | pc.printf("Valor Oximetria valido\r\n"); |
| arturogasca | 1:5ecac6e368d2 | 511 | newValueMAX30100 = false; |
| arturogasca | 1:5ecac6e368d2 | 512 | RitmoCardiaco = finalHeartRate; |
| arturogasca | 1:5ecac6e368d2 | 513 | Oxigeno = finalSp02; |
| arturogasca | 1:5ecac6e368d2 | 514 | } |
| arturogasca | 1:5ecac6e368d2 | 515 | } |
| arturogasca | 1:5ecac6e368d2 | 516 | |
| arturogasca | 1:5ecac6e368d2 | 517 | |
| arturogasca | 1:5ecac6e368d2 | 518 | void getTemp() |
| arturogasca | 1:5ecac6e368d2 | 519 | { |
| arturogasca | 1:5ecac6e368d2 | 520 | Temperatura = SensorTemp.get(); |
| arturogasca | 1:5ecac6e368d2 | 521 | } |
| arturogasca | 1:5ecac6e368d2 | 522 | |
| arturogasca | 1:5ecac6e368d2 | 523 | |
| arturogasca | 1:5ecac6e368d2 | 524 | void registraSamples() |
| arturogasca | 1:5ecac6e368d2 | 525 | { |
| arturogasca | 1:5ecac6e368d2 | 526 | //return(true); |
| arturogasca | 1:5ecac6e368d2 | 527 | } |
| arturogasca | 1:5ecac6e368d2 | 528 | |
| arturogasca | 1:5ecac6e368d2 | 529 | void registraSensores() |
| arturogasca | 1:5ecac6e368d2 | 530 | { |
| arturogasca | 1:5ecac6e368d2 | 531 | /* pc.printf("Write sensors file\r\n"); |
| arturogasca | 1:5ecac6e368d2 | 532 | DateTime time = rtcc.now( ); |
| arturogasca | 1:5ecac6e368d2 | 533 | pc.printf("%d:%d:%d,%d/%s/%d\r\n",time.hour( ),time.minute( ),time.second( ), |
| arturogasca | 1:5ecac6e368d2 | 534 | time.day( ),months[time.month( )],time.year()); |
| arturogasca | 1:5ecac6e368d2 | 535 | /*fp = fopen("/sd/LogSensores/sensores.txt", "a"); //"a" append |
| arturogasca | 1:5ecac6e368d2 | 536 | if(fp == NULL) { |
| arturogasca | 1:5ecac6e368d2 | 537 | pc.printf("No pude abrir! :(\r\n"); |
| arturogasca | 1:5ecac6e368d2 | 538 | return(false); |
| arturogasca | 1:5ecac6e368d2 | 539 | } else { |
| arturogasca | 1:5ecac6e368d2 | 540 | DateTime time = rtcc.now( ); |
| arturogasca | 1:5ecac6e368d2 | 541 | fprintf(fp,"T=%.2f,O=%d,RC=%.2f,P=%d,",Temperatura,Oxigeno,RitmoCardiaco,Pasos); |
| arturogasca | 1:5ecac6e368d2 | 542 | fprintf(fp,"H=%d:%d:%d,F=%d/%s/%d\r\n",time.hour( ),time.minute( ),time.second( ), |
| arturogasca | 1:5ecac6e368d2 | 543 | time.day( ),months[time.month( )],time.year()); |
| arturogasca | 1:5ecac6e368d2 | 544 | fclose(fp); |
| arturogasca | 1:5ecac6e368d2 | 545 | |
| arturogasca | 1:5ecac6e368d2 | 546 | pc.printf("Escribi en SD! :D \r\n"); |
| arturogasca | 1:5ecac6e368d2 | 547 | pc.printf("T=%.2f,O=%d,RC=%.2f,P=%d,",Temperatura,Oxigeno,RitmoCardiaco,Pasos); |
| arturogasca | 1:5ecac6e368d2 | 548 | pc.printf("H=%d:%d:%d,F=%d/%s/%d\r\n",time.hour( ),time.minute( ),time.second( ), |
| arturogasca | 1:5ecac6e368d2 | 549 | time.day( ),months[time.month( )],time.year()); |
| arturogasca | 1:5ecac6e368d2 | 550 | return(true); |
| arturogasca | 1:5ecac6e368d2 | 551 | }*/ |
| arturogasca | 1:5ecac6e368d2 | 552 | } |
| arturogasca | 1:5ecac6e368d2 | 553 | void getSample_ECG() |
| arturogasca | 1:5ecac6e368d2 | 554 | { |
| arturogasca | 1:5ecac6e368d2 | 555 | if(HR.available()) |
| arturogasca | 1:5ecac6e368d2 | 556 | { |
| arturogasca | 1:5ecac6e368d2 | 557 | ecgSamples[ecg_idx++] = HR.read(); |
| arturogasca | 1:5ecac6e368d2 | 558 | } |
| arturogasca | 1:5ecac6e368d2 | 559 | else |
| arturogasca | 1:5ecac6e368d2 | 560 | { |
| arturogasca | 1:5ecac6e368d2 | 561 | ecgSamples[ecg_idx++] = 0; |
| arturogasca | 1:5ecac6e368d2 | 562 | } |
| arturogasca | 1:5ecac6e368d2 | 563 | if(ecg_idx == MUESTRAS_ECG) |
| arturogasca | 1:5ecac6e368d2 | 564 | { |
| arturogasca | 1:5ecac6e368d2 | 565 | ecg_idx =0; |
| arturogasca | 1:5ecac6e368d2 | 566 | ECG_SAMPLE_READY = true; |
| arturogasca | 1:5ecac6e368d2 | 567 | } |
| arturogasca | 1:5ecac6e368d2 | 568 | |
| arturogasca | 1:5ecac6e368d2 | 569 | } |
| arturogasca | 1:5ecac6e368d2 | 570 | |
| arturogasca | 1:5ecac6e368d2 | 571 | void getSample_RESP() |
| arturogasca | 1:5ecac6e368d2 | 572 | { |
| arturogasca | 1:5ecac6e368d2 | 573 | respSamples[resp_idx++] = thermistor.read_u16(); |
| arturogasca | 1:5ecac6e368d2 | 574 | |
| arturogasca | 1:5ecac6e368d2 | 575 | if (resp_idx == MUESTRAS_RESP) |
| arturogasca | 1:5ecac6e368d2 | 576 | { |
| arturogasca | 1:5ecac6e368d2 | 577 | resp_idx = 0; |
| arturogasca | 1:5ecac6e368d2 | 578 | RESP_SAMPLE_READY = true; |
| arturogasca | 1:5ecac6e368d2 | 579 | } |
| arturogasca | 1:5ecac6e368d2 | 580 | } |
| arturogasca | 1:5ecac6e368d2 | 581 | |
| arturogasca | 1:5ecac6e368d2 | 582 | void getSample_AXIS() |
| arturogasca | 1:5ecac6e368d2 | 583 | { |
| arturogasca | 1:5ecac6e368d2 | 584 | float x, y, z; |
| arturogasca | 1:5ecac6e368d2 | 585 | x = abs(acc.getAccX()); |
| arturogasca | 1:5ecac6e368d2 | 586 | y = abs(acc.getAccY()); |
| arturogasca | 1:5ecac6e368d2 | 587 | z = abs(acc.getAccZ()); |
| arturogasca | 1:5ecac6e368d2 | 588 | |
| arturogasca | 1:5ecac6e368d2 | 589 | axisSamples[axis_idx][0] = x; |
| arturogasca | 1:5ecac6e368d2 | 590 | axisSamples[axis_idx][1] = y; |
| arturogasca | 1:5ecac6e368d2 | 591 | axisSamples[axis_idx][2] = z; |
| arturogasca | 1:5ecac6e368d2 | 592 | |
| arturogasca | 1:5ecac6e368d2 | 593 | axis_idx++; |
| arturogasca | 1:5ecac6e368d2 | 594 | |
| arturogasca | 1:5ecac6e368d2 | 595 | if (axis_idx == MUESTRAS_AXIS) |
| arturogasca | 1:5ecac6e368d2 | 596 | { |
| arturogasca | 1:5ecac6e368d2 | 597 | axis_idx = 0; |
| arturogasca | 1:5ecac6e368d2 | 598 | AXIS_SAMPLE_READY = true; |
| arturogasca | 1:5ecac6e368d2 | 599 | } |
| arturogasca | 1:5ecac6e368d2 | 600 | } |
| arturogasca | 1:5ecac6e368d2 | 601 | |
| arturogasca | 1:5ecac6e368d2 | 602 | void write_ECG_file() |
| arturogasca | 1:5ecac6e368d2 | 603 | { |
| arturogasca | 1:5ecac6e368d2 | 604 | bool response; |
| arturogasca | 1:5ecac6e368d2 | 605 | /*pc.printf("Write ECG file\r\n"); |
| arturogasca | 1:5ecac6e368d2 | 606 | DateTime time = rtcc.now( ); |
| arturogasca | 1:5ecac6e368d2 | 607 | pc.printf("%d:%d:%d,%d/%s/%d\r\n",time.hour( ),time.minute( ),time.second( ), |
| arturogasca | 1:5ecac6e368d2 | 608 | time.day( ),months[time.month( )],time.year()); |
| arturogasca | 1:5ecac6e368d2 | 609 | /*if(true) |
| arturogasca | 1:5ecac6e368d2 | 610 | { |
| arturogasca | 1:5ecac6e368d2 | 611 | fp = fopen(PathECG, "a"); //"a" append |
| arturogasca | 1:5ecac6e368d2 | 612 | if(fp == NULL) |
| arturogasca | 1:5ecac6e368d2 | 613 | { |
| arturogasca | 1:5ecac6e368d2 | 614 | pc.printf("No pude abrir! :(\r\n"); |
| arturogasca | 1:5ecac6e368d2 | 615 | response =false; |
| arturogasca | 1:5ecac6e368d2 | 616 | } |
| arturogasca | 1:5ecac6e368d2 | 617 | else |
| arturogasca | 1:5ecac6e368d2 | 618 | { |
| arturogasca | 1:5ecac6e368d2 | 619 | DateTime time = rtcc.now( ); |
| arturogasca | 1:5ecac6e368d2 | 620 | fprintf(fp,"%d:%d:%d,%d/%s/%d\r\n",time.hour( ),time.minute( ),time.second( ), |
| arturogasca | 1:5ecac6e368d2 | 621 | time.day( ),months[time.month( )],time.year()); |
| arturogasca | 1:5ecac6e368d2 | 622 | |
| arturogasca | 1:5ecac6e368d2 | 623 | for (int i =0; i< MUESTRAS_ECG; i++) |
| arturogasca | 1:5ecac6e368d2 | 624 | { |
| arturogasca | 1:5ecac6e368d2 | 625 | fprintf(fp,"%d",ecgSamples[i]); |
| arturogasca | 1:5ecac6e368d2 | 626 | } |
| arturogasca | 1:5ecac6e368d2 | 627 | |
| arturogasca | 1:5ecac6e368d2 | 628 | pc.printf("Escribi en SD! :D \r\n"); |
| arturogasca | 1:5ecac6e368d2 | 629 | response = true; |
| arturogasca | 1:5ecac6e368d2 | 630 | |
| arturogasca | 1:5ecac6e368d2 | 631 | } |
| arturogasca | 1:5ecac6e368d2 | 632 | fclose(fp); |
| arturogasca | 1:5ecac6e368d2 | 633 | }*/ |
| arturogasca | 1:5ecac6e368d2 | 634 | //return response; |
| arturogasca | 1:5ecac6e368d2 | 635 | |
| arturogasca | 1:5ecac6e368d2 | 636 | } |
| arturogasca | 1:5ecac6e368d2 | 637 | |
| arturogasca | 1:5ecac6e368d2 | 638 | void write_AXIS_file() |
| arturogasca | 1:5ecac6e368d2 | 639 | { |
| arturogasca | 1:5ecac6e368d2 | 640 | bool response; |
| arturogasca | 1:5ecac6e368d2 | 641 | /* pc.printf("Write axis file\r\n"); |
| arturogasca | 1:5ecac6e368d2 | 642 | DateTime time = rtcc.now( ); |
| arturogasca | 1:5ecac6e368d2 | 643 | pc.printf("%d:%d:%d,%d/%s/%d\r\n",time.hour( ),time.minute( ),time.second( ), |
| arturogasca | 1:5ecac6e368d2 | 644 | time.day( ),months[time.month( )],time.year()); |
| arturogasca | 1:5ecac6e368d2 | 645 | /* fp = fopen(PathAxis, "a"); //"a" append |
| arturogasca | 1:5ecac6e368d2 | 646 | if(fp == NULL) |
| arturogasca | 1:5ecac6e368d2 | 647 | { |
| arturogasca | 1:5ecac6e368d2 | 648 | pc.printf("No pude abrir! :(\r\n"); |
| arturogasca | 1:5ecac6e368d2 | 649 | response = false; |
| arturogasca | 1:5ecac6e368d2 | 650 | } |
| arturogasca | 1:5ecac6e368d2 | 651 | else |
| arturogasca | 1:5ecac6e368d2 | 652 | { |
| arturogasca | 1:5ecac6e368d2 | 653 | DateTime time = rtcc.now( ); |
| arturogasca | 1:5ecac6e368d2 | 654 | fprintf(fp,"%d:%d:%d,%d/%s/%d\r\n",time.hour( ),time.minute( ),time.second( ), |
| arturogasca | 1:5ecac6e368d2 | 655 | time.day( ),months[time.month( )],time.year()); |
| arturogasca | 1:5ecac6e368d2 | 656 | |
| arturogasca | 1:5ecac6e368d2 | 657 | for (int i =0; i< MUESTRAS_AXIS; i++) |
| arturogasca | 1:5ecac6e368d2 | 658 | { |
| arturogasca | 1:5ecac6e368d2 | 659 | fprintf(fp,"%1.2f,%1.2f,%1.2f",axisSamples[0][i],axisSamples[1][i],axisSamples[2][i]); |
| arturogasca | 1:5ecac6e368d2 | 660 | } |
| arturogasca | 1:5ecac6e368d2 | 661 | |
| arturogasca | 1:5ecac6e368d2 | 662 | pc.printf("Escribi en SD! :D \r\n"); |
| arturogasca | 1:5ecac6e368d2 | 663 | response = true; |
| arturogasca | 1:5ecac6e368d2 | 664 | } |
| arturogasca | 1:5ecac6e368d2 | 665 | fclose(fp);*/ |
| arturogasca | 1:5ecac6e368d2 | 666 | //return response; |
| arturogasca | 1:5ecac6e368d2 | 667 | } |
| arturogasca | 1:5ecac6e368d2 | 668 | |
| arturogasca | 1:5ecac6e368d2 | 669 | |
| arturogasca | 1:5ecac6e368d2 | 670 | |
| arturogasca | 1:5ecac6e368d2 | 671 | void updateSensors () |
| arturogasca | 1:5ecac6e368d2 | 672 | { |
| AVELARDEV | 0:80ecccd27646 | 673 | // Make sure to call update as fast as possible |
| AVELARDEV | 0:80ecccd27646 | 674 | pox.update(); |
| AVELARDEV | 0:80ecccd27646 | 675 | |
| arturogasca | 1:5ecac6e368d2 | 676 | //<-Get Step Accel |
| arturogasca | 1:5ecac6e368d2 | 677 | |
| arturogasca | 1:5ecac6e368d2 | 678 | if(SampleTime){ |
| arturogasca | 1:5ecac6e368d2 | 679 | //cuando se cumpla el tiempo...obtener 1 muestra y aumentar contador |
| arturogasca | 1:5ecac6e368d2 | 680 | //getSample ECG |
| arturogasca | 1:5ecac6e368d2 | 681 | //getSample Respiracion |
| arturogasca | 1:5ecac6e368d2 | 682 | //getSample Axis |
| AVELARDEV | 0:80ecccd27646 | 683 | |
| arturogasca | 1:5ecac6e368d2 | 684 | getSample_ECG(); |
| arturogasca | 1:5ecac6e368d2 | 685 | getSample_RESP(); |
| arturogasca | 1:5ecac6e368d2 | 686 | getSample_AXIS(); |
| arturogasca | 1:5ecac6e368d2 | 687 | SampleTime = false; |
| arturogasca | 1:5ecac6e368d2 | 688 | } |
| arturogasca | 1:5ecac6e368d2 | 689 | if (ECG_SAMPLE_READY) |
| arturogasca | 1:5ecac6e368d2 | 690 | { |
| arturogasca | 1:5ecac6e368d2 | 691 | ECG_SAMPLE_READY = false; |
| arturogasca | 1:5ecac6e368d2 | 692 | write_ECG_file(); |
| arturogasca | 1:5ecac6e368d2 | 693 | //escribir todas las muestras en SD y borrar contador |
| arturogasca | 1:5ecac6e368d2 | 694 | } |
| arturogasca | 1:5ecac6e368d2 | 695 | if (AXIS_SAMPLE_READY) |
| arturogasca | 1:5ecac6e368d2 | 696 | { |
| arturogasca | 1:5ecac6e368d2 | 697 | AXIS_SAMPLE_READY = false; |
| arturogasca | 1:5ecac6e368d2 | 698 | write_AXIS_file(); |
| arturogasca | 1:5ecac6e368d2 | 699 | //escribir todas las muestras en SD y borrar contador |
| arturogasca | 1:5ecac6e368d2 | 700 | } |
| arturogasca | 1:5ecac6e368d2 | 701 | if (RESP_SAMPLE_READY); |
| arturogasca | 1:5ecac6e368d2 | 702 | { |
| arturogasca | 1:5ecac6e368d2 | 703 | RESP_SAMPLE_READY = false; |
| arturogasca | 1:5ecac6e368d2 | 704 | //Analisis de datos para deteccion de picos |
| arturogasca | 1:5ecac6e368d2 | 705 | //escribir todas lasmuestras en SD y borrar contador |
| arturogasca | 1:5ecac6e368d2 | 706 | } |
| arturogasca | 1:5ecac6e368d2 | 707 | if (UpdateSeconds >= UPDATE_TIME) { //Si ya paso el tiempo definido en UPDATE_TIME |
| arturogasca | 1:5ecac6e368d2 | 708 | getOxi(); |
| arturogasca | 1:5ecac6e368d2 | 709 | getTemp(); |
| arturogasca | 1:5ecac6e368d2 | 710 | UpdateSeconds = 0; |
| arturogasca | 1:5ecac6e368d2 | 711 | } |
| arturogasca | 1:5ecac6e368d2 | 712 | if (RegisterSeconds >= REGISTER_TIME) { //Si ya paso el tiempo definido en REGISTER_TIME |
| AVELARDEV | 0:80ecccd27646 | 713 | |
| arturogasca | 1:5ecac6e368d2 | 714 | registraSensores(); |
| arturogasca | 1:5ecac6e368d2 | 715 | RegisterSeconds = 0; |
| AVELARDEV | 0:80ecccd27646 | 716 | } |
| AVELARDEV | 0:80ecccd27646 | 717 | } |
Arturo Gasca
