BBXCo2 où comment mesurer le CO2 avec un CM1106 et un Wemos D1 mini

BBXCo2 où comment mesurer le CO2 avec un CM1106 et un Wemos D1 mini

15 July 2021 0 By Jérôme Ferrari

Salutations à 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