Les capteurs physico-chimiques de la série MQx et notamment le capteur environnement MQ135 donnent des résultats assez approximatifs car ils sont basés sur une extrapolation des mesures à partir d’une courbe théorique. Par ailleurs, les capteurs physico-chimiques nécessitent un préchauffage long (au moins 2 minutes) et par conséquent un fonctionnement en continue si l’on veut obtenir des mesures réalistes de la présence de CO2 dans l’atmosphère ambiante. Pour mesure la teneur en CO2 dans votre maison, je vous conseille plutôt d’utiliser un capteur auto-calibré. Le MH-Z19 de Wensen est un capteur économique qui permet de mesurer la teneur en CO2 jusqu’à 5000ppm. Dans ce tutoriel, nous allons voir comment récupérer le taux de CO2 sur la broche PWM du MH-Z19 et publier la mesure sur Domoticz.
Sommaire
Matériel nécessaire
Le code fonctionne sur ESP8266 ainsi que sur ESP32. Pour ce tutoriel, nous allons utiliser la sortie PWM du MH-Z19. Une seule entrée sur la carte ESP8266/ESP32 sera nécessaire.
Le MH-Z19 est donc un capteur auto-calibré, c’est à dire que la mesure envoyée par le capteur ne nécessite aucun traitement mathématique. Autrement dit, on récupère le teneur en CO2 exprimée en ppm (partie par million). Le MH-Z19 dispose d’une sortie PWM ainsi qu’une interface numérique UART (port série). Pour ce tutoriel, nous allons déjà commencer par exploiter la sortie PWM.
Plage de mesure | 0 – 5000ppm |
Précision | ± 50ppm+5% de la valeur moyenne |
Tension de travail | 3.6 ~ 5.5 VDC |
Courant moyen | < 18 mA |
Tension de l’interface | 3.3 V |
Sorties numériques | UART et PWM |
Temps de préchauffage | 3 minutes |
Température de fonctionnement | 0 ~ 50 ℃ |
Humidité de fonctionnement | 0 – 95% (sans condensation) |
Dimensions | 33 mm×20 mm×9 mm (L×W×H) |
Poids | 21g |
Durée de vie annoncée | > 5 ans |
Le signal PWM est proportionnel à la concentration en CO2.
On devra donc mesurer le temps durant lequel le signal reste au niveau haut. Ensuite, la formule suivante permet d’un déduire le taux de CO2.
- Cppm représente la concentration en CO2 dans l’atmosphère en ppm
- Th, le temps pendant lequel le signal est resté au niveau haut
- Tl, le temps pendant lequel le signal est resté au niveau bas
Pour un capteur 0-5000ppm, il suffit de remplacer 2000 par 5000 dans la formule. La documentation complète (en anglais) est disponible ici.
Préparer un appareil virtuel de type qualité de l’air sur Domoticz
Allez sur le serveur Domoticz pour créer un appareil virtuel de type Qualité de l’Air (Air Quality) et récupérez l’Idx de celui-ci. Suivez ce tutoriel pour apprendre comment faire.
Librairies nécessaires
Avant d’aller plus loin, vous aurezz besoin de plusieurs librairies développées pour les tutoriels précédents. Créer un script puis copiez chaque librairie sur le device (ESP8266 ou ESP32) :
Publier le taux de CO2 à Domoticz via l’interface HTTP/JSON
Nous n’allons pas revoir ici comment fonctionne l’envoi de données au serveur Domoticz via l’interface HTTP/JSON. Tout est expliqué en détail dans ce tutoriel. Créer un nouveau script et collez le code ci-dessous. Ensuite, modifiez les paramètres suivants dans le code
- mhz19Type, 5000 (pour la version 5000ppm) ou 2000 (pour la version 2000ppm)
- mhz19, broche sur laquelle est connecté la sortie PWM du MH-Z19
- hold_time_sec, temps d’attente en secondes entre deux publications de mes
- Idx_mhz19, Idx Domoticz de l’instrument virtuel MHZ19 créé précédemment
- domoticzIP, adress IP du serveur Domoticz
- domoticzPort, le port, par défaut 8080
Comme toujours, avant d’exécuter la requête HTTP, il est nécessaire de convertir la mesure de type float en une chaîne de caractères (String). Pour cela, on utilise la fonction format du MicroPython
value = "{:.2f}".format(ppm)
# Mesure de CO2 avec un capteur MH-Z19 en PWM, envoi des mesures vers Domoticz en HHTP/JSON # Mesure CO2 level with a MH-Z19 sensor using PWM signal, send value to Domoticz with HTTP/JSON interface # Code adapte de | code adaptated from # https://github.com/vvel/micropython-esp8266 import machine, time from machine import Pin # Import des modules utilisateurs | Import user modules import ConnectWiFi, domoticz # Verifie si ESP32/ESP8266 est connecte au reseau WiFi | check if ESP32 is connected to the WiFi network ConnectWiFi.connect() # --------------- Reglages | Settings ------------------ mhz19Type = 5000 # or/ou 2000 ppm mhz19 = machine.Pin(4, Pin.IN) hold_time_sec = 10 # Temps attente | wait for n secondes before sending values last_trigger = -10 Idx_MHZ19 = "26"# Idx domoticz capteur MH-Z19 | Domoticz Idx MH-Z19 sensor domoticzIP = "192.168.1.24" domoticzPort = 8080 # Adresse IP du serveur Domoticz | Domoticz server IP address d = Domoticz(domoticzIP, domoticzPort ,"") # Mesure le temps des pusations PWM | Start measure PWM pulsations th = 0 tl = 0 h = 0 l = 0 ppm = 0 prevVal = 0 t1 = time.ticks_ms() h = t1 l = t1 while True: i = mhz19.value() t1 = time.ticks_ms() if ( i == 1): if (i != prevVal): h = t1 tl = h - l prevVal = i #print("tl = " , tl) else: if (i != prevVal): l = t1 th = l - h prevVal = i # Ou 2000 si c'est un modele 0-2000ppm | Or 2000 for a 0 to 2000ppm range sensor if (tl != 0): ppm = mhz19Type * (th - 2) / (th + tl - 4) #print("tl = " , tl,th) print("PPM = " , ppm) if time.time() - last_trigger > hold_time_sec: last_trigger = time.time() try: value = "{:.2f}".format(ppm) return_code = d.setAirQuality(Idx_MHZ19,value) print("Request result: "+str(return_code)) except Exception as e: print("Request failed") print(e)
Enregistrez le script du projet puis envoyez le sur l’ESP8266/ESP32 avec la touche F5. Si tout est correct, vous devez recevoir un code 200 à chaque requête HTTP.
L’appareil virtuel affichant la teneur en CO2 dans la pièce s’actualise après quelques secondes sur Domoticz. Il ne reste plus qu’à ajouter un petit écran OLED et faire la même chose avec du code Arduino !
Avez-vous aimé cet article ?