Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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);
+ }
+}
