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_2
Date:
Mon May 01 13:33:54 2017 +0000
Revision:
4:d84250f67dec
Parent:
3:bc6d4222db12
Child:
5:ff7aa975646c
Ajout de la PPO2 avec AD1015...je sais pas si ?a marche, car mes cellules ne marchent pas je pense...r?sultat toujours 208, idem depuis le d?but sur arduino, uniquement r?sultat du calcul du d?but. A tester avec des capteurs (O2 et P/T) OK.

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_2 4:d84250f67dec 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 4:d84250f67dec 17 #include "Adafruit_ADS1015.h"
POTLESS_2 4:d84250f67dec 18
POTLESS_2 3:bc6d4222db12 19 #ifdef TARGET_K64F
POTLESS_2 4:d84250f67dec 20 #define SPI_SCK PTD1
POTLESS_2 4:d84250f67dec 21 #define SPI_MOSI PTD2
POTLESS_2 4:d84250f67dec 22 #define SPI_MISO PTD3
POTLESS_2 4:d84250f67dec 23 #define SPI_CS PTD0
POTLESS_2 4:d84250f67dec 24 #define I2C_SDA PTE25
POTLESS_2 4:d84250f67dec 25 #define I2C_SCL PTE24
POTLESS_2 3:bc6d4222db12 26 #elif defined(TARGET_KL25Z)
POTLESS_2 4:d84250f67dec 27 #define SPI_SCK PTD1
POTLESS_2 4:d84250f67dec 28 #define SPI_MOSI PTD2
POTLESS_2 4:d84250f67dec 29 #define SPI_MISO PTD3
POTLESS_2 4:d84250f67dec 30 #define SPI_CS PTD0
POTLESS_2 4:d84250f67dec 31 #define I2C_SDA PTE0
POTLESS_2 4:d84250f67dec 32 #define I2C_SCL PTE1
POTLESS_2 3:bc6d4222db12 33 #endif
potless 1:bef7856b5c0a 34
POTLESS_2 4:d84250f67dec 35 //COM Série
potless 1:bef7856b5c0a 36 Serial serialCozir (PA_11,PA_12,9600);
potless 1:bef7856b5c0a 37 Serial serialMonit (USBTX,USBRX,9600);
POTLESS_2 4:d84250f67dec 38
POTLESS_2 4:d84250f67dec 39 //Buffer pour Cozir
POTLESS_2 4:d84250f67dec 40 char reponse[20];
POTLESS_2 4:d84250f67dec 41 //Init ADS1015
POTLESS_2 4:d84250f67dec 42 I2C i2c(D14, D15);
POTLESS_2 4:d84250f67dec 43 Adafruit_ADS1015 ads(&i2c, 0x48);
POTLESS_2 4:d84250f67dec 44 //Variables pour PPO2
POTLESS_2 4:d84250f67dec 45 int16_t valeurO2_01 = 0;
POTLESS_2 4:d84250f67dec 46 int16_t valeurO2_02 = 0;
POTLESS_2 4:d84250f67dec 47 // pin d2 pour Adc_AlerRdy (fil bleu) : démarre et arrete l'ADC pour sauver l'energie
POTLESS_2 4:d84250f67dec 48 int Adc_AlerRdy = 2;
POTLESS_2 4:d84250f67dec 49 float calibO2 = 0;
POTLESS_2 4:d84250f67dec 50 float gainAmpli = 128.0F; // ADS1115 @ +0,256V gain (16-bit results) gain de l'ampli de l'ADS
POTLESS_2 4:d84250f67dec 51 //Init MS5803
POTLESS_2 3:bc6d4222db12 52 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 53
potless 1:bef7856b5c0a 54 ///////////////////////////////////
potless 1:bef7856b5c0a 55 // fonction de lecture capteur/////
potless 1:bef7856b5c0a 56 ///////////////////////////////////
POTLESS_2 4:d84250f67dec 57 int request(char commande)
POTLESS_2 4:d84250f67dec 58 {
POTLESS_2 4:d84250f67dec 59 int index=0;
POTLESS_2 4:d84250f67dec 60 char ch = ' ';;
POTLESS_2 4:d84250f67dec 61 int valeurCommande;
POTLESS_2 4:d84250f67dec 62
potless 1:bef7856b5c0a 63 // interrogation capteur
POTLESS_2 4:d84250f67dec 64 do {
POTLESS_2 4:d84250f67dec 65 if (serialCozir.writeable()) {
POTLESS_2 4:d84250f67dec 66 serialCozir.putc(commande);
POTLESS_2 4:d84250f67dec 67 serialCozir.putc('\r');
POTLESS_2 4:d84250f67dec 68 serialCozir.putc('\n');
potless 2:4a8bf1d53439 69 }
potless 2:4a8bf1d53439 70
POTLESS_2 4:d84250f67dec 71 while (!serialCozir.readable()) {}
POTLESS_2 4:d84250f67dec 72 ch = serialCozir.getc();
POTLESS_2 4:d84250f67dec 73 }
POTLESS_2 4:d84250f67dec 74
POTLESS_2 4:d84250f67dec 75 while ( ch != commande);
potless 1:bef7856b5c0a 76
potless 1:bef7856b5c0a 77 // attente réponse capteur
potless 1:bef7856b5c0a 78 // le format de la reponse est : Z xxxxx z yyyyy\r\n
potless 1:bef7856b5c0a 79 // c'est uniquement xxxxx qui nous interesse
potless 1:bef7856b5c0a 80
POTLESS_2 4:d84250f67dec 81 do {
POTLESS_2 4:d84250f67dec 82 if (serialCozir.readable()) {
POTLESS_2 4:d84250f67dec 83 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 4:d84250f67dec 84 if (index<20) // index <n b de digits max attendus ? (test pour ne pas depasser la capacité du buffer)
POTLESS_2 4:d84250f67dec 85 reponse[index++]=ch; // on stocke le caractere reçu et on passe au suivant
POTLESS_2 4:d84250f67dec 86 }
POTLESS_2 4:d84250f67dec 87 } while (ch!='\n'); // on s'arrete de lire quand on a recu le retour à la ligne \n de la réponse
POTLESS_2 4:d84250f67dec 88
potless 1:bef7856b5c0a 89 //reponse[index++]='\x0'; // mettre un zero à la fin de la reponse
POTLESS_2 4:d84250f67dec 90 sscanf (reponse,"%5d\r\n",&valeurCommande); // on extrait le int de la chaine et on le stocke à l'adresse où pointe valeurCO2
POTLESS_2 4:d84250f67dec 91 return valeurCommande;
potless 2:4a8bf1d53439 92 }
potless 2:4a8bf1d53439 93
potless 2:4a8bf1d53439 94
potless 2:4a8bf1d53439 95 //////////////////////////////////////
potless 2:4a8bf1d53439 96 // fonction communication capteur/////
potless 2:4a8bf1d53439 97 // on peut envoyer des ordres avec ///
potless 2:4a8bf1d53439 98 // plusieurs digits comme A 32 ///
potless 2:4a8bf1d53439 99 //////////////////////////////////////
POTLESS_2 4:d84250f67dec 100 int cozirSend(string commande)
POTLESS_2 4:d84250f67dec 101 {
potless 2:4a8bf1d53439 102
potless 2:4a8bf1d53439 103
POTLESS_2 4:d84250f67dec 104 int index=0;
POTLESS_2 4:d84250f67dec 105 char ch = ' ';;
POTLESS_2 4:d84250f67dec 106 int reponseCommande;
POTLESS_2 4:d84250f67dec 107 int nbDigits = commande.size();
potless 2:4a8bf1d53439 108
POTLESS_2 4:d84250f67dec 109 commande[nbDigits]='\x0'; // on matérialise la fin de la chaine avc '\x0'
POTLESS_2 4:d84250f67dec 110
potless 2:4a8bf1d53439 111 // interrogation capteur
POTLESS_2 4:d84250f67dec 112 do {
POTLESS_2 4:d84250f67dec 113 if (serialCozir.writeable()) {
POTLESS_2 4:d84250f67dec 114 for (int j=0; j<nbDigits; j++) {
POTLESS_2 4:d84250f67dec 115 serialCozir.putc(commande[j]);
POTLESS_2 4:d84250f67dec 116 //serialMonit.printf(" commande digit %i sur %i => %c\r\n",j,nbDigits-1,commande[j]); // pour le debug
POTLESS_2 4:d84250f67dec 117 }
POTLESS_2 4:d84250f67dec 118 serialCozir.putc('\r');
POTLESS_2 4:d84250f67dec 119 serialCozir.putc('\n');
potless 2:4a8bf1d53439 120 }
potless 2:4a8bf1d53439 121
POTLESS_2 4:d84250f67dec 122 while (!serialCozir.readable()) {};
POTLESS_2 4:d84250f67dec 123 ch = serialCozir.getc();
POTLESS_2 4:d84250f67dec 124 }
POTLESS_2 4:d84250f67dec 125
POTLESS_2 4:d84250f67dec 126 while ( ch != commande[0]); // le format de la réponse reprend la première lettre de l'ordre
potless 2:4a8bf1d53439 127
potless 2:4a8bf1d53439 128 // attente réponse capteur
potless 2:4a8bf1d53439 129 // exemple pour co2 : le format de la reponse est Z xxxxx z yyyyy\r\n
potless 2:4a8bf1d53439 130 // c'est uniquement xxxxx qui nous interesse
potless 2:4a8bf1d53439 131
POTLESS_2 4:d84250f67dec 132 do {
POTLESS_2 4:d84250f67dec 133 if (serialCozir.readable()) {
POTLESS_2 4:d84250f67dec 134 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 4:d84250f67dec 135 if (index<8) // index <n b de digits max attendus (les autres ne nous interessent pas)
POTLESS_2 4:d84250f67dec 136 reponse[index++]=ch; // on stocke le caractere reçu et on passe au suivant
POTLESS_2 4:d84250f67dec 137 }
POTLESS_2 4:d84250f67dec 138 } while (ch!='\n'); // on s'arrete de lire quand on a recu le retour à la ligne \n de la réponse
POTLESS_2 4:d84250f67dec 139
potless 2:4a8bf1d53439 140 //reponse[index++]='\x0'; // mettre un zero à la fin de la reponse
POTLESS_2 4:d84250f67dec 141 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 142 //serialMonit.printf(" reponse recue => %5d\r\n",reponseCommande); // pour le debug
potless 2:4a8bf1d53439 143
POTLESS_2 4:d84250f67dec 144 return reponseCommande;
potless 2:4a8bf1d53439 145 }
POTLESS_2 4:d84250f67dec 146
POTLESS_2 4:d84250f67dec 147 ////////////////////////
POTLESS_2 4:d84250f67dec 148 // Lecture PPO2 /////
POTLESS_2 4:d84250f67dec 149 ////////////////////////
POTLESS_2 4:d84250f67dec 150 int requestPpO2()
POTLESS_2 4:d84250f67dec 151 {
POTLESS_2 4:d84250f67dec 152
POTLESS_2 4:d84250f67dec 153 int result3;
POTLESS_2 4:d84250f67dec 154 //lecture des deux cellules O2 et P de la carte AQL
POTLESS_2 4:d84250f67dec 155
POTLESS_2 4:d84250f67dec 156 //digitalWrite (Adc_AlerRdy, HIGH); // si le fil a été connecté à la carte (permet d'économiser l'énergie) - sur la carte 2014, il est à la masse donc pas utilisé
POTLESS_2 4:d84250f67dec 157 wait_ms(100); // mettre la pin AlertRdy à 1 pour lancer conversion ADC
POTLESS_2 4:d84250f67dec 158 valeurO2_01 = ads.readADC_Differential_0_1(); // lecture tension entre bornes cell O2 nmr1
POTLESS_2 4:d84250f67dec 159 wait_ms(50);
POTLESS_2 4:d84250f67dec 160 valeurO2_02 = ads.readADC_Differential_2_3(); // lecture tension entre bornes cell O2 nmr2
POTLESS_2 4:d84250f67dec 161 wait_ms(50);
POTLESS_2 4:d84250f67dec 162 //digitalWrite (Adc_AlerRdy, LOW); // remettre la pin AlertRdy à 0 pour économiser energie
POTLESS_2 4:d84250f67dec 163 // pour le DEBUG
POTLESS_2 4:d84250f67dec 164 //serialMonit.printf("Diff brute entre cell O2: "); serialMonit.printf((valeurO2_01-valeurO2_02)); serialMonit.printf("("); serialMonit.printf((valeurO2_01-valeurO2_02) / gainAmpli); serialMonit.printf("mV)"); // ramené en mV
POTLESS_2 4:d84250f67dec 165 //serialMonit.printf("O2.1: "); serialMonit.printf(valeurO2_01); serialMonit.printf(" ("); serialMonit.printf((valeurO2_01) / gainAmpli); serialMonit.printf("mV) - ");serialMonit.printf((valeurO2_01) / gainAmpli/6354*calibO2*100000,0); serialMonit.printf("mbar de ppO2)"); // coef usine cellule + ramené en mV
POTLESS_2 4:d84250f67dec 166 //serialMonit.printf("O2.2: "); serialMonit.printf(valeurO2_02); serialMonit.printf(" ("); serialMonit.printf((valeurO2_02) / gainAmpli); serialMonit.printf("mV) - ");serialMonit.printf((valeurO2_02) / gainAmpli/6528*calibO2*100000,0); serialMonit.printf("mbar de ppO2)"); // ramené en mV
POTLESS_2 4:d84250f67dec 167
POTLESS_2 4:d84250f67dec 168 result3 = 0.5 * (valeurO2_01 + valeurO2_02) / gainAmpli * calibO2; // valeur en mbar
POTLESS_2 4:d84250f67dec 169 return result3;
POTLESS_2 4:d84250f67dec 170 }
POTLESS_2 4:d84250f67dec 171
potless 2:4a8bf1d53439 172 ///////////////////////////////////
potless 2:4a8bf1d53439 173 // fonction initialisation /////
potless 2:4a8bf1d53439 174 ///////////////////////////////////
POTLESS_2 4:d84250f67dec 175 void setup()
POTLESS_2 4:d84250f67dec 176 {
POTLESS_2 4:d84250f67dec 177 //Préparation PPO2 avec ADS1015
POTLESS_2 4:d84250f67dec 178 ads.setGain(GAIN_SIXTEEN); // set range to +/-0.256V
POTLESS_2 4:d84250f67dec 179 // calibration cellules O2
POTLESS_2 4:d84250f67dec 180 // partie i2c : lecture des deux cellules O2 et P de la carte AQL
POTLESS_2 4:d84250f67dec 181 //digitalWrite (Adc_AlerRdy, HIGH); // si le fil a été connecté à la carte (permet d'économiser l'énergie) - sur la carte 2014, il est à la masse donc pas utilisé
POTLESS_2 4:d84250f67dec 182 wait_ms(100);
potless 2:4a8bf1d53439 183
POTLESS_2 4:d84250f67dec 184 for (int i = 0; i < 5; i++) {
POTLESS_2 4:d84250f67dec 185 // proposition : mettre la pin AlertRdy à 1 pour lancer conversion ADC
POTLESS_2 4:d84250f67dec 186 valeurO2_01 = valeurO2_01 + ads.readADC_Differential_0_1(); // lecture tension entre bornes cell O2 nmr1
POTLESS_2 4:d84250f67dec 187 wait_ms(50);
POTLESS_2 4:d84250f67dec 188 valeurO2_02 = valeurO2_02 + ads.readADC_Differential_2_3(); // lecture tension entre bornes cell O2 nmr2
POTLESS_2 4:d84250f67dec 189 wait_ms(50);
POTLESS_2 4:d84250f67dec 190 }
POTLESS_2 4:d84250f67dec 191
POTLESS_2 4:d84250f67dec 192 valeurO2_01 = valeurO2_01 / 5;
POTLESS_2 4:d84250f67dec 193 valeurO2_02 = valeurO2_02 / 5;
POTLESS_2 4:d84250f67dec 194 calibO2 = 208 / (0.5 * (valeurO2_01 + valeurO2_02) / gainAmpli); //(air frais : 208 mbar supposés au moment de la calib)
POTLESS_2 4:d84250f67dec 195
POTLESS_2 4:d84250f67dec 196 //Préparation mode fonctionnement CO2 COZIR
POTLESS_2 4:d84250f67dec 197 serialMonit.printf("reponse demande pooling => K %5i\r\n", cozirSend("K 2"));
POTLESS_2 4:d84250f67dec 198 serialMonit.printf("reponse demande filtrage => A %5i\r\n", cozirSend("A 32"));
POTLESS_2 4:d84250f67dec 199 serialMonit.printf("reponse calibration => G %5d\r\n", cozirSend("G"));
POTLESS_2 4:d84250f67dec 200
potless 0:69d4b21d58e0 201 }
potless 0:69d4b21d58e0 202
potless 1:bef7856b5c0a 203 /////////////////////////////////////
potless 1:bef7856b5c0a 204 /// procédure principale /////////
potless 1:bef7856b5c0a 205 /////////////////////////////////////
potless 0:69d4b21d58e0 206
POTLESS_2 4:d84250f67dec 207 int main()
POTLESS_2 4:d84250f67dec 208 {
POTLESS_2 4:d84250f67dec 209 setup(); //initialisation capteurs
potless 2:4a8bf1d53439 210
POTLESS_2 4:d84250f67dec 211 while (1) {
POTLESS_2 4:d84250f67dec 212 //CO2 / H / T sur Cozir
POTLESS_2 3:bc6d4222db12 213 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 214 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 215 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 216 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 217 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 218 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 4:d84250f67dec 219 //P / T sur MS5803
POTLESS_2 3:bc6d4222db12 220 ps.convert();
POTLESS_2 4:d84250f67dec 221 serialMonit.printf(" Pression MS5803 = %f\r\n", ps.pressure);
POTLESS_2 4:d84250f67dec 222 serialMonit.printf(" Temperature MS5803 = %f\r\n", ps.temperature);
POTLESS_2 4:d84250f67dec 223 //PPO2 sur ADS1015
POTLESS_2 4:d84250f67dec 224 //reading = ads.readADC_Differential_2_3();
POTLESS_2 4:d84250f67dec 225 serialMonit.printf(" PPO2 sur ADS1015 : %d\r\n", requestPpO2()); // print diff
POTLESS_2 4:d84250f67dec 226 wait_ms(2000);
POTLESS_2 4:d84250f67dec 227 }
POTLESS_2 4:d84250f67dec 228 }