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:
2:4a8bf1d53439
Parent:
1:bef7856b5c0a
Child:
3:bc6d4222db12
--- a/main.cpp	Sun Apr 30 09:05:42 2017 +0000
+++ b/main.cpp	Sun Apr 30 23:29:19 2017 +0000
@@ -1,36 +1,46 @@
 /* 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>
 
 Serial serialCozir (PA_11,PA_12,9600);
 Serial serialMonit (USBTX,USBRX,9600);
-char reponse[6]; // buffer 
+char reponse[20]; // buffer 
 
-///////////////////////////////////
-// fonction initialisation    /////
-///////////////////////////////////
-void setup(){
-serialCozir.puts("K 2\r\n"); // mode interrogation
-serialMonit.printf("reponse au mode pooling %s\r\n",serialCozir.gets(reponse,5));
-serialCozir.puts("A 32\r\n"); // filtrage standard
-serialMonit.printf("reponse au mode filtrage %s\r\n",serialCozir.gets(reponse,5));
-serialCozir.puts("G\r\n"); // calibration à l'air libre
-serialMonit.printf("reponse au mode calib %s\r\n",serialCozir.gets(reponse,5));
-}
+
 ///////////////////////////////////
 // fonction de lecture capteur/////
 ///////////////////////////////////
-int requestCO2() { 
+int request(char commande) { 
 int index=0;
-char ch;
-int valeurCO2;
+char ch = ' ';;
+int valeurCommande;
     
 // interrogation capteur
-serialCozir.puts("Z\r\n");
+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
@@ -39,21 +49,81 @@
 do
 { 
    if (serialCozir.readable())      
-   {
-      do
-      {ch = serialCozir.getc(); // on lit les caractères entrant jusqu'à recevoir la lettre Z majuscule
-      }
-      while (ch=='Z');
-      
+   {  
       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<6)     // index <n b de digits max attendus ? (test pour ne pas depasser la capacité du buffer)    
+      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",&valeurCO2); // on extrait le int de la chaine et on le stocke à l'adresse où pointe valeurCO2
-return valeurCO2;
+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) { 
+
+
+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
+
+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;
+}
+///////////////////////////////////
+// fonction initialisation    /////
+///////////////////////////////////
+void setup(){
+
+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"));
+  
 }
 
 /////////////////////////////////////
@@ -62,8 +132,14 @@
 
 int main(){
     setup(); //initialisation capteur
+
     while (1){
-        serialMonit.printf("co2 COZIR= %d\r\n",requestCO2()*10); // on multiplie par 10 pour etre en ppm
+        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
         wait (1);
     } 
 }
\ No newline at end of file