mbed-os github
Dependencies: ADS1015 Faulhaber HTU21D_mod MS5837_potless Sensor_Head_RevB_3 USBDevice_dfu Utilsdfu beep
Fork of ARNSRS_testDFU by
Diff: main.cpp
- Revision:
- 6:ebed9093d661
- Parent:
- 5:ff7aa975646c
- Child:
- 7:ad15c386e960
diff -r ff7aa975646c -r ebed9093d661 main.cpp --- a/main.cpp Sun May 07 17:52:11 2017 +0000 +++ b/main.cpp Sun Jul 23 18:46:22 2017 +0000 @@ -1,164 +1,101 @@ -/* procédure lecture capteur COZIR ou MINIR - CO2 seul -sur broches F401RE SERIAL PA_11 et PA_12 -renvoie sur moniteur (IDE arduino par exemple) de la valeur lue - -procédures possibles sont : -request (char commande) - renvoie la valeur lue si la commande ne représente qu'un seul caractère (entre '') -cozirSend (string commande) - permet d'envoyer des commandes multicaractères (entre "") - exemple A 32 - donne la réponse obtenue - - -la fonction cozirSend est davantage "sécurisée" -*/ - - #include "mbed.h" #include <string> -#include "MS5803_14BA.h" -#include "Adafruit_ADS1015.h" +Serial serialCozir (PC_12,PD_2,9600); -//COM Série -Serial serialCozir (PC_12,PD_2,9600);//(PA_0,PA_1,9600);//(PA_11,PA_12,9600); Serial serialMonit (USBTX,USBRX,9600); -//Buffer pour Cozir -char reponse[10]; +//pour Cozir +const int size = 8; +char reponse[size]; +string commande; +int reponseInt; int indexCozir; - -//Init ADS1015 - -I2C i2c (PB_7,PB_6);//D14, D15); -Adafruit_ADS1115 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(PB_7, PB_6, MS5803_ADDRC_L, D1_OSR_4096, D2_OSR_4096); // SDA, SCL, I2C_address (0x76 or 0x77 look at MS5803.h) - - -void callbackCozir() {reponse [indexCozir++] = serialCozir.getc();} - +bool newMessageFlag = false; -////////////////////////////////////// -// fonction communication capteur///// -// on peut envoyer des ordres avec /// -// plusieurs digits comme A 32 /// -////////////////////////////////////// -int cozirSend(char* commande){ +//pour Param Cozir +const int sizeParam = 6; +char param[sizeParam ]; +int indexParam; +bool newParamFlag = false; - int reponseInt; - -// interrogation capteur - +void cozirSend(char* commande) +{ if (serialCozir.writeable()) { - indexCozir = 0; - serialCozir.puts(commande); + serialCozir.puts(commande); } - wait(1); - //serialMonit.printf("reponse : %s\r\n",reponse); - sscanf (reponse,"%s %5d",&commande,&reponseInt); - //serialMonit.printf("reponseInt : %d\r\n",reponseInt); - - return reponseInt; - /* - sscanf (reponse,"%c %5d\r\n",&reponseCommande); // on extrait le int de la chaine et on le stocke à l'adresse où pointe valeurCommande - serialMonit.printf(" reponse commande => %c %5d\r\n",reponseCommande); // pour le debug - serialMonit.printf(" & reponse commande => %c %5d\r\n",&reponseCommande); // pour le debug - serialMonit.printf(" reponse => %c %5d\r\n",reponse); // pour le debug - serialMonit.printf(" & reponse => %c %5d\r\n",&reponse); // pour le debug - return reponseCommande; - */ } -//////////////////////// -// Lecture PPO2 ///// -//////////////////////// -int requestPpO2() +void callbackCozir() { - - 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; + while(serialCozir.readable()) { + if ((indexCozir == size) || newMessageFlag) //éviter la saturation du buffer + serialCozir.getc(); + else + reponse [indexCozir++] = serialCozir.getc();//chargement du buffer dans le message + if ((indexCozir == size) || (reponse[indexCozir-1] == '\n')) {//le message est complet ou nouvelle ligne ou autre si on veut... + reponse[indexCozir] = 0; + newMessageFlag = true; + } + } } - - -/////////////////////////////////// -// fonction initialisation ///// -/////////////////////////////////// -void setup() +void callbackParam() { - serialCozir.attach(&callbackCozir); // on pose une interruption sur le serialCozir - - //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); - - 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); + while(serialMonit.readable()) { + if (indexParam == sizeParam) //éviter la saturation du buffer + serialMonit.getc(); + else + param [indexParam++] = serialMonit.getc();//chargement du buffer dans le message + if ((indexParam == sizeParam) || (param[indexParam -1] == '\n')) {//le message est complet ou nouvelle ligne ou autre si on veut... + param[indexParam] = 0; + newParamFlag = true; + } } +} - 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) +void decode_message(char rep[]) +{ - //Préparation mode fonctionnement CO2 COZIR - serialMonit.printf("reponse demande pooling => K %5i\r\n", cozirSend("K 2\r\n")); - serialMonit.printf("reponse demande filtrage => A %5i\r\n", cozirSend("A 32\r\n")); - serialMonit.printf("reponse calibration => G %5d\r\n", cozirSend("G\r\n")); + sscanf (rep,"%s %5d", commande, &reponseInt); + serialMonit.printf("Message complet = %s\r\n\n", rep); + serialMonit.printf("Commande = %s\r\n", commande); + serialMonit.printf("Reponse = %d\r\n\n", reponseInt); } -///////////////////////////////////// -/// procédure principale ///////// -///////////////////////////////////// - int main() { - serialMonit.printf(" demarrage \r\n"); - setup(); //initialisation capteurs - serialMonit.printf(" init capteur faite \r\n"); + serialCozir.attach(&callbackCozir, Serial::RxIrq); + + serialMonit.attach(&callbackParam, Serial::RxIrq); + + serialMonit.printf(" Demarrage...Entrez les comandes COZIR\r\n"); + + //Voir Datasheet.. + //Ex : G + //Pas besoin d'écrire \r\n dans lemoniteur + //Passer en K 0 pour changer le A 32 ou A 16...sinon ça bloque... + //Ensuite re passer en K 1 ou K 2.... + //Le Cozir restera dans le dernier mode rentré... + while (1) { - //CO2 / H / T sur Cozir - serialMonit.printf(" co2 COZIR = %5d\r\n" ,cozirSend ("Z\r\n")*10); // on multiplie par 10 pour etre en ppm - serialMonit.printf(" H COZIR = %5d\r\n" ,cozirSend ("H\r\n")); // à 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 = %5d\r\n" ,cozirSend ("T\r\n")-1000); // à laisser comme ça pour envoi BLE et à diviser par 10 à réception dans l'app android pour etre en yy,y°C + + if (newMessageFlag) { + decode_message(reponse); + strcpy(reponse," "); + indexCozir = 0; + newMessageFlag = false; + } - //P / T sur MS5803 - ps.convert(); - serialMonit.printf(" Pression MS5803 = %f\r\n", ps.pressure); - serialMonit.printf(" Temperature MS5803 = %f\r\n", ps.temperature); - - //PPO2 sur ADS1015 - serialMonit.printf(" PPO2 sur ADS1015 : %d\r\n", requestPpO2()); // print diff - wait_ms(2000); + if (newParamFlag) { + wait_ms(500); + serialMonit.printf("Param = %s\r\n", param); + cozirSend(param); + wait_ms(500); + strcpy(param," "); + indexParam = 0; + newParamFlag = false; + } } }