Détecteur de CO2

A l’extérieur, dans l’air ambiant, il y a environ 0,04 % de CO2, ce qui correspond à 400 ppm (parties par million). La respiration humaine en produit aussi un peu (environ 4% de l’air expiré, c’est à dire 40 000 ppm). Donc forcement dans une salle hermétiquement fermée, le taux de CO2 augmente petit à petit.

Quel est le rapport avec la lutte contre la COVID ?

En fait, le COVID peut se transmettre par les petites particules d’eau que l’on rejette en parlant ou en respirant. Comme il est très compliqué de mesurer en temps réel le taux de particules de COVID dans l’air, l’idée est de mesurer l’augmentation du taux de CO2, qui indique la pollution de l’air de la pièce causée par notre respiration.

COVID 19 Imprimé en 3D

Si on atteint un certain seuil, le capteur le signale et oblige à aérer la pièce, pour faire baisser la concentration de particules de CO2 et en même temps de virus.

Le détecteur de CO2

J’ai choisi d’utiliser des modules Grove parce qu’ils sont très facile à brancher. Le capteur CO2 NDIR, température et humidité Grove et le hub I2C Grove m’ont été fourni gratuitement par la boutique Technologie Services. Pour le reste, il s’agissait de matériel que je possédais déjà, mais s’il vous manque élément j’ai mis tous les liens à la fin de l’article.

Il s’agit donc d’un article sponsorisé, cependant je n’ai reçu aucune instructions spécifique et je ne touche aucune rémunération sur la vente de ces produits. J’ai seulement contacté la boutique Technologie services, qui a accepté gentiment de m’envoyer le matériel dont j’avais besoin pour l’article et la vidéo.

Les branchements sont très simples, il suffit de relier le capteur CO2 et l’afficheur LCD aux connecteurs I2C de la carte Shield Grove (insérée sur l’Arduino). Cette carte d’extension possède suffisamment de connecteurs, mais dans le cas contraire, vous pouvez utiliser un Hub I2C.

Branchement du détecteur de CO2

Vous retrouverez ici, le code utilisé dans la vidéo : https://fr.vittascience.com/arduino/?link=61ddbfb9e7d15

Programmation du détecteur de CO2 avec Vittascience

Utilisation de mBlock

Si vous préférez utiliser mBlock5, c’est tout à fait possible puisque l’afficheur LCD et le capteur SCD30 font justement partie des extensions développées par Technologie Services.

Alors, téléchargez et installez la dernière version de mBlock. Lancez le programme, cliquez sur ajouter (à gauche), sélectionnez Arduino Uno et validez en cliquant sur OK.

Cliquez ensuite sur extension (afin d’ajouter les nouveaux blocs)…

Tapez « technologie » dans la barre de recherche et cliquez sur Ajouter en bas de l’icone de Technologie Services.

Les blocs nécessaires au détecteur de CO2 se trouvent dans les catégories TS Capteurs et TS Afficheurs (pour le reste, il s’agit simplement des blocs classiques).

Voilà donc la version mBlock du programme.

Pour le téléverser dans l’Arduino, cliquez sur Connecter, laissez le port sélectionné par défaut, cliquez de nouveau sur Connecter et ensuite sur Télécharger.

Utilisation de l’IDE Arduino

Même si elle est moins intuitive, la programmation en mode texte offre forcement plus de possibilités qu’un langage de bloc (comme Vittascience ou mBlock ).

Pour le capteur de CO2 NDIR, température et humidité Grove (SCD30), on aurait très bien pu installer simplement la bibliothèque Grove. Mais celle d’Adafruit est plus intéressante parce qu’elle permet la calibration du capteur. C’est donc pour ça que je l’ai choisie.

Pour l’installer allez dans Outils – Gérer les bibliothèques et tapez « Adafruit_SCD30 » dans le champ de recherche.

Installation de la bibliothèque "Adafruit_SCD30"

Cliquez sur Installer, puis sur Install all pour ajouter les toutes dépendances et ensuite installez également la bibliothèque « Grove rgb lcd« .

Installation de la bibliothèque "Grove rgb lcd"

Ensuite vous pouvez copier le code suivant dans l’IDE Arduino (et bien sûr lancer le téléversement) :

// Grove Capteur CO2 NDIR SCD30 (arduiblog.com)
#include <Adafruit_SCD30.h>
#include <Wire.h>
#include "rgb_lcd.h"
Adafruit_SCD30  scd30;
rgb_lcd lcd;
// Déclaration des variables
int co2;
int temperature;
int humidite;
void setup(void) {
  if (!scd30.begin()) {
    lcd.setCursor(0, 0);
    lcd.print("Failed to find");
    lcd.setCursor(0, 1);
    lcd.print("SCD30 chip");
    while (1) { delay(10); }
  }
  lcd.begin(16, 2);
  lcd.setRGB(5, 5, 1);
  lcd.setCursor(0, 0);
  lcd.print("Initialisation");
  lcd.setCursor(0, 1);
  lcd.print("du capteur");
}

void loop() {  
  if (scd30.dataReady()){

    if (!scd30.read()){
      lcd.setCursor(0, 0);
      lcd.print("Error reading");
      lcd.setCursor(0, 1);
      lcd.print("sensor data");
      return;
    }    
    co2 = scd30.CO2;
    temperature = scd30.temperature;
    humidite = scd30.relative_humidity;
    lcd.clear();    
    if (co2 > 1500) {
      lcd.setRGB(100, 0, 0);
    }
    else if (co2 > 1000) {
      lcd.setRGB(50, 10, 0);
    }    
    else if (co2 > 800) {
      lcd.setRGB(20, 10, 0);
    }
    else {
      lcd.setRGB(2, 10, 0);
    }
    lcd.setCursor(0, 0);
    lcd.print("CO2 : ");
    lcd.print(co2);
    lcd.print(" ppm");
    lcd.setCursor(0, 1);
    lcd.print("Temp:");
    lcd.print(temperature);
    lcd.print("c Hum:");
    lcd.print(humidite);
    lcd.print("%");
  }
  delay(1000);
}
Affichage du taux de CO2, de la température et du taux d'humidité

Calibration du capteur

Cette étape n’est absolument pas obligatoire. Si vous souhaitez simplement savoir s’il est temps d’aérer la pièce, vous n’avez pas besoin de connaitre avec précision le taux exact de CO2. En cas d’erreur de mesure vous risquez seulement d’ouvrir la fenêtre quelques minutes plus tôt ou plus tard. Mais si vous êtes perfectionniste (comme moi) ou que vous utilisez votre capteur de CO2 pour extraire des données (par exemple, pour faire une station météo), vous serez certainement content d’apprendre qu’il est possible de le calibrer.

Calibration automatique

Le capteur doit fonctionner en continu (sans être débranché) pendant environ 1 semaine. Mais il faut aussi le mettre dehors au moins 1 heure par jour pour qu’il puisse mesurer de l’air contenant très peu de CO2. Je ne sais pas s’il faut aussi le mettre de temps en temps à l’intérieur, mais je n’ai pas essayé parce que c’est long et contraignant.

Calibration manuelle

La bibliothèque Adafruit, offre la possibilité de calibrer manuellement le capteur. Le problème, c’est qu’il faut indiquer au capteur le taux de CO2 ambiant pour qu’il ajuste les prochaines mesures. Pour le connaitre, vous pouvez vous baser sur le taux de CO2 mesuré par un autre capteur (fiable et déjà calibré), ou supposer que dehors, le taux de CO2 est de 400 ppm. Evidement, ça reste approximatif mais pour diminuer la marge d’erreur, vous pouvez aller sur une colline éloignée des grandes routes.

Pour calibrer le capteur (avec la bibliothèque Adafruit), il suffit d’ajouter la ligne de commande suivante (en indiquant le taux de CO2, par exemple 400 ppm) :

scd30.forceRecalibrationWithReference(400); // Calibration à 400 ppm

Il serait possible de déclencher automatiquement la calibration au bout d’un certain temps (pour que le capteur s’habitue à l’air ambiant), mais je préfère ajouter un bouton poussoir et lancer moi-même la procédure.

Reliez le bouton au connecteur D2

Branchement du bouton de calibration manuelle

Téléversez la nouvelle version du programme et laisser dehors le détecteur (branché) pendant 10 minutes environ. Ensuite, vous pouvez appuyer sur le bouton en faisant attention de ne pas souffler d’air en direction du capteur (ce qui fausserait la calibration). Dans cet exemple, la calibration s’effectue à 400 ppm, mais rien ne vous empêche de modifier cette valeur.

// Calibration du Capteur Grove CO2 NDIR SCD30 (arduiblog.com)
#include <Adafruit_SCD30.h>
#include <Wire.h>
#include "rgb_lcd.h"
Adafruit_SCD30  scd30;
rgb_lcd lcd;
const int BOUTON = 2 ; // Le bouton est reliée à la pin 2
// Déclaration des variables
int co2;
int temperature;
int humidite;
unsigned long temps;
void setup(void) {
  pinMode(BOUTON, INPUT); // Le bouton est une entrée
  if (!scd30.begin()) {
    lcd.setRGB(5, 5, 20);
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Failed to find");
    lcd.setCursor(0, 1);
    lcd.print("SCD30 chip");
    while (1) { delay(10); }
  }
  lcd.begin(16, 2);
  lcd.setRGB(5, 5, 1);
  lcd.setCursor(0, 0);
  lcd.print("Initialisation");
  lcd.setCursor(0, 1);
  lcd.print("du capteur");
  temps = millis(); // Temps de départ en millisecondes
}

void loop() {  
  if (scd30.dataReady()){
    if (!scd30.read()){
      lcd.setRGB(5, 5, 20);
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Error reading");
      lcd.setCursor(0, 1);
      lcd.print("sensor data");
      return;
    }    
    if ((millis() - temps) >= 1000){
      co2 = scd30.CO2;
      temperature = scd30.temperature;
      humidite = scd30.relative_humidity;
      lcd.clear();    
      if (co2 > 1500) {
        lcd.setRGB(100, 0, 0);
      }
      else if (co2 > 1000) {
        lcd.setRGB(50, 10, 0);
      }    
      else if (co2 > 800) {
        lcd.setRGB(20, 10, 0);
      }
      else {
        lcd.setRGB(2, 10, 0);
      }
      lcd.setCursor(0, 0);
      lcd.print("CO2 : ");
      lcd.print(co2);
      lcd.print(" ppm");
      lcd.setCursor(0, 1);
      lcd.print("Temp:");
      lcd.print(temperature);
      lcd.print("c Hum:");
      lcd.print(humidite);
      lcd.print("%");
      temps = millis();  //Mise à jour du temps
    }
  }
  // Calibration du capteur
  if (digitalRead(BOUTON) == HIGH){
    lcd.setRGB(5, 5, 20);
    lcd.clear();
    delay(200);
    lcd.setCursor(0, 0);
    lcd.print("Calibration du");
    lcd.setCursor(0, 1);
    lcd.print("capteur en cours");
    scd30.forceRecalibrationWithReference(400); // Calibration à 400 ppm
    delay(1000);
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("La calibration a");
    lcd.setCursor(0, 1);
    lcd.print("ete effectuee");
    delay(4000);
  }
  delay(10);
}

Attention : Vous pouvez utiliser ce programme pour mesurer le taux de CO2, mais il faudra absolument laisser le bouton poussoir branché. Si vous le retirez, vous risquez d’avoir de temps en temps une recalibration intempestive, qui faussera toutes vos mesures.

Pour évitez ce problème, réinstallez l’un des programmes précédents (sans calibration) avant de débrancher le bouton poussoir. Si par la suite vous avez de nouveau besoin de recalibrer le capteur il suffira simplement de recommencer la procédure de calibration (brancher le bouton, téléverser le programme de calibration etc..).

Sources et liens utiles


9 réflexions sur “Détecteur de CO2

    1. Bonjour Aurélien,
      Essayez de supprimer les bibliothèques Adafruit, qui sont par défaut dans le dossier « Mes documents\Arduino\libraries » et de les réinstaller. Si le programme propose d’installer ses dépendances (d’autres bibliothèques) il faut bien sûr accepter.
      Sinon, avec Vitascience et/ou mBlock, ça fonctionne ?

      J’aime

  1. Bonjour et merci pour votre réponse rapide
    je vais tester avec mblock5 cette semaine
    pour l’IDE je suis en train de réinstaller les bibliothéques…je vous tiens informé

    J’aime

Laisser un commentaire