Surveillance CO2

Partagez ici vos guides et explications

Surveillance CO2

Messagepar Cen » 30 Avr 2018 17:18

Introduction
Je vous présente un petit montage simple pour environ 25€ qui vous permet de surveiller la qualité de votre air (CO2) depuis la boite eedomus.

1-MontageFace1.jpg
1-MontageFace1.jpg (438.71 Kio) Consulté 9378 fois


2-MontageFace2.jpg
2-MontageFace2.jpg (544.5 Kio) Consulté 9378 fois


Le matériel
Cette solution se base sur le matériel suivant
• Un module « NodeMCU ESP8260 », acheté sur Wish pour 3 Euros
• Un capteur MH-Z19 aussi sur Aliexpress pour 22$
• Une alimentation 5V, 3W, 1.5$
3-Materiel.jpg
3-Materiel.jpg (577.53 Kio) Consulté 9378 fois



Fonctionnement
Le module se connecte à votre WiFi et il envoie les informations à la boite eedomus. Le module lit le capteur CO2 toutes les minutes. Il envoie l’information toutes les 30 minutes à la boite eedomus ainsi qu’à tout changement de plus de 10ppm par rapport à la valeur précédente. En procédant ainsi, on ne pollue ni le réseau WifI, ni les log de la boites eedomus, on n’envoie qu’une trame chaque 30 minutes, ou plus s’il y a un changement conséquent.


Le ESP8266
Pour mettre en route l’environnement de développement pour le NodeMCU ESP8266, je me suis basé sur les mini tutos que vous trouverez à cette adresse :
https://easycoding.tn/index.php/nodemcu/

La mise en œuvre est simple et rapide : en moins d’une heure, je pouvais déjà actionner la led interne du NodeMCU, et une heure plus tard, je pouvais faire la même chose, mais par Wifi. Bref, c’est un module assez impressionnant.


Le capteur CO2 MH-Z19
Je vous laisse récupérer la documentation sur Internet. Ce module me semble très fiable et les tests à disposition sur Internet sont positifs.
Quelques remarques
1) Le MH-Z19 fonctionne entre 3.6 et 5.6V. il faut donc l’alimenter en 5V. Par contre, ces pins in/out (Rx, Tx, PWM) sont en 3.3V, ce qui est parfait pour notre ESP8266 qui lui fonctionne en 3.3V.
2) A la mise sous tension, il lui faut quelques secondes pour répondre. Donc, pas de panique si la première lecture est mauvaise, laissez-lui 2 minutes
3) Je l’ai relié au NodeMCU par son port série, fonctionnant en 9600 bits/s (8bits, 1 stop bit, no parity)

Concernant le CO2, il y a un site très bien qui explique cela en détail
http://www.th-industrie.com/content/13-mesure-co2

Je propose de fixer une alarme dès que la valeur dépasse 800 ppm



Le montage hardware
Attention, on « joue » quand même avec du 220V, donc prenez toutes les dispositions de sécurité nécessaire. Si vous préférez, vous pouvez alimenter le tout par le connecteur USB du ESP8266, pour éviter le transfo et toucher au 220V (voir mon tuto sur l’automatisation d’une porte de garage).

Voici le schéma, super simple, qui montre donc comment ces 3 composants (l’alimentation, le capteur et le microprocesseur sont reliés entre eux. PWM est facultatif, j’ai fait l’essai et je trouve les mêmes informations qu’en utilisant Rx/Tx. Le programme que je vous donne fonctionne uniquement avec Rx/Tx.

4-Circuit1.jpg
4-Circuit1.jpg (60.26 Kio) Consulté 9378 fois


5-Circuit2.jpg
5-Circuit2.jpg (749.7 Kio) Consulté 9378 fois



Et j’ai mis tout cela dans une petite boite, les circuits étant fixés sur un petit morceau de lino.




Le programme

Il vous faudra modifier ce programme ainsi
• Fixer vos informations WiFi : adresses IP, gateway et subnet, SSID et mot de passe
• Fixer vos codes api_user et api_secret et l’identifiant donné dans le menu « Paramètres Expert » de votre périphérique (voir la section « Configuration eedomus »). J’ai mis des XXX ou YYY là où il faut adapter

Quelques informations sur ce programme. Bien sûr, tout peut être modifié à votre guise
• Comme explicité plus haut, le module est programmé pour envoyer l’information toutes les 30 minutes à la boite eedomus, ainsi qu’à tous changements de plus de 10ppm par rapport à la valeur précédente. Ces valeurs sont dans des « define », donc vous pouvez les adapter à votre besoin
• Le programme utilise le port série 2, Tx (D6, pin 12) et Rx (D7, pin13), paramétré comme le demande le module MH-Z19 à 9600 bits/s. Le port série 1 reste disponible pour le terminal, si nécessaire
• La fonction « ReadCO2 » a été reprise d’un site. Je donne la référence dans le code. Merci à l’auteur !!
• Pour tester le module sans la boîte eedomus, il suffit d’entrer dans un Explorer : http://192.168.0.XX/CO2
Code : Tout sélectionner
/*
[Description]
Monitor CO2 based on the MH-Z19 sensor

[Version] Version 1.0 - CEN, April 2018

[IP] 192, 168, 0, 45

[Last update] 29.04.2018

[Commands]
192.168.0.40/CO2
   
[Changes]

*/


#include <SoftwareSerial.h>
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>


//Const
const char* ssid = "XXX";                   //WiFi ID
const char* password = "XXX";               //WiFi PWD


//Static IP, Gateway and Subnet
IPAddress staticIP (192,168,0,XXX);
IPAddress gateway (192,168,0,1);
IPAddress subnet(255,255,255,0);


//Variables
HTTPClient http;          //Declare an object of class HTTPCLient
int httpCode;
String s;                      //Contain http answer


//MH_Z19 CO2 sensor
#define MH_Z19_TX 12            //D6
#define MH_Z19_RX 13            //D7
#define CO2Interval 60000       //To read the sensor every minutes
#define eedomusInterval 1800000 //To send the information to the eedomus every 30 minutes
unsigned long CO2TimerRead;     //To pool the CO2 sensor every minute
unsigned long CO2TimerEedomus;  //To send the information to the eedomus
int ppm=0, previousppm=0;       //CO2 value read from the sensor


//Initialize Serial 2
SoftwareSerial co2Serial(MH_Z19_RX, MH_Z19_TX);


//eedomus information
//IP_Eedomus = "192.168.0.XXX";
//PeriphID_Eedomus = "YYY";
//api_user=ZZZ
//api_secret=WWW
const char* eedomusCO2H= "http://192.168.0.XXX/api/set?action=periph.value&periph_id=YYY&value=";
const char* eedomusCO2F= "&api_user=ZZZ&api_secret=WWW";


//Start server
WiFiServer server(80);


void setup() {
  Serial.begin(115200);     //Init console
  co2Serial.begin(9600);    //Init sensor MH-Z19

  //Connect to Wi-Fi network with SSID and password
  Serial.print("Connecting to ");Serial.print(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); }
 
  CO2TimerRead=millis();    //CO2 sensor is read in 1 minutes
  CO2TimerEedomus=millis(); //Info reported every 30 minutes
}



void loop()
{
  //Pull the CO2 Sensor every minute
  if ((millis()  - CO2TimerRead) > CO2Interval) {
    CO2TimerRead=millis();                           //Reinitialize the timer
    ppm = readCO2();                                 //Read the sensor
    if (abs(ppm-previousppm) > 10) {                 //If diff is greater than 10, inform the eedomus
      s=eedomusCO2H + String(ppm)  + eedomusCO2F;    //s contains the http string to be sent
      http.begin(s);                                 //Open connection
      httpCode = http.GET();                         //Send
      http.end();                                    //Close connection
    }
    previousppm=ppm;                                 //Store current ppm into previousppm
  }

  //Send the last value of ppm to the eedomus every CO2TimerEedomus (set to 15min)
  if ((millis()  - CO2TimerEedomus) > eedomusInterval) {
    CO2TimerEedomus=millis();                       //Reinitialize the timer
    s=eedomusCO2H + String(ppm)  + eedomusCO2F;     //s contains the http string to be sent
    http.begin(s);                                  //Open connection
    httpCode = http.GET();                          //Send
    http.end();                                     //Close connection
  }

 

  //////////////////////////////////////////////////
  //Command received, treat request
  //////////////////////////////////////////////////
  WiFiClient client = server.available();
  if (client) {
    String request = client.readStringUntil('\r');    // Read the first line of the request
    client.flush();

    if (request.indexOf("CO2") != -1) {
     s=  "<!DOCTYPE HTML>\r\n<html><body>";     
     ppm = readCO2();
     s+=String(ppm);
     s+= "<br></body></html>\r\n";
     client.printf("HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nContent-Length: %u\r\n\r\n%s",s.length(), s.c_str());
    } else {
     s= "<!DOCTYPE HTML>\r\n<html><body>Command not found<br></body></html>\r\n";
     client.printf("HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nContent-Length: %u\r\n\r\n%s",s.length(), s.c_str());
    } //if (request.indexOf("UPTIME") != -1)
  } //if (client)
 
  delay(1);
}  //loop



//From site https://github.com/jehy/arduino-esp8266-mh-z19-serial/blob/master/arduino-esp8266-mh-z19-serial.ino
int readCO2()
{
  byte cmd[9] = {0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79};  // command to ask for data
  byte response[9];                                                      // for answer

  co2Serial.write(cmd, 9);           //request PPM CO2
  while (co2Serial.available() > 0 && (unsigned char)co2Serial.peek() != 0xFF) co2Serial.read();   // The serial stream can get out of sync. The response starts with 0xff, try to resync
  memset(response, 0, 9);            //Reset buffer with 0
  co2Serial.readBytes(response, 9);  //Read 9 bytes
     
  if (response[1] != 0x86)
  {
    Serial.println("Invalid response from co2 sensor!");
    return -1;
  }

  byte crc = 0;
  for (int i = 1; i < 8; i++) crc += response[i];
  crc = 255 - crc + 1;

  if (response[8] == crc) {
    int responseHigh = (int) response[2];
    int responseLow = (int) response[3];
    int ppm = (256 * responseHigh) + responseLow;
    return ppm;
  } else {
    Serial.println("CRC error!");
    return -1;
  }
}




La configuration eedomus
A ce stade, le plus dur est fait ! Il suffit de créer un état virtuel :
• Nom: CO2 Séjour
• Usage : Autre
• Pièce: Séjour
• Unité ppm
• Type de donnée : Nombre décimal

Choisir une bonne icone et fixer le numéro de l’API dans le programme. Pour cela, il faut récupérer l’identifiant donné dans le menu « Paramètres Expert » et le renseigner dans code.

6-eedomus.jpg
6-eedomus.jpg (70.54 Kio) Consulté 9378 fois



Je vous laisse ensuite fixer les alarmes nécessaires lorsque le PPM est supérieure à 800. Chez moi, mon haut-parleur MP3 (voir mon tuto à ce sujet) me l’indique, et je m’envoie aussi un mail /SMS.



Conclusions
Ce circuit ESP8266 est vraiment impressionnant. Il se programme comme un Arduino, offre des possibilités énormes, et cela pour quelques euros. Ce « montage maison » fonctionne parfaitement, tout comme tous mes autres montages à base de ce ESP8266. Ce module remplace un module z-wave qui ne vaut pas loin de 100 € !

Je vous laisse voir aussi mes autres tutos
• Haut-parleur HIFI télécommandé par la eedomus, capable de jouer des sons MP3 préenregistrés tels que aboiements, alarme, messages de bienvenue, musique …).
• Gamelle pour chat connectée à l’eedomus
• Ouverture porte de garage, avec retour information si la porte est ouverte ou fermée
• Chauffage, suivi de la consommation mazout


Je travaille actuellement sur un écran led matrix de 64x16, permettant à la eedomus d’envoyer des messages et sur une main de robot, permettant à la box eedomus de dire si tout va bien (le pouce levé) ou alors donner un code d’erreur en montrant 2, 3, 4 ou 5 doigts).

Avez-vous d’autres idées, des commentaires?
Cen
 
Messages : 53
Inscription : 14 Oct 2015

Re: Surveillance CO2

Messagepar merguez07 » 30 Avr 2018 17:33

merci pour le big job et ton partage
tuto 1 -->Programmation des scripts Eedomus
tuto 2 -->SmartDevice
tuto 3 -->Le déclenchement de règles
scripts -->Météo du jour | GH Thermostat | TotalWatt | Detecfire | smartbattery
Skype Eedomus -->lien vers le skype Eedomus
merguez07
 
Messages : 2346
Inscription : 15 Sep 2017
Localisation : Le Teil en Ardèche

Re: Surveillance CO2

Messagepar Cen » 30 Avr 2018 17:36

Welcome!! En espérant que ça serve!
Cen
 
Messages : 53
Inscription : 14 Oct 2015

Re: Surveillance CO2

Messagepar Flo » 30 Avr 2018 19:30

ENORME !

je mettrai tout ca a execution a la remise en route de la cheminée !!!

merci a toi !
Flo
 
Messages : 56
Inscription : 11 Avr 2018
Localisation : Bordeaux

Re: Surveillance CO2

Messagepar dplein » 01 Mai 2018 08:45

Superbe Cen,

Ca laisse envisager d'autres montages avec différents capteurs !!!!
Irradié.... RAC v2
dplein
 
Messages : 1680
Inscription : 28 Oct 2012
Localisation : Lorraine

Re: Surveillance CO2

Messagepar galaksy2001 » 02 Mai 2018 14:18

Merci pour le partage.

Je me mets ce tuto sous le coude pour les prochaines vacances ;)
galaksy2001
 
Messages : 727
Inscription : 06 Jan 2014

Re: Surveillance CO2

Messagepar gaultier » 03 Mars 2024 18:57

Merci d'avoir partagé ce projet. Je l'ai mis à profit pour faire un capteur de T° pour mon chauffe eau.
Mais pour ceux qui voudraient aussi utiliser ce programme attention la méthode http.begin () de la class HTTPClient est maintenant obsolète.

Il faut déclarer une instance de la class WiFiClient de la bibliothèque WiFiClient.h
Par exemple :
WiFiClient wificlient;

et remplasser
http.begin(s);
par
http.begin(wificlient,s);

Voila ma petite contribution ;)
gaultier
 
Messages : 2
Inscription : 08 Nov 2021


Retour vers Tutoriels

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 8 invité(s)

cron