une 30aine passés sans pb entre les trames
Dependencies: ADS1015 ARNSRS_SENSORS DmTftLibrary MS5803_14BA SDFileSystem mbed
Fork of ARNSRS_SERVOS_USB_TFT by
Diff: main.cpp
- Revision:
- 5:e1d0dc7940a6
- Parent:
- 4:d84250f67dec
- Child:
- 6:1c2212891714
--- a/main.cpp Mon May 01 13:33:54 2017 +0000 +++ b/main.cpp Wed May 03 08:12:47 2017 +0000 @@ -12,191 +12,45 @@ #include "mbed.h" -#include <string> -#include "MS5803_14BA.h" -#include "Adafruit_ADS1015.h" +#include "SDFileSystem.h" +#include "ARNSRS_SENSORS.h" + +//Init de la lib ARNSRS; +ARNSRS arnsrs; + +//Bouton et led de la carte +DigitalIn mybutton(USER_BUTTON); +DigitalOut myled(LED1); -#ifdef TARGET_K64F -#define SPI_SCK PTD1 -#define SPI_MOSI PTD2 -#define SPI_MISO PTD3 -#define SPI_CS PTD0 -#define I2C_SDA PTE25 -#define I2C_SCL PTE24 -#elif defined(TARGET_KL25Z) -#define SPI_SCK PTD1 -#define SPI_MOSI PTD2 -#define SPI_MISO PTD3 -#define SPI_CS PTD0 -#define I2C_SDA PTE0 -#define I2C_SCL PTE1 -#endif +//RTC +time_t seconds; + +//SD card +SDFileSystem sd(D11, D12, D13, D10, "sd"); // MOSI, MISO, SCK, CS +FILE *fp; + +//Quelque FLAG... +bool FLAG_SIMPLE_TIME = false; //COM Série -Serial serialCozir (PA_11,PA_12,9600); -Serial serialMonit (USBTX,USBRX,9600); - -//Buffer pour Cozir -char reponse[20]; -//Init ADS1015 -I2C i2c(D14, D15); -Adafruit_ADS1015 ads(&i2c, 0x48); -//Variables pour PPO2 -int16_t valeurO2_01 = 0; -int16_t valeurO2_02 = 0; -// pin d2 pour Adc_AlerRdy (fil bleu) : démarre et arrete l'ADC pour sauver l'energie -int Adc_AlerRdy = 2; -float calibO2 = 0; -float gainAmpli = 128.0F; // ADS1115 @ +0,256V gain (16-bit results) gain de l'ampli de l'ADS -//Init MS5803 -MS5803_14BA ps(D14, D15, MS5803_ADDRC_L, D1_OSR_4096, D2_OSR_4096); // SDA, SCL, I2C_address (0x76 or 0x77 look at MS5803.h) - -/////////////////////////////////// -// fonction de lecture capteur///// -/////////////////////////////////// -int request(char commande) -{ - int index=0; - char ch = ' ';; - int valeurCommande; - -// interrogation capteur - do { - if (serialCozir.writeable()) { - serialCozir.putc(commande); - serialCozir.putc('\r'); - serialCozir.putc('\n'); - } - - while (!serialCozir.readable()) {} - ch = serialCozir.getc(); - } - - while ( ch != commande); - -// attente réponse capteur -// le format de la reponse est : Z xxxxx z yyyyy\r\n -// c'est uniquement xxxxx qui nous interesse - - do { - if (serialCozir.readable()) { - ch = serialCozir.getc(); // on a reçu Z, on continue de lire la valeur qui suit en stockant caractère par caractère dans une chaine - if (index<20) // index <n b de digits max attendus ? (test pour ne pas depasser la capacité du buffer) - reponse[index++]=ch; // on stocke le caractere reçu et on passe au suivant - } - } while (ch!='\n'); // on s'arrete de lire quand on a recu le retour à la ligne \n de la réponse - -//reponse[index++]='\x0'; // mettre un zero à la fin de la reponse - sscanf (reponse,"%5d\r\n",&valeurCommande); // on extrait le int de la chaine et on le stocke à l'adresse où pointe valeurCO2 - return valeurCommande; -} - - -////////////////////////////////////// -// fonction communication capteur///// -// on peut envoyer des ordres avec /// -// plusieurs digits comme A 32 /// -////////////////////////////////////// -int cozirSend(string commande) -{ - +Serial serialMonit (USBTX,USBRX,9600); //Serial 2 - int index=0; - char ch = ' ';; - int reponseCommande; - int nbDigits = commande.size(); - - commande[nbDigits]='\x0'; // on matérialise la fin de la chaine avc '\x0' - -// interrogation capteur - do { - if (serialCozir.writeable()) { - for (int j=0; j<nbDigits; j++) { - serialCozir.putc(commande[j]); - //serialMonit.printf(" commande digit %i sur %i => %c\r\n",j,nbDigits-1,commande[j]); // pour le debug - } - serialCozir.putc('\r'); - serialCozir.putc('\n'); - } - - while (!serialCozir.readable()) {}; - ch = serialCozir.getc(); - } - - while ( ch != commande[0]); // le format de la réponse reprend la première lettre de l'ordre - -// attente réponse capteur -// exemple pour co2 : le format de la reponse est Z xxxxx z yyyyy\r\n -// c'est uniquement xxxxx qui nous interesse +//Variable des capteurs +int co2, ppO2; +float pression, Temp1, Temp2, Humi; +string DateHeure; - do { - if (serialCozir.readable()) { - ch = serialCozir.getc(); // on a reçu Z, on continue de lire la valeur qui suit en stockant caractère par caractère dans une chaine - if (index<8) // index <n b de digits max attendus (les autres ne nous interessent pas) - reponse[index++]=ch; // on stocke le caractere reçu et on passe au suivant - } - } while (ch!='\n'); // on s'arrete de lire quand on a recu le retour à la ligne \n de la réponse - -//reponse[index++]='\x0'; // mettre un zero à la fin de la reponse - sscanf (reponse,"%5d\r\n",&reponseCommande); // on extrait le int de la chaine et on le stocke à l'adresse où pointe valeurCommande -//serialMonit.printf(" reponse recue => %5d\r\n",reponseCommande); // pour le debug - - return reponseCommande; -} - -//////////////////////// -// Lecture PPO2 ///// -//////////////////////// -int requestPpO2() -{ - - int result3; - //lecture des deux cellules O2 et P de la carte AQL - - //digitalWrite (Adc_AlerRdy, HIGH); // si le fil a été connecté à la carte (permet d'économiser l'énergie) - sur la carte 2014, il est à la masse donc pas utilisé - wait_ms(100); // mettre la pin AlertRdy à 1 pour lancer conversion ADC - valeurO2_01 = ads.readADC_Differential_0_1(); // lecture tension entre bornes cell O2 nmr1 - wait_ms(50); - valeurO2_02 = ads.readADC_Differential_2_3(); // lecture tension entre bornes cell O2 nmr2 - wait_ms(50); - //digitalWrite (Adc_AlerRdy, LOW); // remettre la pin AlertRdy à 0 pour économiser energie - // pour le DEBUG - //serialMonit.printf("Diff brute entre cell O2: "); serialMonit.printf((valeurO2_01-valeurO2_02)); serialMonit.printf("("); serialMonit.printf((valeurO2_01-valeurO2_02) / gainAmpli); serialMonit.printf("mV)"); // ramené en mV - //serialMonit.printf("O2.1: "); serialMonit.printf(valeurO2_01); serialMonit.printf(" ("); serialMonit.printf((valeurO2_01) / gainAmpli); serialMonit.printf("mV) - ");serialMonit.printf((valeurO2_01) / gainAmpli/6354*calibO2*100000,0); serialMonit.printf("mbar de ppO2)"); // coef usine cellule + ramené en mV - //serialMonit.printf("O2.2: "); serialMonit.printf(valeurO2_02); serialMonit.printf(" ("); serialMonit.printf((valeurO2_02) / gainAmpli); serialMonit.printf("mV) - ");serialMonit.printf((valeurO2_02) / gainAmpli/6528*calibO2*100000,0); serialMonit.printf("mbar de ppO2)"); // ramené en mV - - result3 = 0.5 * (valeurO2_01 + valeurO2_02) / gainAmpli * calibO2; // valeur en mbar - return result3; -} /////////////////////////////////// // fonction initialisation ///// /////////////////////////////////// void setup() { -//Préparation PPO2 avec ADS1015 - ads.setGain(GAIN_SIXTEEN); // set range to +/-0.256V - // calibration cellules O2 - // partie i2c : lecture des deux cellules O2 et P de la carte AQL - //digitalWrite (Adc_AlerRdy, HIGH); // si le fil a été connecté à la carte (permet d'économiser l'énergie) - sur la carte 2014, il est à la masse donc pas utilisé - wait_ms(100); + //RTC + seconds = time(NULL); + DateHeure = ctime(&seconds); - for (int i = 0; i < 5; i++) { - // proposition : mettre la pin AlertRdy à 1 pour lancer conversion ADC - valeurO2_01 = valeurO2_01 + ads.readADC_Differential_0_1(); // lecture tension entre bornes cell O2 nmr1 - wait_ms(50); - valeurO2_02 = valeurO2_02 + ads.readADC_Differential_2_3(); // lecture tension entre bornes cell O2 nmr2 - wait_ms(50); - } - - valeurO2_01 = valeurO2_01 / 5; - valeurO2_02 = valeurO2_02 / 5; - calibO2 = 208 / (0.5 * (valeurO2_01 + valeurO2_02) / gainAmpli); //(air frais : 208 mbar supposés au moment de la calib) - -//Préparation mode fonctionnement CO2 COZIR - serialMonit.printf("reponse demande pooling => K %5i\r\n", cozirSend("K 2")); - serialMonit.printf("reponse demande filtrage => A %5i\r\n", cozirSend("A 32")); - serialMonit.printf("reponse calibration => G %5d\r\n", cozirSend("G")); + arnsrs.Sensors_INIT(); } @@ -206,23 +60,73 @@ int main() { - setup(); //initialisation capteurs + wait(2); + + serialMonit.printf("Initialisation SD card\r\n"); + fp = fopen("/sd/Capteurs.txt", "r"); + if (fp != NULL) { + fclose(fp); + remove("/sd/Capteurs.txt"); + serialMonit.printf("Suppression d'un fichier du meme nom\r\n"); + } + + fp = fopen("/sd/Capteurs.txt", "w"); + if (fp == NULL) { + serialMonit.printf("Impossible d'ouvrir le fichier LOG\r\n"); + } else { + fprintf(fp, "LOG Capteurs ARNSRS"); + fclose(fp); + serialMonit.printf("Header du fichier cree\r\n"); + } + + setup(); //initialisation while (1) { + + //RTC + seconds = time(NULL); + + if (!FLAG_SIMPLE_TIME){ + DateHeure = ctime(&seconds); + printf(" Date / Heure = %s\r\n", DateHeure); + }else{ + char buffer[32]; + strftime(buffer, 32, "%I:%M %p\n", localtime(&seconds)); + printf(" Heure = %s", buffer); + } + //CO2 / H / T sur Cozir - serialMonit.printf(" co2 COZIR par methode cozirSend = %5d\r\n" ,cozirSend("Z")*10); // on multiplie par 10 pour etre en ppm - serialMonit.printf(" co2 COZIR par methode request = %5d\r\n" ,request('Z')*10); // on multiplie par 10 pour etre en ppm (méthode précédente) - serialMonit.printf(" H COZIR par methode cozirSend = %5d\r\n" ,cozirSend ("H")); // à laisser comme ça pour transmettre en BLE mais à diviser par 10 à réception dans l'app android pour être en xx,x% - serialMonit.printf(" H COZIR par methode request = %5d\r\n" ,request('H')); // à laisser comme ça pour transmettre en BLE mais à diviser par 10 à réception dans l'app android pour être en xx,x% - serialMonit.printf(" T COZIR par methode cozirSend = %5d\r\n" ,cozirSend ("T")-1000); // à laisser comme ça pour envoi BLE et à diviser par 10 à réception dans l'app android pour etre en yy,y°C - serialMonit.printf(" T COZIR par methode request = %5d\r\n" ,request('T')-1000); // à laisser comme ça pour envoi BLE et à diviser par 10 à réception dans l'app android pour etre en yy,y°C + co2 = arnsrs.cozirSend("Z")*10; // on multiplie par 10 pour etre en ppm + //serialMonit.printf(" co2 COZIR par methode request = %5d\r\n" ,request('Z')*10); // on multiplie par 10 pour etre en ppm (méthode précédente) + Humi = (float)arnsrs.cozirSend ("H") / 10; // à laisser comme ça pour transmettre en BLE mais à diviser par 10 à réception dans l'app android pour être en xx,x% + //serialMonit.printf(" H COZIR par methode request = %5d\r\n" ,request('H')); // à laisser comme ça pour transmettre en BLE mais à diviser par 10 à réception dans l'app android pour être en xx,x% + Temp1 = (float)(arnsrs.cozirSend ("T")-1000) / 10; // à laisser comme ça pour envoi BLE et à diviser par 10 à réception dans l'app android pour etre en yy,y°C + //serialMonit.printf(" T COZIR par methode request = %5d\r\n" ,request('T')-1000); + + pression = arnsrs.requestPress(); + Temp2 = arnsrs.requestTemp(); + + //PPO2 sur ADS1015 + ppO2 = arnsrs.requestPpO2(); + + //Affichage sur moniteur série + serialMonit.printf(" co2 COZIR par methode cozirSend = %d\r\n" , co2); // on multiplie par 10 pour etre en ppm + //serialMonit.printf(" co2 COZIR par methode request = %5d\r\n" ,request('Z')*10); // on multiplie par 10 pour etre en ppm (méthode précédente) + serialMonit.printf(" H COZIR par methode cozirSend = %f\r\n" , Humi); // à laisser comme ça pour transmettre en BLE mais à diviser par 10 à réception dans l'app android pour être en xx,x% + //serialMonit.printf(" H COZIR par methode request = %5d\r\n" ,request('H')); // à laisser comme ça pour transmettre en BLE mais à diviser par 10 à réception dans l'app android pour être en xx,x% + serialMonit.printf(" T COZIR par methode cozirSend = %f\r\n" ,Temp1); // à laisser comme ça pour envoi BLE et à diviser par 10 à réception dans l'app android pour etre en yy,y°C + //serialMonit.printf(" T COZIR par methode request = %5d\r\n" ,request('T')-1000); // à laisser comme ça pour envoi BLE et à diviser par 10 à réception dans l'app android pour etre en yy,y°C //P / T sur MS5803 - ps.convert(); - serialMonit.printf(" Pression MS5803 = %f\r\n", ps.pressure); - serialMonit.printf(" Temperature MS5803 = %f\r\n", ps.temperature); + serialMonit.printf(" Pression MS5803 = %f\r\n", pression); + serialMonit.printf(" Temperature MS5803 = %f\r\n", Temp2); //PPO2 sur ADS1015 - //reading = ads.readADC_Differential_2_3(); - serialMonit.printf(" PPO2 sur ADS1015 : %d\r\n", requestPpO2()); // print diff - wait_ms(2000); + serialMonit.printf(" PPO2 sur ADS1015 = %d\r\n", ppO2); + serialMonit.printf("\r\n", ""); + + if (mybutton == 0) { // Button is pressed + myled = !myled; // Toggle the LED state + FLAG_SIMPLE_TIME = !FLAG_SIMPLE_TIME; + wait(0.2); // 200 ms + } } }