Projet MicroPython, publier le taux de CO2 avec un capteur MH-Z19 vers Domoticz (ESP32/ESP8266) • Domotique et objets connectés à faire soi-même

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.

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.

vxaw8roqtpcz5fsj8eav-9792737

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.

d7t7jelrel8sfj8rckyf-9102176

  • 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 !

veci7isixwinangr8jyt-6526999

Avez-vous aimé cet article ?