Version beta

Dependencies:   BLE_API Definiciones Funciones HeartRate_ Hotboards_rtcc LM_35 MAX_30100 MMA8451Q Pines SDFileSystem mbed nRF51822

Fork of MAX30100_oxullo by Eduardo Avelar

Files at this revision

API Documentation at this revision

Comitter:
arturogasca
Date:
Thu Jan 19 20:26:20 2017 +0000
Parent:
0:80ecccd27646
Commit message:
Version beta para equipos biometricos

Changed in this revision

BLE_API.lib Show annotated file Show diff for this revision Revisions of this file
Definiciones.lib Show annotated file Show diff for this revision Revisions of this file
Funciones.lib Show annotated file Show diff for this revision Revisions of this file
HeartRate.lib Show annotated file Show diff for this revision Revisions of this file
Hotboards_rtcc.lib Show annotated file Show diff for this revision Revisions of this file
LM35.lib Show annotated file Show diff for this revision Revisions of this file
MAX30100.lib Show annotated file Show diff for this revision Revisions of this file
MMA8451Q.lib Show annotated file Show diff for this revision Revisions of this file
Pines.lib Show annotated file Show diff for this revision Revisions of this file
SDFileSystem.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
nRF51822.lib Show annotated file Show diff for this revision Revisions of this file
diff -r 80ecccd27646 -r 5ecac6e368d2 BLE_API.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/BLE_API.lib	Thu Jan 19 20:26:20 2017 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/teams/Bluetooth-Low-Energy/code/BLE_API/#d494ad3e87bd
diff -r 80ecccd27646 -r 5ecac6e368d2 Definiciones.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Definiciones.lib	Thu Jan 19 20:26:20 2017 +0000
@@ -0,0 +1,1 @@
+https://developer.mbed.org/users/arturogasca/code/Definiciones/#0e0eedacd26a
diff -r 80ecccd27646 -r 5ecac6e368d2 Funciones.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Funciones.lib	Thu Jan 19 20:26:20 2017 +0000
@@ -0,0 +1,1 @@
+https://developer.mbed.org/users/arturogasca/code/Funciones/#d79b3f331e5d
diff -r 80ecccd27646 -r 5ecac6e368d2 HeartRate.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HeartRate.lib	Thu Jan 19 20:26:20 2017 +0000
@@ -0,0 +1,1 @@
+https://developer.mbed.org/users/arturogasca/code/HeartRate_/#c55e03357261
diff -r 80ecccd27646 -r 5ecac6e368d2 Hotboards_rtcc.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Hotboards_rtcc.lib	Thu Jan 19 20:26:20 2017 +0000
@@ -0,0 +1,1 @@
+https://developer.mbed.org/users/Hotboards/code/Hotboards_rtcc/#0790bcaf8b8f
diff -r 80ecccd27646 -r 5ecac6e368d2 LM35.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/LM35.lib	Thu Jan 19 20:26:20 2017 +0000
@@ -0,0 +1,1 @@
+https://developer.mbed.org/users/arturogasca/code/LM_35/#7110e63db2ad
diff -r 80ecccd27646 -r 5ecac6e368d2 MAX30100.lib
--- a/MAX30100.lib	Fri Nov 25 00:54:29 2016 +0000
+++ b/MAX30100.lib	Thu Jan 19 20:26:20 2017 +0000
@@ -1,1 +1,1 @@
-https://developer.mbed.org/users/AVELARDEV/code/MAX30100/#010b908e2187
+https://developer.mbed.org/users/arturogasca/code/MAX_30100/#d2f34f52b229
diff -r 80ecccd27646 -r 5ecac6e368d2 MMA8451Q.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MMA8451Q.lib	Thu Jan 19 20:26:20 2017 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/emilmont/code/MMA8451Q/#c4d879a39775
diff -r 80ecccd27646 -r 5ecac6e368d2 Pines.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Pines.lib	Thu Jan 19 20:26:20 2017 +0000
@@ -0,0 +1,1 @@
+https://developer.mbed.org/users/arturogasca/code/Pines/#bbc247325462
diff -r 80ecccd27646 -r 5ecac6e368d2 SDFileSystem.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SDFileSystem.lib	Thu Jan 19 20:26:20 2017 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/SDFileSystem/#8db0d3b02cec
diff -r 80ecccd27646 -r 5ecac6e368d2 main.cpp
--- a/main.cpp	Fri Nov 25 00:54:29 2016 +0000
+++ b/main.cpp	Thu Jan 19 20:26:20 2017 +0000
@@ -1,127 +1,717 @@
-/*
-Arduino-MAX30100 oximetry / heart rate integrated sensor library
-Copyright (C) 2016  OXullo Intersecans <x@brainrapers.org>
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
+#include "mbed.h"
+#include "pines.h"
+#include "ble/BLE.h"
+#include "ble/services/UARTService.h"
+#include "MMA8451Q.h"
+#include "MAX30100_PulseOximeter.h"
+#include "SDFileSystem.h"
+#include "LM35.h"
+#include "Hotboards_rtcc.h"
+#include "HeartRate.h"
+
+
+//////////////////////////////Definiciones BLE
+
+#define WAIT_CONECTION_TIMEOUT 20
+const char  *bleName = "BIOMETRICOS";
+BLEDevice  ble;
+UARTService *uartServicePtr;
+bool BLE_DATA_AVAILABLE = false;
+bool BLE_AVAILABLE =true;
+bool BLE_TIMEOUT = true;
+int BleSeconds = 0;
+uint8_t datosBle[20];
+
+
+#define NEED_CONSOLE_OUTPUT 1  /* Set this if you need debug messages on the console;
+                               * it will have an impact on code-size and power consumption. */
+#if NEED_CONSOLE_OUTPUT
+#define DEBUG(STR) { if (uartServicePtr) uartServicePtr->write(STR, strlen(STR)); }
+#else
+#define DEBUG(...) /* nothing */
+#endif /* #if NEED_CONSOLE_OUTPUT */
+
+
+///////////////////////////Definiciones para RTC
+
+const char *week[] = {"Domingo", "Lunes", "Martes", "Miercoles", "Jueves", "Viernes", "Sabado"};//days of the week
+const char *months[] = {"ENE","FEB","MAR","ABR","MAY","JUN", "JUL", "AGO","SEP","OCT","NOV","DIC"};//months of the year
+I2C device(I2C_SDA,I2C_SCL); //sda scl
+Hotboards_rtcc rtcc(device);
+
+
+//////////////////Variables de sensores para almacenamiento / envio
+
+float       Temperatura;
+float       RitmoCardiaco;
+uint16_t    Oxigeno;
+uint16_t    Pasos;
+
+///////////////////////Definicion para Sensor de temperatura
 
-#include "MAX30100_PulseOximeter.h"
+LM35 SensorTemp(PIN_ADC1); //PIN_ADC
+
+//////////////////////Definicion para Thermistor
+
+AnalogIn thermistor(PIN_ADC2);
+
+///////////////////////////////////////Definicion de SD
+
+SDFileSystem sd(MOSI,MISO,SCLK,CS, "sd"); // // mosi, miso, sclk, cs, name
+const char* PathSensores = "/sd/LogSensores/sensores.txt";
+const char* PathECG = "/sd/LogSensores/ECG.txt";
+const char* PathAxis = "/sd/LogSensores/Axis.txt";
+bool archivo = true;
+
+
+//////////////////////////Definicion de tiempos
+
+#define REGISTER_TIME   30
+#define UPDATE_TIME     1
+int RegisterSeconds = 0;
+int UpdateSeconds = 0;
+bool SampleTime = false;
+//Ticker t1;
+//Ticker t2;
+
 
-//#define REPORTING_PERIOD_MS     1000
+/////////////////////////Definicion de sensor ECG
+
+#define MUESTRAS_ECG 100
+bool ECG_SAMPLE_READY = false;
+int ecg_idx = 0;
+unsigned short ecgSamples[MUESTRAS_ECG];
+float ecgSamples_f[MUESTRAS_ECG];
+HeartRate HR(ECG_OUT, ECG_LO_PLS, ECG_LO_MIN);
+
+////////////////////Definicion de sensor RESPIRACION
 
-Serial pc(USBTX, USBRX);
-Timer t;
+#define MUESTRAS_RESP 100
+bool RESP_SAMPLE_READY = false;
+int resp_idx = 0;
+unsigned short respSamples[MUESTRAS_RESP];
+float respSamples_f[MUESTRAS_RESP];
+
+////////////////////Definicion de muestras ACELEROMETRO
+#define MMA8451_I2C_ADDRESS (0x1d<<1)
+MMA8451Q acc(I2C_SDA, I2C_SCL, MMA8451_I2C_ADDRESS);
+
+#define MUESTRAS_AXIS 100
+bool AXIS_SAMPLE_READY = false;
+int axis_idx = 0;
+float axisSamples[MUESTRAS_AXIS][3]; //100 muestras, 3 ejes
+//float axisSamples_f[MUESTRAS_axis];
+
 
 // PulseOximeter is the higher level interface to the sensor
 // it offers:
 //  * beat detection reporting
 //  * heart rate calculation
 //  * SpO2 (oxidation level) calculation
-PulseOximeter pox;
-
-uint32_t tsLastReport = 0;
-
-// Callback (registered below) fired when a pulse is detected
-
-void onBeatDetected()
-{
- //   pc.printf("Beat!\r\n");
-}
 
-bool setup()
-{
-    pc.baud(115200);
-    pc.printf("Start program!\r\n");
-    //pox = new PulseOximeter (&pc);
-    
-    // Initialize the PulseOximeter instance and register a beat-detected callback
-    if(!pox.begin())
-        return false;
-    pox.setOnBeatDetectedCallback(onBeatDetected);
-    return true;
-}
+///////////////////////////Definiciones  para sensor OXIMETRIA
+
+PulseOximeter pox;
 
 bool newValueMAX30100 = 0;
 float heartRate;
 float finalHeartRate;
 uint8_t sp02;
 uint16_t finalSp02;
-uint32_t REPORTING_PERIOD_MS = 1000;
 std::vector<float> valuesHeartRate;
 std::vector<uint8_t> valuesSp02;
+
+uint32_t REPORTING_PERIOD_MS = 1000;
 uint8_t samplesMAX30100 = 10;
 uint8_t counterMAX30100 = 0;;
+/////////////////////////////////////////////////////////////////
 
-void updateMAX30100 (){
+Serial pc(SERIAL_TX, SERIAL_RX);
+
+DigitalOut led1(LED_R);
+DigitalOut led2(LED_N);
+
+
+
+
+
+
+FILE *fp;
+
+
+
+
+/////////////////////////////////////////////////////////////////////////////////////
+
+
+//////////////Declaracion de funciones/////////////////////////
+void onBeatDetected();
+void CadaSegundo() ;
+void TiempoSample();
+bool inicia_sd();
+bool setup();
+void do_remove(const char *fsrc);
+void getOxi();
+void getTemp();
+void registraSamples();
+void registraSensores();
+void getSample_ECG();
+void getSample_RESP();
+void getSample_AXIS();
+void write_ECG_file();
+void write_AXIS_file();
+void updateSensors ();
+
+
+
+
+/////////////////////////////////////////////////////
+
+
+
+
+void waitEvent()
+{
+    if(BLE_DATA_AVAILABLE)
+    {
+        BLE_DATA_AVAILABLE = false;
+        
+        switch(datosBle[0])
+        {
+            case '1':   DEBUG("Recibi 1\r\n");
+            {
+                break;
+            }
+            case '2':   DEBUG("Recibi 2\r\n");
+            {
+                break;
+            }
+            case '3':   DEBUG("Recibi 3\r\n");
+            {
+                break;
+            }
+            case '4':   DEBUG("Recibi 4\r\n");
+            {
+                break;
+            }
+        }
+        
+    }
+}
+
+
+
+void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
+{
+    led2=0;
+    ble.startAdvertising();
+    BLE_AVAILABLE = false;
+}
+void connectionCallback(const Gap::ConnectionCallbackParams_t *params)
+{
+    BLE_TIMEOUT = false;
+    led2=1;
+}
+
+
+void onDataWritten(const GattWriteCallbackParams *params)
+{
+    if ((uartServicePtr != NULL) && (params->handle == uartServicePtr->getTXCharacteristicHandle())) {
+        uint16_t bytesRead = params->len;
+        pc.printf("received %u bytes\r\n", bytesRead);    
+        
+        for(int i=0;i<bytesRead;i++){
+            
+            datosBle[i] = params->data[i];
+            
+        }
+        BLE_DATA_AVAILABLE = true;    
+    }
+}
+
+
+/*
+void inicia_ble()
+{
+    t1.attach(&CadaSegundo,1);
+    t2.attach(&TiempoSample,0.01);
+    pc.printf("Initialising the nRF51822\n\r");
+    ble.init();
+    ble.onDisconnection(disconnectionCallback);
+    ble.onDataWritten(onDataWritten);
+
+    /// setup advertising 
+    ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED);
+    ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
+    ble.accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME,
+                                     (const uint8_t *)bleName, strlen(bleName));
+    ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS,
+                                     (const uint8_t *)UARTServiceUUID_reversed, sizeof(UARTServiceUUID_reversed));
+
+    ble.setAdvertisingInterval(160); // 100ms; in multiples of 0.625ms. 
+    ble.startAdvertising();
+
+    UARTService uartService(ble);
+    uartServicePtr = &uartService;
+    
+}
+*/
+
+void blink1(int times1, float wait1)
+{
+    for(int b =0; b< times1; b++)
+    {
+        led1= 1;
+        wait(wait1);
+        led1 =0 ;
+        wait(wait1);
+    }
+}
+void blink2(int times2, float wait2)
+{
+    for(int a =0; a< times2; a++)
+    {
+        led2= 1;
+        wait(wait2);
+        led2 =0 ;
+        wait(wait2);
+    }
+}
+
+
+
+/////////////////////////////////////////////////////////////////////////////////////
+
+
+int main()
+{
+    
+    pc.printf("Inicio main\n\r");
+    blink1(4,0.1);
+    blink2(8,0.2);
+  
+    //t1.attach(&CadaSegundo,1);
+    //t2.attach(&TiempoSample,0.01);
+    
+    pc.printf("Initialising the nRF51822\n\r");
+    ble.init();
+    ble.onDisconnection(disconnectionCallback);
+    ble.onConnection(connectionCallback);
+    ble.onDataWritten(onDataWritten);
+
+     //setup advertising 
+    ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED);
+    ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
+    ble.accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME,
+                                     (const uint8_t *)bleName, strlen(bleName));
+    ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS,
+                                     (const uint8_t *)UARTServiceUUID_reversed, sizeof(UARTServiceUUID_reversed));
+
+    ble.setAdvertisingInterval(160); // 100ms; in multiples of 0.625ms.
+    ble.startAdvertising();
+
+    UARTService uartService(ble);
+    uartServicePtr = &uartService;
+    
+  
+  
+    
+    //inicia_ble();
+    
+    if(setup())
+        pc.printf("Sensores Inicializados\r\n");
+    else
+        pc.printf("Error en inicializacion\r\n");
+    
+    
+    pc.printf("Inicio del programa\r\n");
+    
+    while(BLE_AVAILABLE)
+    {
+        ble.waitForEvent();
+        waitEvent();
+    }
+    
+    while(1) {
+        updateSensors();   
+        led1 = !led1;
+        wait(0.2); 
+    }
+
+
+}
+
+
+
+
+
+
+
+// Callback (registered below) fired when a pulse is detected
+
+void onBeatDetected()
+{
+//   pc.printf("Beat!\r\n");
+}
+
+void CadaSegundo() //Aumenta dos contadores cada segundo para registro y actualizacion
+{
+    RegisterSeconds++;
+    UpdateSeconds++;
+    if(BLE_TIMEOUT){
+        BleSeconds++;
+        pc.printf("timeout: %d\r\n",BleSeconds);
+        if(BleSeconds == WAIT_CONECTION_TIMEOUT){
+            BLE_AVAILABLE = false;
+            BLE_TIMEOUT = false;
+        }
+        
+    }
+        
+}
+void TiempoSample() //Timer para samples de Ritmocardiaco,Respiracion y acelerometro
+{
+    SampleTime = true;
+}
+bool inicia_sd()
+{  
+    bool response;
+    
+  /*  fp = fopen(PathSensores, "a"); //Intento abrir el archivo... "append"
+    if(fp == NULL) {
+        pc.printf("No pude abrir el archivo\r\n");
+        archivo = false;     //no existe el archivo 
+    }
+    else
+    {
+        fprintf(fp, "Dispositivo reiniciado : \r\n"); //Fue un reinicio, solo se logea
+        pc.printf("Si existe un archivo\n");
+        response = true;
+    }
+    fclose(fp); 
+    
+    if (!archivo)
+    {
+        pc.printf("Creando Carpeta de Logs\r\n");
+        mkdir("/sd/LogSensores", 0777);
+        fp = fopen(PathSensores, "w");
+        if(fp == NULL) 
+        {
+            pc.printf("No pude abrir el archivo log %s\r\n",PathSensores); 
+            response = false;    
+        }
+        else
+        {
+            fprintf(fp, "LOG %s creado:\r\n",PathSensores);
+            pc.printf("Archivo %s creado por primera vez!\r\n",PathSensores);
+            fclose(fp);
+            wait(0.2);
+            fp = fopen(PathECG, "w");
+            
+            if(fp == NULL){
+                pc.printf("No pude abrir el archivo log %s\r\n",PathECG); 
+                response = false; 
+            }
+            else
+            {
+                fprintf(fp, "LOG %s creado:\r\n",PathECG);
+                pc.printf("Archivo %s creado por primera vez!\r\n",PathECG);
+                fclose(fp);
+                
+                wait(0.2);
+                fp = fopen(PathAxis, "w");
+                if(fp == NULL){
+                    pc.printf("No pude abrir el archivo log %s\r\n",PathAxis);
+                    response = false;  
+                }
+                else
+                {
+                    fprintf(fp, "LOG %s creado:\r\n",PathAxis);
+                    pc.printf("Archivo %s creado por primera vez!\r\n",PathAxis);
+                    response = true; 
+                } 
+            } 
+            fclose(fp); 
+        } 
+        
+    }*/
+    return response;
+}
+
+bool setup()
+{
+    
+    pc.printf("Start program!\r\n");
+
+    //incializacion SD y archivos de log
+    inicia_sd();
+    rtcc.begin();
+    /* set the time (12:30:00) and date 28/nov/2016 */
+   // rtcc.adjust( DateTime( 2016, 10, 28, 12, 30, 0) ); //year,month,day,hour,min, sec,dow
+
+
+    // Initialize the PulseOximeter instance and register a beat-detected callback
+    if(!pox.begin())
+        return false;
+    pox.setOnBeatDetectedCallback(onBeatDetected);
+    return true;
+}
+void do_remove(const char *fsrc)
+{
+    DIR *d = opendir(fsrc);
+    struct dirent *p;
+    char path[30] = {0};
+    while((p = readdir(d)) != NULL) {
+        strcpy(path, fsrc);
+        strcat(path, "/");
+        strcat(path, p->d_name);
+        remove(path);
+    }
+    closedir(d);
+    remove(fsrc);
+}
+
+void getOxi()
+{
+    heartRate = pox.getHeartRate();
+    sp02 = pox.getSpO2();
+
+    if(heartRate != 0 && sp02 != 0) {
+        pc.printf("Heart rate: %f",heartRate);
+        pc.printf("   bpm / SpO2: %d%\r\n",sp02);
+        valuesHeartRate.push_back(heartRate);
+        valuesSp02.push_back(sp02);
+        counterMAX30100 ++;
+    } else {
+        pc.printf("Valor Oximetria cero\r\n");
+        Oxigeno = 0;
+        RitmoCardiaco = 0.00;
+        pc.printf("No finger\r\n");
+    }
+    if(samplesMAX30100 == counterMAX30100) {
+
+        finalHeartRate = 0;
+        finalSp02 = 0;
+        for(int i=0; i<samplesMAX30100; i++) {
+            finalHeartRate += valuesHeartRate[i];
+            finalSp02 += valuesSp02[i];
+        }
+
+        finalHeartRate /= samplesMAX30100;
+        finalSp02 /= samplesMAX30100;
+
+        counterMAX30100 = 0;
+        valuesHeartRate.clear();
+        valuesSp02.clear();
+        newValueMAX30100 = true;
+    }
+
+    if(newValueMAX30100) {
+        pc.printf("Valor Oximetria valido\r\n");
+        newValueMAX30100 = false;
+        RitmoCardiaco = finalHeartRate;
+        Oxigeno = finalSp02;
+    } 
+}
+
+
+void getTemp()
+{
+    Temperatura = SensorTemp.get();
+}
+
+
+void registraSamples()
+{
+    //return(true);
+}
+
+void registraSensores()
+{
+   /* pc.printf("Write sensors file\r\n");
+    DateTime time = rtcc.now( );
+    pc.printf("%d:%d:%d,%d/%s/%d\r\n",time.hour( ),time.minute( ),time.second( ),
+                time.day( ),months[time.month( )],time.year());
+    /*fp = fopen("/sd/LogSensores/sensores.txt", "a"); //"a" append
+    if(fp == NULL) {
+        pc.printf("No pude abrir! :(\r\n");
+        return(false);
+    } else {
+        DateTime time = rtcc.now( );
+        fprintf(fp,"T=%.2f,O=%d,RC=%.2f,P=%d,",Temperatura,Oxigeno,RitmoCardiaco,Pasos);
+        fprintf(fp,"H=%d:%d:%d,F=%d/%s/%d\r\n",time.hour( ),time.minute( ),time.second( ),
+                time.day( ),months[time.month( )],time.year());
+        fclose(fp);
+
+        pc.printf("Escribi en SD! :D \r\n");
+        pc.printf("T=%.2f,O=%d,RC=%.2f,P=%d,",Temperatura,Oxigeno,RitmoCardiaco,Pasos);
+        pc.printf("H=%d:%d:%d,F=%d/%s/%d\r\n",time.hour( ),time.minute( ),time.second( ),
+                time.day( ),months[time.month( )],time.year());
+        return(true);
+    }*/
+}
+void getSample_ECG()
+{
+    if(HR.available())
+    {
+        ecgSamples[ecg_idx++] = HR.read();
+    }
+    else
+    {
+        ecgSamples[ecg_idx++] = 0;
+    }
+    if(ecg_idx == MUESTRAS_ECG)
+    {
+        ecg_idx =0;
+        ECG_SAMPLE_READY = true;
+    }
+    
+}
+
+void getSample_RESP()
+{
+    respSamples[resp_idx++] = thermistor.read_u16();
+    
+    if (resp_idx == MUESTRAS_RESP)
+    {
+        resp_idx = 0;
+        RESP_SAMPLE_READY = true;
+    }
+}
+
+void getSample_AXIS()
+{
+    float x, y, z;
+    x = abs(acc.getAccX());
+    y = abs(acc.getAccY());
+    z = abs(acc.getAccZ());
+    
+    axisSamples[axis_idx][0] = x;
+    axisSamples[axis_idx][1] = y;
+    axisSamples[axis_idx][2] = z;
+    
+    axis_idx++;
+    
+    if (axis_idx == MUESTRAS_AXIS)
+    {
+        axis_idx = 0;
+        AXIS_SAMPLE_READY = true;
+    }
+}
+
+void write_ECG_file()
+{
+   bool response;
+   /*pc.printf("Write ECG file\r\n");
+   DateTime time = rtcc.now( );
+    pc.printf("%d:%d:%d,%d/%s/%d\r\n",time.hour( ),time.minute( ),time.second( ),
+                time.day( ),months[time.month( )],time.year());
+    /*if(true)
+    {
+        fp = fopen(PathECG, "a"); //"a" append
+        if(fp == NULL) 
+        {
+            pc.printf("No pude abrir! :(\r\n");
+            response =false;
+        } 
+        else 
+        { 
+            DateTime time = rtcc.now( );
+            fprintf(fp,"%d:%d:%d,%d/%s/%d\r\n",time.hour( ),time.minute( ),time.second( ),
+                    time.day( ),months[time.month( )],time.year());
+            
+            for (int i =0; i< MUESTRAS_ECG; i++)
+            {
+                fprintf(fp,"%d",ecgSamples[i]);
+            }
+        
+            pc.printf("Escribi en SD! :D \r\n");
+            response = true;
+            
+        }
+        fclose(fp);
+    }*/
+    //return response;
+    
+}
+
+void write_AXIS_file()
+{
+    bool response;
+   /* pc.printf("Write axis file\r\n");
+    DateTime time = rtcc.now( );
+    pc.printf("%d:%d:%d,%d/%s/%d\r\n",time.hour( ),time.minute( ),time.second( ),
+                time.day( ),months[time.month( )],time.year());
+   /* fp = fopen(PathAxis, "a"); //"a" append
+    if(fp == NULL) 
+    {
+        pc.printf("No pude abrir! :(\r\n");
+        response = false;
+    } 
+    else 
+    { 
+        DateTime time = rtcc.now( );
+        fprintf(fp,"%d:%d:%d,%d/%s/%d\r\n",time.hour( ),time.minute( ),time.second( ),
+                time.day( ),months[time.month( )],time.year());
+        
+        for (int i =0; i< MUESTRAS_AXIS; i++)
+        {  
+            fprintf(fp,"%1.2f,%1.2f,%1.2f",axisSamples[0][i],axisSamples[1][i],axisSamples[2][i]);
+        }
+    
+        pc.printf("Escribi en SD! :D \r\n");
+        response = true;
+    }
+    fclose(fp);*/
+    //return response;
+}
+
+
+
+void updateSensors ()
+{
     // Make sure to call update as fast as possible
     pox.update();
     
-    if (t.read_ms() > REPORTING_PERIOD_MS) {
-        heartRate = pox.getHeartRate();
-        sp02 = pox.getSpO2();
-        
-        if(heartRate != 0 && sp02 != 0) {
-            pc.printf("Heart rate: %f",heartRate);
-            pc.printf("   bpm / SpO2: %d%\r\n",sp02);
-            valuesHeartRate.push_back(heartRate);
-            valuesSp02.push_back(sp02);
-            counterMAX30100 ++;
-        }else{
-            pc.printf("No finger\r\n");
-        }
+    //<-Get Step Accel
+
+    if(SampleTime){ 
+        //cuando se cumpla el tiempo...obtener 1 muestra y aumentar contador
+        //getSample ECG
+        //getSample Respiracion
+        //getSample Axis
         
-        if(samplesMAX30100 == counterMAX30100) {
-            
-            finalHeartRate = 0;
-            finalSp02 = 0;
-            for(int i=0; i<samplesMAX30100; i++){
-                finalHeartRate += valuesHeartRate[i];
-                finalSp02 += valuesSp02[i];        
-            }
-            
-            finalHeartRate /= samplesMAX30100;
-            finalSp02 /= samplesMAX30100;
-            
-            counterMAX30100 = 0;
-            valuesHeartRate.clear();
-            valuesSp02.clear();
-            newValueMAX30100 = true;
-        }
-        
-        t.reset();
-    }         
-}
+        getSample_ECG();
+        getSample_RESP();
+        getSample_AXIS();   
+        SampleTime = false;
+    }
+    if (ECG_SAMPLE_READY)
+    {
+        ECG_SAMPLE_READY = false;
+        write_ECG_file();
+        //escribir todas las muestras en SD y borrar contador
+    }
+    if (AXIS_SAMPLE_READY)
+    {
+        AXIS_SAMPLE_READY = false;
+        write_AXIS_file();
+        //escribir todas las muestras en SD y borrar contador
+    }
+    if (RESP_SAMPLE_READY);
+    {
+        RESP_SAMPLE_READY = false;
+        //Analisis de datos para deteccion de picos
+        //escribir todas lasmuestras en SD y borrar contador
+    }  
+    if (UpdateSeconds >= UPDATE_TIME) { //Si ya paso el tiempo definido en UPDATE_TIME
+        getOxi();
+        getTemp();
+        UpdateSeconds = 0;
+    }
+    if (RegisterSeconds >= REGISTER_TIME) { //Si ya paso el tiempo definido en REGISTER_TIME
 
-void loop()
-{
-    updateMAX30100();
-    
-    if(newValueMAX30100){
-        pc.printf("--->New Value\r\n");
-        pc.printf("Heart rate: %f",finalHeartRate);
-        pc.printf("   bpm / SpO2: %d%\r\n",finalSp02);
-        pc.printf("*************************\r\n");
-        newValueMAX30100 = false;  
+        registraSensores();
+        RegisterSeconds = 0;
     }
-       
-}
-
-int main()
-{
-    if(setup())
-        pc.printf("MAX30100 beginning\r\n");
-    else
-        return 0;
-    
-    t.start();    
-    while(1)
-        loop();   
 }
\ No newline at end of file
diff -r 80ecccd27646 -r 5ecac6e368d2 nRF51822.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nRF51822.lib	Thu Jan 19 20:26:20 2017 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/teams/Nordic-Semiconductor/code/nRF51822/#088f5738bf18