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 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?

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 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 }