BBXCo2 où comment mesurer le CO2 avec un CM1106 et un Wemos D1 mini
15 juillet 2021Salutations à tous, cette fois je vous propose un tutoriel ayant pour but de fabriquer un capteur mesurant les ppm de CO2 en utilisant un CM1106 couplé avec un Wemos afin d’envoyer les données via MQTT sur Jeedom
Partie 0: Le matériel choisi
- Un CM1106
Ce capteur à l’avantage de ne pas être cher et surtout ne pas s’user car il n’utilise pas de réactif chimique pour déterminer le taux de CO2. Je vous mets ci-dessous le principe de détection et d’utilisation
Ainsi que le document complet de son fonctionnement et comment le faire marcher
J’ajoute aussi la documentation sur le protocole de communication car j’avais galéré à le trouver à l’époque
- Un Wemos D1 mini
Comme d’habitude j’utilise ce petit module car il est peu cher et surtout compact en plus d’avoir le wifi
- j’ai aussi créé un PCB et un boitier 3D afin de mettre au propre ce capteur et pouvoir l’installer n’importe où
Le PCB se trouve ici:
Les fichiers STL se trouvent ici:
https://www.thingiverse.com/thing:4908278
Maintenant que nous avons tous les éléments, nous pouvons nous amuser à le faire fonctionner ce capteur.
Partie 1: Câblage du CM1106 sur le Wemos
Le câblage du CM1106 sur le Wemos est vraiment simple car il ne necessite que de 5 câbles. (Le 5V, le GND, SDA, SCL et le R/T) comme le montre le schéma et le tableau suivant:
Il faut alors câbler de la façon suivante:
Wemos <-> CM1106
5V <-> 5V
G <-> GND
D1 <-> SCL
D2 <-> SDA
G <-> R/T (pour le mettre en mode I2C
Voilà maintenant que les 2 sont branchés ensemble, nous pouvons commencer la partie codage.
Partie 2: Programmation
Pour commencer à programmer le Wemos, il faut d’abord configurer l’IDE Arduino. Pour cela, je vous laisse jeter un coup d’oeil à mon précédent article: https://miniprojets.net/index.php/2019/08/23/creation-dun-enregistreur-autonome-de-puissance-electrique-monophase-base-sur-un-wemos-d1-mini-dun-shield-rtc-sd-et-dun-pzem004t/
Maintenant que l’IDE est prêt, il faut ajouter la librairie faite par neosarchizo
https://github.com/neosarchizo/cm1106_i2c
Comme d’habitude je mets ici le zip de la version que j’utilise (pensez à changer l’extension en .zip pour l’inclure dans l’IDE Arduino)
Maintenant que tout est ok, on peux commencer à coder
Pour cela, il suffit de prendre l’exemple de base suivant:
#include <cm1106_i2c.h>
CM1106_I2C cm1106_i2c;
void setup() {
cm1106_i2c.begin();
Serial.begin(9600);
delay(1000);
cm1106_i2c.read_serial_number();
delay(1000);
cm1106_i2c.check_sw_version();
delay(1000);
}
void loop() {
int ret= cm1106_i2c.measure_result();
if (ret == 0) {
Serial.print("Co2 : ");
Serial.println(cm1106_i2c.co2);
Serial.print("Status : ");
switch (cm1106_i2c.status) {
case CM1106_I2C_STATUS_PREHEATING: {
Serial.println("Preheating");
break;
}
case CM1106_I2C_STATUS_NORMAL_OPERATION: {
Serial.println("Normal operation");
break;
}
case CM1106_I2C_STATUS_OPERATING_TROUBLE: {
Serial.println("Operating trouble");
break;
}
case CM1106_I2C_STATUS_OUT_OF_FS: {
Serial.println("Out of FS");
break;
}
case CM1106_I2C_STATUS_NON_CALIBRATED: {
Serial.println("Non calibrated");
break;
}
}
}
}
Maintenant uploader sur le Wemos et ouvrez le terminal.
Vous devriez avoir quelquechose comme cela
Puis au bout de quelques instants il passera en normal opération
Voilà maintenant nous pouvons le lier au MQTT comme dans l’article
Partie 3: Envoyer les données sur MQTT
On passe maintenant à la partie MQTT. Pour cela je vous invite d’abord à configurer votre raspberry ou autres avec les liens suivants:
Installation de Jeedom — > Voir mon précédent article https://miniprojets.net/index.php/2019/05/13/jeedom-ou-comment-domotiser-sa-maison-en-quelques-clics/
Installation de Mosquitto –> Je vous conseille le site suivant https://projetsdiy.fr/jeedom-mqtt-objets-connectes-domotique-diy/
Il faut aussi installer la librairie MQTT dans l’IDE Arduino pour pouvoir faire la connexion entre le Wemos et Mosquitto.
Je vous conseille d’utiliser la librairie faite par knolleary
https://github.com/knolleary/pubsubclient
Comme d’habitude je mets ici le zip de la version que j’utilise (pensez à changer l’extension en .zip pour l’inclure dans l’IDE Arduino)
Maintenant que tout est ok et installé, il suffit de copier/coller le code suivant puis de changer les informations
- YOUR_SSID
- YOUR_WIFI_PASSWORD
- YOUR_MQTT_SERVER_IP_ADRESS
- Changer le topic « bbxco2/ch1 » (ici indique que le capteur est dans la chambre 1) par celui que vous voulez
- Si jamais vous installé plusieurs capteur sur le même réseau, il faut aussi changer le nom « BBXCO2 » dans la ligne « if (client.connect(« BBXCO2″, mqtt_user, mqtt_password)) { » par le nom « BBXCO2_1 » (pour le capteur 1), « BBXCO2_2 » (pour le capteur 2),…… car sinon les clients vont se déconnecter à chaque fois.
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <cm1106_i2c.h>
#define wifi_ssid "YOUR_SSID"
#define wifi_password "YOUR_WIFI_PASSWORD"
#define mqtt_server "YOUR_MQTT_SERVER_IP_ADRESS"
#define mqtt_user "guest" //s'il a été configuré sur Mosquitto
#define mqtt_password "guest" //idem
#define co2_topic "bbxco2/ch1" //Topic co2
CM1106_I2C cm1106_i2c;
//Buffer qui permet de décoder les messages MQTT reçus
char message_buff[100];
long lastMsg = 0; //Horodatage du dernier message publié sur MQTT
long lastRecu = 0;
bool debug = false; //Affiche sur la console si True
int ret = 500;
WiFiClient espClient;
PubSubClient client(espClient);
void setup() {
cm1106_i2c.begin();
Serial.begin(9600);
setup_wifi(); //On se connecte au réseau wifi
client.setServer(mqtt_server, 1883); //Configuration de la connexion au serveur MQTT
delay(1000);
cm1106_i2c.read_serial_number();
delay(1000);
cm1106_i2c.check_sw_version();
delay(1000);
}
//Connexion au réseau WiFi
void setup_wifi() {
delay(10);
Serial.println();
Serial.print("Connexion a ");
Serial.println(wifi_ssid);
WiFi.begin(wifi_ssid, wifi_password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("Connexion WiFi etablie ");
Serial.print("=> Addresse IP : ");
Serial.print(WiFi.localIP());
}
//Reconnexion
void reconnect() {
//Boucle jusqu'à obtenur une reconnexion
while (!client.connected()) {
Serial.print("Connexion au serveur MQTT...");
if (client.connect("BBXCO2", mqtt_user, mqtt_password)) {
Serial.println("OK");
} else {
Serial.print("KO, erreur : ");
Serial.print(client.state());
Serial.println(" On attend 5 secondes avant de recommencer");
delay(5000);
}
}
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
long now = millis();
//Envoi d'un message par 5 minute
if (now - lastMsg > 1000 * 60) {
lastMsg = now;
ret= cm1106_i2c.measure_result();
if (ret == 0) {
Serial.print("Co2 : ");
Serial.println(cm1106_i2c.co2);
Serial.print("Status : ");
switch (cm1106_i2c.status) {
case CM1106_I2C_STATUS_PREHEATING: {
Serial.println("Preheating");
break;
}
case CM1106_I2C_STATUS_NORMAL_OPERATION: {
Serial.println("Normal operation");
client.publish(co2_topic, String(cm1106_i2c.co2).c_str(), true);
break;
}
case CM1106_I2C_STATUS_OPERATING_TROUBLE: {
Serial.println("Operating trouble");
break;
}
case CM1106_I2C_STATUS_OUT_OF_FS: {
Serial.println("Out of FS");
break;
}
case CM1106_I2C_STATUS_NON_CALIBRATED: {
Serial.println("Non calibrated");
break;
}
}
}
}
}
Uploader maintenant sur le Wemos et regardez sur le terminal ce que cela donne:
Et voilà vous avez réussi à créer un capteur qui renvoi les informations de CO2 sur MQTT
Partie 4: visualisation des données
Maintenant que le capteur envoie ses données sur MQTT, on peux les visualiser directement sur Jeedom avec l:e plugin MQTT. Pour cela vous pouvez aller voir les articles que j’avais écrit à l’époque soit https://miniprojets.net/index.php/2020/12/19/une-alternative-diy-au-linky-pzem004t-wemos-tasmota-mqtt/ Si vous voulez utiliser le plugin JMQTT soit https://miniprojets.net/index.php/2019/06/04/piloter-une-chaudiere-weishaupt-equipee-dun-wcm-com-avec-jeedom-nodered-et-mqtt/ si vous utilisez le plugin MQTT
Pour cet exemple, j’utilise MQTT donc rendez-vous dans le plugin et recherchez ce topic qui est le main Topic que vous aurez défini précédement
Cliquez dessus
Puis allez dans Commandes vous retrouverez normalement le sous topic correspondant à votre code (ici ch1)
Vous pouvez alors historiser les donées.
Normalement quand vous irez voir l’historique de ce capteur vous devriez avoir quelque chose comme cela
Ici, on voit bien les phases jour/nuit ou activités dans la pièce.
Partie 5: Montage du capteur
Maintenant nous pouvons souder le PCB et fixer le capteur dans son boitier imprimé en 3D. J’ai choisi de le faire entièrement démontable afin de pouvoir lui ajouter par la suite de nouvelles fonctions comme des LEDs pour indiquer le niveau de CO2 ou un afficheur OLED
Voilà, le capteur est prêt à être déployé et j’espère que cet article vous aura plu.
Bonne continuation,
Jérôme Ferrari