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
main.cpp
- Committer:
- POTLESS_2
- Date:
- 2017-05-01
- Revision:
- 3:bc6d4222db12
- Parent:
- 2:4a8bf1d53439
- Child:
- 4:d84250f67dec
File content as of revision 3:bc6d4222db12:
/* 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" #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 Serial serialCozir (PA_11,PA_12,9600); Serial serialMonit (USBTX,USBRX,9600); char reponse[20]; // buffer 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) { 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 ps.convert(); serialMonit.printf(" Pression MS5803 = %4.1f\r\n", ps.pressure); serialMonit.printf(" Température MS5803 = %4.1f\r\n", ps.temperature); wait (1); }}