Mesure de CO2 avec une carte Pycom

En situation Covid-19, l’aération régulière d’une pièce est préconisée comme geste barrière pour réduire les aérosols. La mesure de la concentration en CO2 est un indicateur sur la qualité de la ventilation.

Bien qu’il n’existe pas officiellement de seuil, Florence Elias Professeur de Physique, Chercheuse et enseignante à l’Université Paris Diderot fait les recommandation suivantes :

Sans masque la concentration ne doit pas dépasser 600ppm, et avec masque, il est recommandé que la concentration ne dépasse pas 800 ppm.
Sur le système étudié ici, nous utiliserons la led RGB de la carte pycom comme indicateur pour qualité de la ventilation

Utilisation d’un capteur bon marché : SCGP30

Il s’agit d’un capteur de qualité d’air avec une précision typique de 15% des valeurs mesurées.
Le capteur de gaz peut détecter une large gamme de composés organiques volatiles (COV) et H2 et est destiné à la surveillance de la qualité de l’air intérieur. Une fois connecté à votre microcontrôleur, il renverra une lecture de Composé Organique Volatile Total (TVOC) et une lecture équivalente de dioxyde de carbone (eCO2) sur I2C.
La mesure de la concentration d’eCO2 (équivalent en dioxyde de carbone calculé) se fait dans une plage de 0 à 60 000 parties par million (ppm) et la concentration de TVOC (composé organique volatil total) dans une plage de 0 à 60 000 parties par milliard (ppb).
Noter que l’eCO2 est calculé sur la base de la concentration en H2, il ne s’agit pas d’un capteur de CO2 « idéal » pour une utilisation en laboratoire.

  • Le raccordement
    Le capteur nécessite que 2 fils d’alimentation (Vcc =3,3V) et 2 fils pour le bus I2C
    PNG - 276.2 ko
  • La programmation
    Avec le logiciel ATOM, on crée un projet avec un dossier lib pour stocker les librairies
    La librairie du sgp30 est téléchargeable ici

    Dans le fichier boot.py, on désactive la fonction heartbeat, puis on initialise le bus I2C

    PNG - 136.9 ko


    Dans le fichier main.py,

    • on crée un « objet » sgp30 à partir de la libraire importée
    • on initialise le capteur
    • après quelques secondes, on dispose de 2 attributs (co2eq et tvoc) de l’objet précédemment créé qui fournissent respectivement les concentrations en c02 et composants volatiles
    • en fonction de la valeur renvoyée pour le co2, on allume la led RGB d’une couleur différente
      PNG - 1006.2 ko
  • Test
    Dans la vidéo ci-dessous, on observe le résultat d’un test effectué dans une grande pièce, fenêtres fermées avec un seul occupant.
    • Dans un premier temps on mesure une concentration légèrement supérieure à 400, ce qui est cohérent puisque 400 est la concentration en co2 de l’air extérieur.
    • Simplement en soufflant sur le capteur, on voit ( à 25s) que la concentration monte à environ 3000 ppm puis redescend rapidement à une valeur proche de 400.
    • Ensuite ( à 54s ) en approchant près du capteur, un papier sur lequel on a versé une goutte de gel hydro-alcoolique, on voit qu’on arrive à des concentrations très élevées de co2 et de tvoc. Il faudrait vérifier avec un capteur de meilleur qualité s’il est cohérent que la concentration en co2 augmente à ce point.

Utilisation d’un afficheur Oled

Pour rendre le système autonome, on affiche les résultats sur un écran Oled 128x64 qui fonctionne aussi en I2C.

  • Le raccordement
    PNG - 258.8 ko
  • La programmation
    On commence par ajouter la librairie disponible ici dans le dossier lib
    Le fichier boot.py est inchangé
    Dans le fichier main.py, on ajoute la gestion de l’afficheur
    • on crée un « objet » oled à partir de la libraire importée. 0x3c est l’adresse I2C fournie par le connstructeur
    • puis dans la boucle while, on initialise la mémoire écran à 0
    • on positionne la première ligne (co2) du message dans la mémoire écran
    • on positionne la seconde ligne (tvoc) du message dans la mémoire écran
    • on rafraîchit l’affichage sur l’écran
      PNG - 862.3 ko
  • Test

----

Utilisation d’un capteur infrarouge non dispersif (NDIR) :

Pour une mesure plus précise et plus fiable, il est nécessaire d’utiliser un capteur NDIR qui mesure la concentration de CO2, contrairement au capteur précédent (sgp30) qui calcule une concentration (eqCO2) à partir de la mesure d’hydrogène.

D’ailleurs, la législation impose l’utilisation de capteurs NDIR pour la mesure du CO2 dans les ERP.

Nous utiliserons ici le SCD30 fabriqué par SENSIRION

  • Le raccordement
    PNG
    La broche Ready permet de savoir si des données de mesures sont disponibles dans le scd30
  • La programmation
    On commence par ajouter la librairie disponible ici dans le dossier lib
    On modifie le fichier boot.py précédent en diminuant la vitesse de transmission du bus i2c à 40000 bauds pour la rendre compatible avec le scd30.
    PNG - 26.1 ko


    Dans le fichier main.py

    • ligne 5 : on crée un objet scd30 en précisant l’adresse (0x61) sur le bus i2c fournie par le constructeur. on peut l’obtenir en exécutant la commande i2c.scan()
    • ligne 6 : On crée on objet Pin qui permet de lire l’information « datas available » sur la broche ready du capteur. On configure la broche en PULLDOW pour qu’elle soit à zéro en l’absence de connexion physique avec le broche du capteur
    • ligne 7 : On configure le capteur pour qu’il effectue des mesures en continu dès qu’il est sous tension. Cette commande peut être lancée qu’une seule fois. Si on la lance manuellement, on peut la supprimer du programme. L’intervalle de mesure est par défaut de 2s.
    • ligne 12 : On vérifie physiquement (lecture de la broche P11) que les données sont prêtes avant de faire la vérification logicielle (get_status_ready()). Si on ne fait que la vérification logicielle, un conflit apparait sur le bus i2c au bout de quelques centaines de mesures. C’est un bon exemple ici de l’utilité du caractère « séquentiel » de la fonction And en Python (le 2ème opérande n’est évalué que si le 1er est à 1). Donc dans notre cas, on ne fera pas de lecture (donc pas de conflit) sur le bus i2c tant que la broche P11 est à 0. Ce programme a fonctionné plus de 24h sans générer de conflit.
    • ligne 14 : on récupère les données dans un tuple (CO2, Température, % humidité).
    • ligne 15 on affiche les données dans un message préformaté.
PNG - 469.7 ko


  • Calibration du capteur
    • Placer le capteur à l’extérieur à l’abri du soleil et de la pluie
    • Faire fonctionner le capteur pendant 10 minutes
    • Interrompre CTRL+C) le programme pour reprendre la main
    • lancer la commande scd30.set_forced_recalibration(416). 416 étant la valeur moyenne de la teneur en CO2 en mars 2021. source
  • Test
    Dans ce test réalisé en intérieur, fenêtres fermées :
    • après la mesure 10, le capteur a été placé dans un sac rempli d’air expiré.
    • après la mesure 37, le programme a été interrompu pour modifier manuellement l’intervalle entre 2 mesures.


  • À venir
    • Un test comparatif dans une salle de classe des mesures entre les capteurs SGP30 (20€) et SCD30 (60€)

Partager

Imprimer cette page (impression du contenu de la page)