mbed-os github
Dependencies: ADS1015 Faulhaber HTU21D_mod MS5837_potless Sensor_Head_RevB_3 USBDevice_dfu Utilsdfu beep
Fork of ARNSRS_testDFU by
main.cpp@5:ff7aa975646c, 2017-05-07 (annotated)
- Committer:
- potless
- Date:
- Sun May 07 17:52:11 2017 +0000
- Revision:
- 5:ff7aa975646c
- Parent:
- 4:d84250f67dec
- Child:
- 6:ebed9093d661
version OK avec L476;
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_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 | 1:bef7856b5c0a | 19 | |
POTLESS_2 | 4:d84250f67dec | 20 | //COM Série |
potless | 5:ff7aa975646c | 21 | Serial serialCozir (PC_12,PD_2,9600);//(PA_0,PA_1,9600);//(PA_11,PA_12,9600); |
potless | 1:bef7856b5c0a | 22 | Serial serialMonit (USBTX,USBRX,9600); |
POTLESS_2 | 4:d84250f67dec | 23 | |
POTLESS_2 | 4:d84250f67dec | 24 | //Buffer pour Cozir |
potless | 5:ff7aa975646c | 25 | char reponse[10]; |
potless | 5:ff7aa975646c | 26 | int indexCozir; |
potless | 5:ff7aa975646c | 27 | |
POTLESS_2 | 4:d84250f67dec | 28 | //Init ADS1015 |
potless | 5:ff7aa975646c | 29 | |
potless | 5:ff7aa975646c | 30 | I2C i2c (PB_7,PB_6);//D14, D15); |
potless | 5:ff7aa975646c | 31 | Adafruit_ADS1115 ads(&i2c, 0x48); |
POTLESS_2 | 4:d84250f67dec | 32 | //Variables pour PPO2 |
POTLESS_2 | 4:d84250f67dec | 33 | int16_t valeurO2_01 = 0; |
POTLESS_2 | 4:d84250f67dec | 34 | int16_t valeurO2_02 = 0; |
POTLESS_2 | 4:d84250f67dec | 35 | // pin d2 pour Adc_AlerRdy (fil bleu) : démarre et arrete l'ADC pour sauver l'energie |
POTLESS_2 | 4:d84250f67dec | 36 | int Adc_AlerRdy = 2; |
POTLESS_2 | 4:d84250f67dec | 37 | float calibO2 = 0; |
POTLESS_2 | 4:d84250f67dec | 38 | float gainAmpli = 128.0F; // ADS1115 @ +0,256V gain (16-bit results) gain de l'ampli de l'ADS |
POTLESS_2 | 4:d84250f67dec | 39 | //Init MS5803 |
potless | 5:ff7aa975646c | 40 | MS5803_14BA ps(PB_7, PB_6, MS5803_ADDRC_L, D1_OSR_4096, D2_OSR_4096); // SDA, SCL, I2C_address (0x76 or 0x77 look at MS5803.h) |
potless | 2:4a8bf1d53439 | 41 | |
POTLESS_2 | 4:d84250f67dec | 42 | |
potless | 5:ff7aa975646c | 43 | void callbackCozir() {reponse [indexCozir++] = serialCozir.getc();} |
potless | 2:4a8bf1d53439 | 44 | |
potless | 2:4a8bf1d53439 | 45 | |
potless | 2:4a8bf1d53439 | 46 | ////////////////////////////////////// |
potless | 2:4a8bf1d53439 | 47 | // fonction communication capteur///// |
potless | 2:4a8bf1d53439 | 48 | // on peut envoyer des ordres avec /// |
potless | 2:4a8bf1d53439 | 49 | // plusieurs digits comme A 32 /// |
potless | 2:4a8bf1d53439 | 50 | ////////////////////////////////////// |
potless | 5:ff7aa975646c | 51 | int cozirSend(char* commande){ |
potless | 2:4a8bf1d53439 | 52 | |
potless | 5:ff7aa975646c | 53 | int reponseInt; |
POTLESS_2 | 4:d84250f67dec | 54 | |
potless | 2:4a8bf1d53439 | 55 | // interrogation capteur |
potless | 2:4a8bf1d53439 | 56 | |
potless | 5:ff7aa975646c | 57 | if (serialCozir.writeable()) { |
potless | 5:ff7aa975646c | 58 | indexCozir = 0; |
potless | 5:ff7aa975646c | 59 | serialCozir.puts(commande); |
POTLESS_2 | 4:d84250f67dec | 60 | } |
potless | 5:ff7aa975646c | 61 | wait(1); |
potless | 5:ff7aa975646c | 62 | //serialMonit.printf("reponse : %s\r\n",reponse); |
potless | 5:ff7aa975646c | 63 | sscanf (reponse,"%s %5d",&commande,&reponseInt); |
potless | 5:ff7aa975646c | 64 | //serialMonit.printf("reponseInt : %d\r\n",reponseInt); |
potless | 2:4a8bf1d53439 | 65 | |
potless | 5:ff7aa975646c | 66 | return reponseInt; |
potless | 5:ff7aa975646c | 67 | /* |
potless | 5:ff7aa975646c | 68 | sscanf (reponse,"%c %5d\r\n",&reponseCommande); // on extrait le int de la chaine et on le stocke à l'adresse où pointe valeurCommande |
potless | 5:ff7aa975646c | 69 | serialMonit.printf(" reponse commande => %c %5d\r\n",reponseCommande); // pour le debug |
potless | 5:ff7aa975646c | 70 | serialMonit.printf(" & reponse commande => %c %5d\r\n",&reponseCommande); // pour le debug |
potless | 5:ff7aa975646c | 71 | serialMonit.printf(" reponse => %c %5d\r\n",reponse); // pour le debug |
potless | 5:ff7aa975646c | 72 | serialMonit.printf(" & reponse => %c %5d\r\n",&reponse); // pour le debug |
POTLESS_2 | 4:d84250f67dec | 73 | return reponseCommande; |
potless | 5:ff7aa975646c | 74 | */ |
potless | 2:4a8bf1d53439 | 75 | } |
POTLESS_2 | 4:d84250f67dec | 76 | |
POTLESS_2 | 4:d84250f67dec | 77 | //////////////////////// |
POTLESS_2 | 4:d84250f67dec | 78 | // Lecture PPO2 ///// |
POTLESS_2 | 4:d84250f67dec | 79 | //////////////////////// |
POTLESS_2 | 4:d84250f67dec | 80 | int requestPpO2() |
POTLESS_2 | 4:d84250f67dec | 81 | { |
POTLESS_2 | 4:d84250f67dec | 82 | |
POTLESS_2 | 4:d84250f67dec | 83 | int result3; |
POTLESS_2 | 4:d84250f67dec | 84 | //lecture des deux cellules O2 et P de la carte AQL |
POTLESS_2 | 4:d84250f67dec | 85 | |
POTLESS_2 | 4:d84250f67dec | 86 | //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 | 5:ff7aa975646c | 87 | |
POTLESS_2 | 4:d84250f67dec | 88 | wait_ms(100); // mettre la pin AlertRdy à 1 pour lancer conversion ADC |
POTLESS_2 | 4:d84250f67dec | 89 | valeurO2_01 = ads.readADC_Differential_0_1(); // lecture tension entre bornes cell O2 nmr1 |
POTLESS_2 | 4:d84250f67dec | 90 | wait_ms(50); |
POTLESS_2 | 4:d84250f67dec | 91 | valeurO2_02 = ads.readADC_Differential_2_3(); // lecture tension entre bornes cell O2 nmr2 |
POTLESS_2 | 4:d84250f67dec | 92 | wait_ms(50); |
potless | 5:ff7aa975646c | 93 | |
POTLESS_2 | 4:d84250f67dec | 94 | //digitalWrite (Adc_AlerRdy, LOW); // remettre la pin AlertRdy à 0 pour économiser energie |
potless | 5:ff7aa975646c | 95 | |
POTLESS_2 | 4:d84250f67dec | 96 | // pour le DEBUG |
POTLESS_2 | 4:d84250f67dec | 97 | //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 | 98 | //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 | 99 | //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 | 100 | |
POTLESS_2 | 4:d84250f67dec | 101 | result3 = 0.5 * (valeurO2_01 + valeurO2_02) / gainAmpli * calibO2; // valeur en mbar |
POTLESS_2 | 4:d84250f67dec | 102 | return result3; |
POTLESS_2 | 4:d84250f67dec | 103 | } |
POTLESS_2 | 4:d84250f67dec | 104 | |
potless | 5:ff7aa975646c | 105 | |
potless | 5:ff7aa975646c | 106 | |
potless | 2:4a8bf1d53439 | 107 | /////////////////////////////////// |
potless | 2:4a8bf1d53439 | 108 | // fonction initialisation ///// |
potless | 2:4a8bf1d53439 | 109 | /////////////////////////////////// |
POTLESS_2 | 4:d84250f67dec | 110 | void setup() |
POTLESS_2 | 4:d84250f67dec | 111 | { |
potless | 5:ff7aa975646c | 112 | serialCozir.attach(&callbackCozir); // on pose une interruption sur le serialCozir |
potless | 5:ff7aa975646c | 113 | |
potless | 5:ff7aa975646c | 114 | //Préparation PPO2 avec ADS1015 |
POTLESS_2 | 4:d84250f67dec | 115 | ads.setGain(GAIN_SIXTEEN); // set range to +/-0.256V |
POTLESS_2 | 4:d84250f67dec | 116 | // calibration cellules O2 |
POTLESS_2 | 4:d84250f67dec | 117 | // partie i2c : lecture des deux cellules O2 et P de la carte AQL |
POTLESS_2 | 4:d84250f67dec | 118 | //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 | 119 | wait_ms(100); |
potless | 5:ff7aa975646c | 120 | |
POTLESS_2 | 4:d84250f67dec | 121 | for (int i = 0; i < 5; i++) { |
POTLESS_2 | 4:d84250f67dec | 122 | // proposition : mettre la pin AlertRdy à 1 pour lancer conversion ADC |
POTLESS_2 | 4:d84250f67dec | 123 | valeurO2_01 = valeurO2_01 + ads.readADC_Differential_0_1(); // lecture tension entre bornes cell O2 nmr1 |
POTLESS_2 | 4:d84250f67dec | 124 | wait_ms(50); |
POTLESS_2 | 4:d84250f67dec | 125 | valeurO2_02 = valeurO2_02 + ads.readADC_Differential_2_3(); // lecture tension entre bornes cell O2 nmr2 |
POTLESS_2 | 4:d84250f67dec | 126 | wait_ms(50); |
POTLESS_2 | 4:d84250f67dec | 127 | } |
POTLESS_2 | 4:d84250f67dec | 128 | |
POTLESS_2 | 4:d84250f67dec | 129 | valeurO2_01 = valeurO2_01 / 5; |
POTLESS_2 | 4:d84250f67dec | 130 | valeurO2_02 = valeurO2_02 / 5; |
POTLESS_2 | 4:d84250f67dec | 131 | calibO2 = 208 / (0.5 * (valeurO2_01 + valeurO2_02) / gainAmpli); //(air frais : 208 mbar supposés au moment de la calib) |
POTLESS_2 | 4:d84250f67dec | 132 | |
potless | 5:ff7aa975646c | 133 | //Préparation mode fonctionnement CO2 COZIR |
potless | 5:ff7aa975646c | 134 | serialMonit.printf("reponse demande pooling => K %5i\r\n", cozirSend("K 2\r\n")); |
potless | 5:ff7aa975646c | 135 | serialMonit.printf("reponse demande filtrage => A %5i\r\n", cozirSend("A 32\r\n")); |
potless | 5:ff7aa975646c | 136 | serialMonit.printf("reponse calibration => G %5d\r\n", cozirSend("G\r\n")); |
POTLESS_2 | 4:d84250f67dec | 137 | |
potless | 0:69d4b21d58e0 | 138 | } |
potless | 0:69d4b21d58e0 | 139 | |
potless | 1:bef7856b5c0a | 140 | ///////////////////////////////////// |
potless | 1:bef7856b5c0a | 141 | /// procédure principale ///////// |
potless | 1:bef7856b5c0a | 142 | ///////////////////////////////////// |
potless | 0:69d4b21d58e0 | 143 | |
POTLESS_2 | 4:d84250f67dec | 144 | int main() |
POTLESS_2 | 4:d84250f67dec | 145 | { |
potless | 5:ff7aa975646c | 146 | serialMonit.printf(" demarrage \r\n"); |
POTLESS_2 | 4:d84250f67dec | 147 | setup(); //initialisation capteurs |
potless | 5:ff7aa975646c | 148 | serialMonit.printf(" init capteur faite \r\n"); |
POTLESS_2 | 4:d84250f67dec | 149 | while (1) { |
POTLESS_2 | 4:d84250f67dec | 150 | //CO2 / H / T sur Cozir |
potless | 5:ff7aa975646c | 151 | serialMonit.printf(" co2 COZIR = %5d\r\n" ,cozirSend ("Z\r\n")*10); // on multiplie par 10 pour etre en ppm |
potless | 5:ff7aa975646c | 152 | serialMonit.printf(" H COZIR = %5d\r\n" ,cozirSend ("H\r\n")); // à laisser comme ça pour transmettre en BLE mais à diviser par 10 à réception dans l'app android pour être en xx,x% |
potless | 5:ff7aa975646c | 153 | serialMonit.printf(" T COZIR = %5d\r\n" ,cozirSend ("T\r\n")-1000); // à laisser comme ça pour envoi BLE et à diviser par 10 à réception dans l'app android pour etre en yy,y°C |
potless | 5:ff7aa975646c | 154 | |
POTLESS_2 | 4:d84250f67dec | 155 | //P / T sur MS5803 |
POTLESS_2 | 3:bc6d4222db12 | 156 | ps.convert(); |
POTLESS_2 | 4:d84250f67dec | 157 | serialMonit.printf(" Pression MS5803 = %f\r\n", ps.pressure); |
POTLESS_2 | 4:d84250f67dec | 158 | serialMonit.printf(" Temperature MS5803 = %f\r\n", ps.temperature); |
potless | 5:ff7aa975646c | 159 | |
POTLESS_2 | 4:d84250f67dec | 160 | //PPO2 sur ADS1015 |
POTLESS_2 | 4:d84250f67dec | 161 | serialMonit.printf(" PPO2 sur ADS1015 : %d\r\n", requestPpO2()); // print diff |
POTLESS_2 | 4:d84250f67dec | 162 | wait_ms(2000); |
POTLESS_2 | 4:d84250f67dec | 163 | } |
POTLESS_2 | 4:d84250f67dec | 164 | } |