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@3:bc6d4222db12, 2017-05-01 (annotated)
- Committer:
- POTLESS_2
- Date:
- Mon May 01 10:45:18 2017 +0000
- Revision:
- 3:bc6d4222db12
- Parent:
- 2:4a8bf1d53439
- Child:
- 4:d84250f67dec
Rajout? ? l'aveugle une lib et le code pour afficher T et P du MS5803.; Tu testeras avec ton capteur...Comme ?a je test pour publier un code ;o)
Who changed what in which revision?
User | Revision | Line number | New 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_2 | 3:bc6d4222db12 | 16 | #include "MS5803_14BA.h" |
POTLESS_2 | 3:bc6d4222db12 | 17 | |
POTLESS_2 | 3:bc6d4222db12 | 18 | |
POTLESS_2 | 3:bc6d4222db12 | 19 | #ifdef TARGET_K64F |
POTLESS_2 | 3:bc6d4222db12 | 20 | #define SPI_SCK PTD1 |
POTLESS_2 | 3:bc6d4222db12 | 21 | #define SPI_MOSI PTD2 |
POTLESS_2 | 3:bc6d4222db12 | 22 | #define SPI_MISO PTD3 |
POTLESS_2 | 3:bc6d4222db12 | 23 | #define SPI_CS PTD0 |
POTLESS_2 | 3:bc6d4222db12 | 24 | #define I2C_SDA PTE25 |
POTLESS_2 | 3:bc6d4222db12 | 25 | #define I2C_SCL PTE24 |
POTLESS_2 | 3:bc6d4222db12 | 26 | #elif defined(TARGET_KL25Z) |
POTLESS_2 | 3:bc6d4222db12 | 27 | #define SPI_SCK PTD1 |
POTLESS_2 | 3:bc6d4222db12 | 28 | #define SPI_MOSI PTD2 |
POTLESS_2 | 3:bc6d4222db12 | 29 | #define SPI_MISO PTD3 |
POTLESS_2 | 3:bc6d4222db12 | 30 | #define SPI_CS PTD0 |
POTLESS_2 | 3:bc6d4222db12 | 31 | #define I2C_SDA PTE0 |
POTLESS_2 | 3:bc6d4222db12 | 32 | #define I2C_SCL PTE1 |
POTLESS_2 | 3:bc6d4222db12 | 33 | #endif |
potless | 1:bef7856b5c0a | 34 | |
potless | 1:bef7856b5c0a | 35 | Serial serialCozir (PA_11,PA_12,9600); |
potless | 1:bef7856b5c0a | 36 | Serial serialMonit (USBTX,USBRX,9600); |
potless | 2:4a8bf1d53439 | 37 | char reponse[20]; // buffer |
POTLESS_2 | 3:bc6d4222db12 | 38 | 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) |
potless | 2:4a8bf1d53439 | 39 | |
potless | 1:bef7856b5c0a | 40 | /////////////////////////////////// |
potless | 1:bef7856b5c0a | 41 | // fonction de lecture capteur///// |
potless | 1:bef7856b5c0a | 42 | /////////////////////////////////// |
potless | 2:4a8bf1d53439 | 43 | int request(char commande) { |
potless | 1:bef7856b5c0a | 44 | int index=0; |
potless | 2:4a8bf1d53439 | 45 | char ch = ' ';; |
potless | 2:4a8bf1d53439 | 46 | int valeurCommande; |
potless | 0:69d4b21d58e0 | 47 | |
potless | 1:bef7856b5c0a | 48 | // interrogation capteur |
potless | 2:4a8bf1d53439 | 49 | do |
potless | 2:4a8bf1d53439 | 50 | { |
potless | 2:4a8bf1d53439 | 51 | if (serialCozir.writeable()) { |
potless | 2:4a8bf1d53439 | 52 | serialCozir.putc(commande); |
potless | 2:4a8bf1d53439 | 53 | serialCozir.putc('\r'); |
potless | 2:4a8bf1d53439 | 54 | serialCozir.putc('\n'); |
potless | 2:4a8bf1d53439 | 55 | } |
potless | 2:4a8bf1d53439 | 56 | |
potless | 2:4a8bf1d53439 | 57 | while (!serialCozir.readable()) {} |
potless | 2:4a8bf1d53439 | 58 | ch = serialCozir.getc(); |
potless | 2:4a8bf1d53439 | 59 | } |
potless | 2:4a8bf1d53439 | 60 | |
potless | 2:4a8bf1d53439 | 61 | while ( ch != commande); |
potless | 1:bef7856b5c0a | 62 | |
potless | 1:bef7856b5c0a | 63 | // attente réponse capteur |
potless | 1:bef7856b5c0a | 64 | // le format de la reponse est : Z xxxxx z yyyyy\r\n |
potless | 1:bef7856b5c0a | 65 | // c'est uniquement xxxxx qui nous interesse |
potless | 1:bef7856b5c0a | 66 | |
potless | 1:bef7856b5c0a | 67 | do |
potless | 1:bef7856b5c0a | 68 | { |
potless | 1:bef7856b5c0a | 69 | if (serialCozir.readable()) |
potless | 2:4a8bf1d53439 | 70 | { |
potless | 1:bef7856b5c0a | 71 | 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 | 72 | if (index<20) // index <n b de digits max attendus ? (test pour ne pas depasser la capacité du buffer) |
potless | 1:bef7856b5c0a | 73 | reponse[index++]=ch; // on stocke le caractere reçu et on passe au suivant |
potless | 2:4a8bf1d53439 | 74 | } |
potless | 1:bef7856b5c0a | 75 | } while (ch!='\n'); // on s'arrete de lire quand on a recu le retour à la ligne \n de la réponse |
potless | 1:bef7856b5c0a | 76 | |
potless | 1:bef7856b5c0a | 77 | //reponse[index++]='\x0'; // mettre un zero à la fin de la reponse |
potless | 2:4a8bf1d53439 | 78 | 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 | 79 | return valeurCommande; |
potless | 2:4a8bf1d53439 | 80 | } |
potless | 2:4a8bf1d53439 | 81 | |
potless | 2:4a8bf1d53439 | 82 | |
potless | 2:4a8bf1d53439 | 83 | ////////////////////////////////////// |
potless | 2:4a8bf1d53439 | 84 | // fonction communication capteur///// |
potless | 2:4a8bf1d53439 | 85 | // on peut envoyer des ordres avec /// |
potless | 2:4a8bf1d53439 | 86 | // plusieurs digits comme A 32 /// |
potless | 2:4a8bf1d53439 | 87 | ////////////////////////////////////// |
potless | 2:4a8bf1d53439 | 88 | int cozirSend(string commande) { |
potless | 2:4a8bf1d53439 | 89 | |
potless | 2:4a8bf1d53439 | 90 | |
potless | 2:4a8bf1d53439 | 91 | int index=0; |
potless | 2:4a8bf1d53439 | 92 | char ch = ' ';; |
potless | 2:4a8bf1d53439 | 93 | int reponseCommande; |
potless | 2:4a8bf1d53439 | 94 | int nbDigits = commande.size(); |
potless | 2:4a8bf1d53439 | 95 | |
potless | 2:4a8bf1d53439 | 96 | commande[nbDigits]='\x0'; // on matérialise la fin de la chaine avc '\x0' |
potless | 2:4a8bf1d53439 | 97 | |
potless | 2:4a8bf1d53439 | 98 | // interrogation capteur |
potless | 2:4a8bf1d53439 | 99 | do |
potless | 2:4a8bf1d53439 | 100 | { |
potless | 2:4a8bf1d53439 | 101 | if (serialCozir.writeable()) { |
potless | 2:4a8bf1d53439 | 102 | for (int j=0;j<nbDigits;j++) { |
potless | 2:4a8bf1d53439 | 103 | serialCozir.putc(commande[j]); |
potless | 2:4a8bf1d53439 | 104 | //serialMonit.printf(" commande digit %i sur %i => %c\r\n",j,nbDigits-1,commande[j]); // pour le debug |
potless | 2:4a8bf1d53439 | 105 | } |
potless | 2:4a8bf1d53439 | 106 | serialCozir.putc('\r'); |
potless | 2:4a8bf1d53439 | 107 | serialCozir.putc('\n'); |
potless | 2:4a8bf1d53439 | 108 | } |
potless | 2:4a8bf1d53439 | 109 | |
potless | 2:4a8bf1d53439 | 110 | while (!serialCozir.readable()) {}; |
potless | 2:4a8bf1d53439 | 111 | ch = serialCozir.getc(); |
potless | 2:4a8bf1d53439 | 112 | } |
potless | 2:4a8bf1d53439 | 113 | |
potless | 2:4a8bf1d53439 | 114 | while ( ch != commande[0]); // le format de la réponse reprend la première lettre de l'ordre |
potless | 2:4a8bf1d53439 | 115 | |
potless | 2:4a8bf1d53439 | 116 | // attente réponse capteur |
potless | 2:4a8bf1d53439 | 117 | // exemple pour co2 : le format de la reponse est Z xxxxx z yyyyy\r\n |
potless | 2:4a8bf1d53439 | 118 | // c'est uniquement xxxxx qui nous interesse |
potless | 2:4a8bf1d53439 | 119 | |
potless | 2:4a8bf1d53439 | 120 | do |
potless | 2:4a8bf1d53439 | 121 | { |
potless | 2:4a8bf1d53439 | 122 | if (serialCozir.readable()) |
potless | 2:4a8bf1d53439 | 123 | { |
potless | 2:4a8bf1d53439 | 124 | 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 | 125 | if (index<8) // index <n b de digits max attendus (les autres ne nous interessent pas) |
potless | 2:4a8bf1d53439 | 126 | reponse[index++]=ch; // on stocke le caractere reçu et on passe au suivant |
potless | 2:4a8bf1d53439 | 127 | } |
potless | 2:4a8bf1d53439 | 128 | } while (ch!='\n'); // on s'arrete de lire quand on a recu le retour à la ligne \n de la réponse |
potless | 2:4a8bf1d53439 | 129 | |
potless | 2:4a8bf1d53439 | 130 | //reponse[index++]='\x0'; // mettre un zero à la fin de la reponse |
potless | 2:4a8bf1d53439 | 131 | 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 | 132 | //serialMonit.printf(" reponse recue => %5d\r\n",reponseCommande); // pour le debug |
potless | 2:4a8bf1d53439 | 133 | |
potless | 2:4a8bf1d53439 | 134 | return reponseCommande; |
potless | 2:4a8bf1d53439 | 135 | } |
potless | 2:4a8bf1d53439 | 136 | /////////////////////////////////// |
potless | 2:4a8bf1d53439 | 137 | // fonction initialisation ///// |
potless | 2:4a8bf1d53439 | 138 | /////////////////////////////////// |
potless | 2:4a8bf1d53439 | 139 | void setup(){ |
potless | 2:4a8bf1d53439 | 140 | |
potless | 2:4a8bf1d53439 | 141 | serialMonit.printf("reponse demande pooling => K %5i\r\n", cozirSend("K 2")); |
potless | 2:4a8bf1d53439 | 142 | serialMonit.printf("reponse demande filtrage => A %5i\r\n", cozirSend("A 32")); |
potless | 2:4a8bf1d53439 | 143 | serialMonit.printf("reponse calibration => G %5d\r\n", cozirSend("G")); |
potless | 2:4a8bf1d53439 | 144 | |
potless | 0:69d4b21d58e0 | 145 | } |
potless | 0:69d4b21d58e0 | 146 | |
potless | 1:bef7856b5c0a | 147 | ///////////////////////////////////// |
potless | 1:bef7856b5c0a | 148 | /// procédure principale ///////// |
potless | 1:bef7856b5c0a | 149 | ///////////////////////////////////// |
potless | 0:69d4b21d58e0 | 150 | |
potless | 0:69d4b21d58e0 | 151 | int main(){ |
potless | 1:bef7856b5c0a | 152 | setup(); //initialisation capteur |
potless | 2:4a8bf1d53439 | 153 | |
potless | 1:bef7856b5c0a | 154 | while (1){ |
POTLESS_2 | 3:bc6d4222db12 | 155 | serialMonit.printf(" co2 COZIR par methode cozirSend = %5d\r\n" ,cozirSend("Z")*10); // on multiplie par 10 pour etre en ppm |
POTLESS_2 | 3:bc6d4222db12 | 156 | 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 | 157 | 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 | 158 | 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 | 159 | 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 | 160 | 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_2 | 3:bc6d4222db12 | 161 | ps.convert(); |
POTLESS_2 | 3:bc6d4222db12 | 162 | serialMonit.printf(" Pression MS5803 = %4.1f\r\n", ps.pressure); |
POTLESS_2 | 3:bc6d4222db12 | 163 | serialMonit.printf(" Température MS5803 = %4.1f\r\n", ps.temperature); |
potless | 1:bef7856b5c0a | 164 | wait (1); |
POTLESS_2 | 3:bc6d4222db12 | 165 | }} |