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