mbed-os github

Dependencies:   ADS1015 Faulhaber HTU21D_mod MS5837_potless Sensor_Head_RevB_3 USBDevice_dfu Utilsdfu beep

Fork of ARNSRS_testDFU by POTLESS

Revision:
6:ebed9093d661
Parent:
5:ff7aa975646c
Child:
7:ad15c386e960
--- 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;
+        }
     }
 }