mbed-os github

Dependencies:   ADS1015 Faulhaber HTU21D_mod MS5837_potless Sensor_Head_RevB_3 USBDevice_dfu Utilsdfu beep

Fork of ARNSRS_testDFU by POTLESS

Committer:
potless
Date:
Sun Apr 30 23:29:19 2017 +0000
Revision:
2:4a8bf1d53439
Parent:
1:bef7856b5c0a
Child:
3:bc6d4222db12
mise ? jour m?thode interrogation COZIR; deux fonctions possibles : request (char commande) ou cozirSend (string commande); traite co2, hygrom?trie et temp?rature

Who changed what in which revision?

UserRevisionLine numberNew contents of line
potless 1:bef7856b5c0a 1 /* procédure lecture capteur COZIR ou MINIR - CO2 seul
potless 1:bef7856b5c0a 2 sur broches F401RE SERIAL PA_11 et PA_12
potless 1:bef7856b5c0a 3 renvoie sur moniteur (IDE arduino par exemple) de la valeur lue
potless 2:4a8bf1d53439 4
potless 2:4a8bf1d53439 5 procédures possibles sont :
potless 2:4a8bf1d53439 6 request (char commande) - renvoie la valeur lue si la commande ne représente qu'un seul caractère (entre '')
potless 2:4a8bf1d53439 7 cozirSend (string commande) - permet d'envoyer des commandes multicaractères (entre "") - exemple A 32 - donne la réponse obtenue
potless 2:4a8bf1d53439 8
potless 2:4a8bf1d53439 9
potless 2:4a8bf1d53439 10 la fonction cozirSend est davantage "sécurisée"
potless 1:bef7856b5c0a 11 */
potless 0:69d4b21d58e0 12
potless 0:69d4b21d58e0 13
potless 1:bef7856b5c0a 14 #include "mbed.h"
potless 2:4a8bf1d53439 15 #include <string>
potless 1:bef7856b5c0a 16
potless 1:bef7856b5c0a 17 Serial serialCozir (PA_11,PA_12,9600);
potless 1:bef7856b5c0a 18 Serial serialMonit (USBTX,USBRX,9600);
potless 2:4a8bf1d53439 19 char reponse[20]; // buffer
potless 1:bef7856b5c0a 20
potless 2:4a8bf1d53439 21
potless 1:bef7856b5c0a 22 ///////////////////////////////////
potless 1:bef7856b5c0a 23 // fonction de lecture capteur/////
potless 1:bef7856b5c0a 24 ///////////////////////////////////
potless 2:4a8bf1d53439 25 int request(char commande) {
potless 1:bef7856b5c0a 26 int index=0;
potless 2:4a8bf1d53439 27 char ch = ' ';;
potless 2:4a8bf1d53439 28 int valeurCommande;
potless 0:69d4b21d58e0 29
potless 1:bef7856b5c0a 30 // interrogation capteur
potless 2:4a8bf1d53439 31 do
potless 2:4a8bf1d53439 32 {
potless 2:4a8bf1d53439 33 if (serialCozir.writeable()) {
potless 2:4a8bf1d53439 34 serialCozir.putc(commande);
potless 2:4a8bf1d53439 35 serialCozir.putc('\r');
potless 2:4a8bf1d53439 36 serialCozir.putc('\n');
potless 2:4a8bf1d53439 37 }
potless 2:4a8bf1d53439 38
potless 2:4a8bf1d53439 39 while (!serialCozir.readable()) {}
potless 2:4a8bf1d53439 40 ch = serialCozir.getc();
potless 2:4a8bf1d53439 41 }
potless 2:4a8bf1d53439 42
potless 2:4a8bf1d53439 43 while ( ch != commande);
potless 1:bef7856b5c0a 44
potless 1:bef7856b5c0a 45 // attente réponse capteur
potless 1:bef7856b5c0a 46 // le format de la reponse est : Z xxxxx z yyyyy\r\n
potless 1:bef7856b5c0a 47 // c'est uniquement xxxxx qui nous interesse
potless 1:bef7856b5c0a 48
potless 1:bef7856b5c0a 49 do
potless 1:bef7856b5c0a 50 {
potless 1:bef7856b5c0a 51 if (serialCozir.readable())
potless 2:4a8bf1d53439 52 {
potless 1:bef7856b5c0a 53 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
potless 2:4a8bf1d53439 54 if (index<20) // index <n b de digits max attendus ? (test pour ne pas depasser la capacité du buffer)
potless 1:bef7856b5c0a 55 reponse[index++]=ch; // on stocke le caractere reçu et on passe au suivant
potless 2:4a8bf1d53439 56 }
potless 1:bef7856b5c0a 57 } while (ch!='\n'); // on s'arrete de lire quand on a recu le retour à la ligne \n de la réponse
potless 1:bef7856b5c0a 58
potless 1:bef7856b5c0a 59 //reponse[index++]='\x0'; // mettre un zero à la fin de la reponse
potless 2:4a8bf1d53439 60 sscanf (reponse,"%5d\r\n",&valeurCommande); // on extrait le int de la chaine et on le stocke à l'adresse où pointe valeurCO2
potless 2:4a8bf1d53439 61 return valeurCommande;
potless 2:4a8bf1d53439 62 }
potless 2:4a8bf1d53439 63
potless 2:4a8bf1d53439 64
potless 2:4a8bf1d53439 65 //////////////////////////////////////
potless 2:4a8bf1d53439 66 // fonction communication capteur/////
potless 2:4a8bf1d53439 67 // on peut envoyer des ordres avec ///
potless 2:4a8bf1d53439 68 // plusieurs digits comme A 32 ///
potless 2:4a8bf1d53439 69 //////////////////////////////////////
potless 2:4a8bf1d53439 70 int cozirSend(string commande) {
potless 2:4a8bf1d53439 71
potless 2:4a8bf1d53439 72
potless 2:4a8bf1d53439 73 int index=0;
potless 2:4a8bf1d53439 74 char ch = ' ';;
potless 2:4a8bf1d53439 75 int reponseCommande;
potless 2:4a8bf1d53439 76 int nbDigits = commande.size();
potless 2:4a8bf1d53439 77
potless 2:4a8bf1d53439 78 commande[nbDigits]='\x0'; // on matérialise la fin de la chaine avc '\x0'
potless 2:4a8bf1d53439 79
potless 2:4a8bf1d53439 80 // interrogation capteur
potless 2:4a8bf1d53439 81 do
potless 2:4a8bf1d53439 82 {
potless 2:4a8bf1d53439 83 if (serialCozir.writeable()) {
potless 2:4a8bf1d53439 84 for (int j=0;j<nbDigits;j++) {
potless 2:4a8bf1d53439 85 serialCozir.putc(commande[j]);
potless 2:4a8bf1d53439 86 //serialMonit.printf(" commande digit %i sur %i => %c\r\n",j,nbDigits-1,commande[j]); // pour le debug
potless 2:4a8bf1d53439 87 }
potless 2:4a8bf1d53439 88 serialCozir.putc('\r');
potless 2:4a8bf1d53439 89 serialCozir.putc('\n');
potless 2:4a8bf1d53439 90 }
potless 2:4a8bf1d53439 91
potless 2:4a8bf1d53439 92 while (!serialCozir.readable()) {};
potless 2:4a8bf1d53439 93 ch = serialCozir.getc();
potless 2:4a8bf1d53439 94 }
potless 2:4a8bf1d53439 95
potless 2:4a8bf1d53439 96 while ( ch != commande[0]); // le format de la réponse reprend la première lettre de l'ordre
potless 2:4a8bf1d53439 97
potless 2:4a8bf1d53439 98 // attente réponse capteur
potless 2:4a8bf1d53439 99 // exemple pour co2 : le format de la reponse est Z xxxxx z yyyyy\r\n
potless 2:4a8bf1d53439 100 // c'est uniquement xxxxx qui nous interesse
potless 2:4a8bf1d53439 101
potless 2:4a8bf1d53439 102 do
potless 2:4a8bf1d53439 103 {
potless 2:4a8bf1d53439 104 if (serialCozir.readable())
potless 2:4a8bf1d53439 105 {
potless 2:4a8bf1d53439 106 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
potless 2:4a8bf1d53439 107 if (index<8) // index <n b de digits max attendus (les autres ne nous interessent pas)
potless 2:4a8bf1d53439 108 reponse[index++]=ch; // on stocke le caractere reçu et on passe au suivant
potless 2:4a8bf1d53439 109 }
potless 2:4a8bf1d53439 110 } while (ch!='\n'); // on s'arrete de lire quand on a recu le retour à la ligne \n de la réponse
potless 2:4a8bf1d53439 111
potless 2:4a8bf1d53439 112 //reponse[index++]='\x0'; // mettre un zero à la fin de la reponse
potless 2:4a8bf1d53439 113 sscanf (reponse,"%5d\r\n",&reponseCommande); // on extrait le int de la chaine et on le stocke à l'adresse où pointe valeurCommande
potless 2:4a8bf1d53439 114 //serialMonit.printf(" reponse recue => %5d\r\n",reponseCommande); // pour le debug
potless 2:4a8bf1d53439 115
potless 2:4a8bf1d53439 116 return reponseCommande;
potless 2:4a8bf1d53439 117 }
potless 2:4a8bf1d53439 118 ///////////////////////////////////
potless 2:4a8bf1d53439 119 // fonction initialisation /////
potless 2:4a8bf1d53439 120 ///////////////////////////////////
potless 2:4a8bf1d53439 121 void setup(){
potless 2:4a8bf1d53439 122
potless 2:4a8bf1d53439 123 serialMonit.printf("reponse demande pooling => K %5i\r\n", cozirSend("K 2"));
potless 2:4a8bf1d53439 124 serialMonit.printf("reponse demande filtrage => A %5i\r\n", cozirSend("A 32"));
potless 2:4a8bf1d53439 125 serialMonit.printf("reponse calibration => G %5d\r\n", cozirSend("G"));
potless 2:4a8bf1d53439 126
potless 0:69d4b21d58e0 127 }
potless 0:69d4b21d58e0 128
potless 1:bef7856b5c0a 129 /////////////////////////////////////
potless 1:bef7856b5c0a 130 /// procédure principale /////////
potless 1:bef7856b5c0a 131 /////////////////////////////////////
potless 0:69d4b21d58e0 132
potless 0:69d4b21d58e0 133 int main(){
potless 1:bef7856b5c0a 134 setup(); //initialisation capteur
potless 2:4a8bf1d53439 135
potless 1:bef7856b5c0a 136 while (1){
potless 2:4a8bf1d53439 137 serialMonit.printf("co2 COZIR par methode cozirSend = %5d\r\n" ,cozirSend("Z")*10); // on multiplie par 10 pour etre en ppm
potless 2:4a8bf1d53439 138 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)
potless 2:4a8bf1d53439 139 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%
potless 2:4a8bf1d53439 140 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%
potless 2:4a8bf1d53439 141 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
potless 2:4a8bf1d53439 142 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
potless 1:bef7856b5c0a 143 wait (1);
potless 1:bef7856b5c0a 144 }
potless 1:bef7856b5c0a 145 }