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
Diff: main.cpp
- Revision:
- 4:d84250f67dec
- Parent:
- 3:bc6d4222db12
- Child:
- 5:e1d0dc7940a6
--- a/main.cpp Mon May 01 10:45:18 2017 +0000 +++ b/main.cpp Mon May 01 13:33:54 2017 +0000 @@ -8,75 +8,87 @@ la fonction cozirSend est davantage "sécurisée" -*/ +*/ #include "mbed.h" #include <string> #include "MS5803_14BA.h" - - +#include "Adafruit_ADS1015.h" + #ifdef TARGET_K64F - #define SPI_SCK PTD1 - #define SPI_MOSI PTD2 - #define SPI_MISO PTD3 - #define SPI_CS PTD0 - #define I2C_SDA PTE25 - #define I2C_SCL PTE24 +#define SPI_SCK PTD1 +#define SPI_MOSI PTD2 +#define SPI_MISO PTD3 +#define SPI_CS PTD0 +#define I2C_SDA PTE25 +#define I2C_SCL PTE24 #elif defined(TARGET_KL25Z) - #define SPI_SCK PTD1 - #define SPI_MOSI PTD2 - #define SPI_MISO PTD3 - #define SPI_CS PTD0 - #define I2C_SDA PTE0 - #define I2C_SCL PTE1 +#define SPI_SCK PTD1 +#define SPI_MOSI PTD2 +#define SPI_MISO PTD3 +#define SPI_CS PTD0 +#define I2C_SDA PTE0 +#define I2C_SCL PTE1 #endif +//COM Série Serial serialCozir (PA_11,PA_12,9600); Serial serialMonit (USBTX,USBRX,9600); -char reponse[20]; // buffer + +//Buffer pour Cozir +char reponse[20]; +//Init ADS1015 +I2C i2c(D14, D15); +Adafruit_ADS1015 ads(&i2c, 0x48); +//Variables pour PPO2 +int16_t valeurO2_01 = 0; +int16_t valeurO2_02 = 0; +// pin d2 pour Adc_AlerRdy (fil bleu) : démarre et arrete l'ADC pour sauver l'energie +int Adc_AlerRdy = 2; +float calibO2 = 0; +float gainAmpli = 128.0F; // ADS1115 @ +0,256V gain (16-bit results) gain de l'ampli de l'ADS +//Init MS5803 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) /////////////////////////////////// // fonction de lecture capteur///// /////////////////////////////////// -int request(char commande) { -int index=0; -char ch = ' ';; -int valeurCommande; - +int request(char commande) +{ + int index=0; + char ch = ' ';; + int valeurCommande; + // interrogation capteur -do - { - if (serialCozir.writeable()) { - serialCozir.putc(commande); - serialCozir.putc('\r'); - serialCozir.putc('\n'); + do { + if (serialCozir.writeable()) { + serialCozir.putc(commande); + serialCozir.putc('\r'); + serialCozir.putc('\n'); } - while (!serialCozir.readable()) {} - ch = serialCozir.getc(); -} - -while ( ch != commande); + while (!serialCozir.readable()) {} + ch = serialCozir.getc(); + } + + while ( ch != commande); // attente réponse capteur // le format de la reponse est : Z xxxxx z yyyyy\r\n // c'est uniquement xxxxx qui nous interesse -do -{ - if (serialCozir.readable()) - { - 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 - if (index<20) // index <n b de digits max attendus ? (test pour ne pas depasser la capacité du buffer) - reponse[index++]=ch; // on stocke le caractere reçu et on passe au suivant - } -} while (ch!='\n'); // on s'arrete de lire quand on a recu le retour à la ligne \n de la réponse - + do { + if (serialCozir.readable()) { + 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 + if (index<20) // index <n b de digits max attendus ? (test pour ne pas depasser la capacité du buffer) + reponse[index++]=ch; // on stocke le caractere reçu et on passe au suivant + } + } while (ch!='\n'); // on s'arrete de lire quand on a recu le retour à la ligne \n de la réponse + //reponse[index++]='\x0'; // mettre un zero à la fin de la reponse -sscanf (reponse,"%5d\r\n",&valeurCommande); // on extrait le int de la chaine et on le stocke à l'adresse où pointe valeurCO2 -return valeurCommande; + sscanf (reponse,"%5d\r\n",&valeurCommande); // on extrait le int de la chaine et on le stocke à l'adresse où pointe valeurCO2 + return valeurCommande; } @@ -85,81 +97,132 @@ // on peut envoyer des ordres avec /// // plusieurs digits comme A 32 /// ////////////////////////////////////// -int cozirSend(string commande) { +int cozirSend(string commande) +{ -int index=0; -char ch = ' ';; -int reponseCommande; -int nbDigits = commande.size(); + int index=0; + char ch = ' ';; + int reponseCommande; + int nbDigits = commande.size(); -commande[nbDigits]='\x0'; // on matérialise la fin de la chaine avc '\x0' - + commande[nbDigits]='\x0'; // on matérialise la fin de la chaine avc '\x0' + // interrogation capteur -do - { - if (serialCozir.writeable()) { - for (int j=0;j<nbDigits;j++) { - serialCozir.putc(commande[j]); - //serialMonit.printf(" commande digit %i sur %i => %c\r\n",j,nbDigits-1,commande[j]); // pour le debug - } - serialCozir.putc('\r'); - serialCozir.putc('\n'); + do { + if (serialCozir.writeable()) { + for (int j=0; j<nbDigits; j++) { + serialCozir.putc(commande[j]); + //serialMonit.printf(" commande digit %i sur %i => %c\r\n",j,nbDigits-1,commande[j]); // pour le debug + } + serialCozir.putc('\r'); + serialCozir.putc('\n'); } - while (!serialCozir.readable()) {}; - ch = serialCozir.getc(); -} - -while ( ch != commande[0]); // le format de la réponse reprend la première lettre de l'ordre + while (!serialCozir.readable()) {}; + ch = serialCozir.getc(); + } + + while ( ch != commande[0]); // le format de la réponse reprend la première lettre de l'ordre // attente réponse capteur // exemple pour co2 : le format de la reponse est Z xxxxx z yyyyy\r\n // c'est uniquement xxxxx qui nous interesse -do -{ - if (serialCozir.readable()) - { - 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 - if (index<8) // index <n b de digits max attendus (les autres ne nous interessent pas) - reponse[index++]=ch; // on stocke le caractere reçu et on passe au suivant - } -} while (ch!='\n'); // on s'arrete de lire quand on a recu le retour à la ligne \n de la réponse - + do { + if (serialCozir.readable()) { + 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 + if (index<8) // index <n b de digits max attendus (les autres ne nous interessent pas) + reponse[index++]=ch; // on stocke le caractere reçu et on passe au suivant + } + } while (ch!='\n'); // on s'arrete de lire quand on a recu le retour à la ligne \n de la réponse + //reponse[index++]='\x0'; // mettre un zero à la fin de la reponse -sscanf (reponse,"%5d\r\n",&reponseCommande); // on extrait le int de la chaine et on le stocke à l'adresse où pointe valeurCommande + sscanf (reponse,"%5d\r\n",&reponseCommande); // on extrait le int de la chaine et on le stocke à l'adresse où pointe valeurCommande //serialMonit.printf(" reponse recue => %5d\r\n",reponseCommande); // pour le debug -return reponseCommande; + return reponseCommande; } + +//////////////////////// +// Lecture PPO2 ///// +//////////////////////// +int requestPpO2() +{ + + int result3; + //lecture des deux cellules O2 et P de la carte AQL + + //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é + wait_ms(100); // mettre la pin AlertRdy à 1 pour lancer conversion ADC + valeurO2_01 = ads.readADC_Differential_0_1(); // lecture tension entre bornes cell O2 nmr1 + wait_ms(50); + valeurO2_02 = ads.readADC_Differential_2_3(); // lecture tension entre bornes cell O2 nmr2 + wait_ms(50); + //digitalWrite (Adc_AlerRdy, LOW); // remettre la pin AlertRdy à 0 pour économiser energie + // pour le DEBUG + //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 + //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 + //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 + + result3 = 0.5 * (valeurO2_01 + valeurO2_02) / gainAmpli * calibO2; // valeur en mbar + return result3; +} + /////////////////////////////////// // fonction initialisation ///// /////////////////////////////////// -void setup(){ +void setup() +{ +//Préparation PPO2 avec ADS1015 + ads.setGain(GAIN_SIXTEEN); // set range to +/-0.256V + // calibration cellules O2 + // partie i2c : lecture des deux cellules O2 et P de la carte AQL + //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é + wait_ms(100); -serialMonit.printf("reponse demande pooling => K %5i\r\n", cozirSend("K 2")); -serialMonit.printf("reponse demande filtrage => A %5i\r\n", cozirSend("A 32")); -serialMonit.printf("reponse calibration => G %5d\r\n", cozirSend("G")); - + for (int i = 0; i < 5; i++) { + // proposition : mettre la pin AlertRdy à 1 pour lancer conversion ADC + valeurO2_01 = valeurO2_01 + ads.readADC_Differential_0_1(); // lecture tension entre bornes cell O2 nmr1 + wait_ms(50); + valeurO2_02 = valeurO2_02 + ads.readADC_Differential_2_3(); // lecture tension entre bornes cell O2 nmr2 + wait_ms(50); + } + + valeurO2_01 = valeurO2_01 / 5; + valeurO2_02 = valeurO2_02 / 5; + calibO2 = 208 / (0.5 * (valeurO2_01 + valeurO2_02) / gainAmpli); //(air frais : 208 mbar supposés au moment de la calib) + +//Préparation mode fonctionnement CO2 COZIR + serialMonit.printf("reponse demande pooling => K %5i\r\n", cozirSend("K 2")); + serialMonit.printf("reponse demande filtrage => A %5i\r\n", cozirSend("A 32")); + serialMonit.printf("reponse calibration => G %5d\r\n", cozirSend("G")); + } ///////////////////////////////////// /// procédure principale ///////// ///////////////////////////////////// -int main(){ - setup(); //initialisation capteur +int main() +{ + setup(); //initialisation capteurs - while (1){ + while (1) { + //CO2 / H / T sur Cozir serialMonit.printf(" co2 COZIR par methode cozirSend = %5d\r\n" ,cozirSend("Z")*10); // on multiplie par 10 pour etre en ppm 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) 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% 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% 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 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 + //P / T sur MS5803 ps.convert(); - serialMonit.printf(" Pression MS5803 = %4.1f\r\n", ps.pressure); - serialMonit.printf(" Température MS5803 = %4.1f\r\n", ps.temperature); - wait (1); - }} + serialMonit.printf(" Pression MS5803 = %f\r\n", ps.pressure); + serialMonit.printf(" Temperature MS5803 = %f\r\n", ps.temperature); + //PPO2 sur ADS1015 + //reading = ads.readADC_Differential_2_3(); + serialMonit.printf(" PPO2 sur ADS1015 : %d\r\n", requestPpO2()); // print diff + wait_ms(2000); + } +}