mbed-os github

Dependencies:   ADS1015 Faulhaber HTU21D_mod MS5837_potless Sensor_Head_RevB_3 USBDevice_dfu Utilsdfu beep

Fork of ARNSRS_testDFU by POTLESS

main.cpp

Committer:
potless
Date:
2017-04-30
Revision:
2:4a8bf1d53439
Parent:
1:bef7856b5c0a
Child:
3:bc6d4222db12

File content as of revision 2:4a8bf1d53439:

/* 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[20]; // buffer 


///////////////////////////////////
// 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) { 


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"));
  
}

/////////////////////////////////////
/// procédure principale    /////////
/////////////////////////////////////

int main(){
    setup(); //initialisation capteur

    while (1){
        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);
    } 
}