Besoin d'avis pour les codes d'un capteur à CO2 MH-Z16 et MG-811

Bonsoir,

J'ai besoin d'avis avec un projet utilisant un capteur à CO2 MH-Z16 et un capteur MG-811.

Dans le cadre d'un projet pour mes études, notre groupe a décidé de choisir les capteurs à CO2 comme sujet et d'utiliser un système Arduino pour faire des expériences. Du coup moi je dois m'occuper de la partie expérience sauf que je n'ai jamais touché à une carte Arduino auparavant c'est pourquoi j'ai besoin d'avis.

L'expérience consiste à faire des relevés de taux de CO2 dans une pièce tout les X temps et d'enregistrer ces valeurs sur une carte SD. Pour ça j'ai trouvé sur ce site https://passionelectronique.fr/carte-sd-arduino/ un programme de datalogger qui fait pile ce que je veux, sauf que c'est un capteur DHT22. J'ai essayé le montage & le programme pour voir si ça fonctionnait et ça a fonctionné.

Ce que j'ai fait c'est que j'ai pris ce même programme, retirer ce qui me semblait être lié au DHT22 et utiliser le Sample code de la fiche technique du MHZ-Z16 que j'ai trouvé ici https://wiki.dfrobot.com/Infrared_CO2_Sensor_0-50000ppm... que j'ai remplacé sur le programme ce qui m'a donné le programme suivant pour le MH-Z16 :

#include <SD.h>
#include <SoftwareSerial.h>

// Variables utilisées pour la carte SD
const int   sdCardPinChipSelect     = 10;               // Le lecteur de carte SD sera branché sur la pin 10 pour le CS (chip select), 11/12/13 pour le MOSI/MISO/SCK du bus SPI
const char* nomDuFichier            = "donnees.csv";    // Format 8.3 (c'est à dire 8 lettres maximum pour le nom, et optionnellement 3 pour l'extension)
File monFichier;

// Variables utilisées pour le MH-Z16
SoftwareSerial mySerial(6, 7); // RX, TX
unsigned char hexdata[9] = {0xFF,0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x79}; //Read the gas density command /Don't change the order

// Autres variables
const long delaiIntervalleDeMesures = 2000;             // Intervalle de mesure/enregistrement (exprimé en millis secondes)

// ========================
// Initialisation programme
// ========================
void setup () {
  
  // Initialisation de la liaison série (pour retourner les infos au moniteur série de l'ordi)
  Serial.begin(9600);
  Serial.println(F("Programme Capteur CO2"));
  Serial.println(F("==================================================================================================="));
  Serial.println();

  // ----------------------------------------------------------------------------
  // Vérification : est-ce que la carte SD est bien accessible depuis l'arduino ?
  // ----------------------------------------------------------------------------
  Serial.print(F("Initialisation de la carte SD..."));
  if (!SD.begin(sdCardPinChipSelect)) {
    Serial.println();
    Serial.println();
    Serial.println(F("Échec de l'initialisation du lecteur de SD card. Vérifiez :"));
    Serial.println(F("1. que la carte SD soit bien insérée"));
    Serial.println(F("2. que votre câblage soit bon"));
    Serial.println(F("3. que la variable 'sdCardPinChipSelect' corresponde bien au branchement de la pin CS de votre carte SD sur l'Arduino"));
    Serial.println(F("Et appuyez sur le bouton RESET de votre Arduino une fois le pb résolu, pour redémarrer ce programme !"));
    while (true);
  }
  Serial.println(F(" réussie !"));
  Serial.println();

  // ----------------------------------------------------------------------------
  // Initialisation du MH-Z16
  // ----------------------------------------------------------------------------
  
  Serial.begin(9600);
  while (!Serial) {
  }
  mySerial.begin(9600);
}
}

// =================
// Boucle principale
// =================
void loop() {
   mySerial.write(hexdata,9);
   delay(500);

 for(int i=0,j=0;i<9;i++)
 {
  if (mySerial.available()>0)
  {
     long hi,lo,CO2;
     int ch=mySerial.read();

    if(i==2){     hi=ch;   }   //High concentration
    if(i==3){     lo=ch;   }   //Low concentration
    if(i==8) {
               CO2=hi*256+lo;  //CO2 concentration
               }
  }
 }
 
  // Affichage des valeurs sur le moniteur série de l'IDE Arduino
      Serial.print("CO2 concentration: ");
      Serial.print(CO2);
      Serial.println("ppm");

  // Enregistrement de ces données sur la carte SD
  monFichier = SD.open(nomDuFichier, FILE_WRITE);
  if (monFichier) {    
    monFichier.print(CO2);
    monFichier.close();                     // L'enregistrement des données se fait au moment de la clôture du fichier
    Serial.println(F("Enregistrement réussi en carte SD"));
  }
  else {
    Serial.println(F("Erreur lors de la tentative d'ouverture du fichier en écriture, sur la carte SD"));
  }

  // Temporisation de X secondes
  Serial.println();
  delay(delaiIntervalleDeMesures);
}

Et le programme suivant pour le MG-811 :

#include <SD.h>
#include "CO2Sensor.h"

// Variables utilisées pour la carte SD
const int   sdCardPinChipSelect     = 10;               // Le lecteur de carte SD sera branché sur la pin 10 pour le CS (chip select), 11/12/13 pour le MOSI/MISO/SCK du bus SPI
const char* nomDuFichier            = "donnees.csv";    // Format 8.3 (c'est à dire 8 lettres maximum pour le nom, et optionnellement 3 pour l'extension)
File monFichier;

// Variables utilisées pour le MG-811
CO2Sensor co2Sensor(A0, 0.99, 100);

// Autres variables
const long delaiIntervalleDeMesures = 2000;             // Intervalle de mesure/enregistrement (exprimé en millis secondes)

// ========================
// Initialisation programme
// ========================
void setup () {
  
  // Initialisation de la liaison série (pour retourner les infos au moniteur série de l'ordi)
  Serial.begin(9600);
  Serial.println("=== Initialized ===");
  
  // ----------------------------------------------------------------------------
  // Vérification : est-ce que la carte SD est bien accessible depuis l'arduino ?
  // ----------------------------------------------------------------------------
  Serial.print(F("Initialisation de la carte SD..."));
  if (!SD.begin(sdCardPinChipSelect)) {
    Serial.println();
    Serial.println();
    Serial.println(F("Échec de l'initialisation du lecteur de SD card. Vérifiez :"));
    Serial.println(F("1. que la carte SD soit bien insérée"));
    Serial.println(F("2. que votre câblage soit bon"));
    Serial.println(F("3. que la variable 'sdCardPinChipSelect' corresponde bien au branchement de la pin CS de votre carte SD sur l'Arduino"));
    Serial.println(F("Et appuyez sur le bouton RESET de votre Arduino une fois le pb résolu, pour redémarrer ce programme !"));
    while (true);
  }
  Serial.println(F(" réussie !"));
  Serial.println();

  // ----------------------------------------------------------------------------
  // Initialisation du MG-811
  // ----------------------------------------------------------------------------
  co2Sensor.calibrate();

// =================
// Boucle principale
// =================
void loop() {
  int CO2 = co2Sensor.read();
 
  // Affichage des valeurs sur le moniteur série de l'IDE Arduino
      Serial.print("CO2 concentration: ");
      Serial.print(CO2);
      Serial.println("ppm");

  // Enregistrement de ces données sur la carte SD
  monFichier = SD.open(nomDuFichier, FILE_WRITE);
  if (monFichier) {    
    monFichier.print(CO2);
    monFichier.close();                     // L'enregistrement des données se fait au moment de la clôture du fichier
    Serial.println(F("Enregistrement réussi en carte SD"));
  }
  else {
    Serial.println(F("Erreur lors de la tentative d'ouverture du fichier en écriture, sur la carte SD"));
  }

  // Temporisation de X secondes
  Serial.println();
  delay(delaiIntervalleDeMesures);
}

La seule modification que j'ai fait c'est que pour le code du MH-Z16, le module de la carte SD utilise les pins 10 et 11 qui sont aussi utilisés dans le Sample code du capteur du coup pour le capteur j'ai opté pour les emplacements 6 et 7. Qu'en pensez vous ? Je tiens à dire que je peux pas tester les programmes car on a toujours pas reçu les capteur mais on a une présentation prochainement du coup j'dois faire avec.

Merci.

Je vois une incohérence dans ce qui est au dessus:

  • Dans la bibliothèque, on a la ligne:
    CO2Sensor co2Sensor(A0, 0.99, 100);
    Qui indique que le capteur se lit par une seule entrée analogique, en l’occurrence A0 (et pas 6 ou 7)
  • Sur la photo, le capteur a deux broches (hormis les alimentations) TX et RX qui indique une lecture numérique série.

<Blague>Je vois aussi le mot "Gravity" sur la plaque. C'est un capteur qui mesure la gravité de la situation?</Blague>
Enfin pas vraiment il y a bien Gravity qui indique une deuxième incohérence.