Capteur de CO2 : Différence entre versions

De Les Fabriques du Ponant
Aller à : navigation, rechercher
(Programme qui allume les led et diffuse un réseau wifi avec la mesure)
 
(47 révisions intermédiaires par le même utilisateur non affichées)
Ligne 1 : Ligne 1 :
 
En temps de covid, mesurer le taux de CO2 dans l'air d'une pièce peut-être un bon indicateur de la nécessité d'aération.
 
En temps de covid, mesurer le taux de CO2 dans l'air d'une pièce peut-être un bon indicateur de la nécessité d'aération.
 +
 +
[[Fichier:BoitierCapteurCO2.jpg|400px]] [[Fichier:PagewebCapteurCO2.jpg|200px]]
 +
 +
==de quoi s'agit-il ?==
 +
 +
===Avant toute chose===
 +
Il faut saluer et remercier le travail effectué par les personnes qui ont réalisé le site Nousaerons.fr (cliquez sur l'image pour y aller !).
 +
 +
[[Fichier:CopieEcranNousAerons2021.png|link=https://nousaerons.fr/makersco2/|400px]]
 +
 +
D'une manière générale nous citons toutes les sources mobilisées pour réaliser cette page.
 +
 +
===Taux de CO2 et qualité de l'air intérieur===
 +
''Texte tiré de https://projetco2.fr/pourquoi-mesurer-co2''
 +
 +
Le lien entre la qualité de l'air d'une pièce et la concentration en CO2 est donnée par les valeurs caractéristiques suivantes :
 +
 +
*    < 800 ppm : correspond à une qualité d'air excellente selon la norme NF EN 13779 et c'est une recommandation du Haut Conseil de la Santé publique. Cela constitue donc une valeur "cible" à atteindre.
 +
*  entre 800 et 1000 ppm : correspond à une qualité d'air moyenne selon la norme NF EN 13779
 +
*  entre 1000 et 1500 ppm : correspond à une qualité d'air modérée selon la norme NF EN 13779. Cela correspond à des valeurs trop élevées en contexte Covid-19.
 +
*  > 1500 ppm : correspond à une qualité d'air basse selon la norme NF EN 13779. Cela correspond à des valeurs beaucoup trop élevées en contexte Covid-19.
 +
 +
Dans un lieu confiné, il n'est pas rare de dépasser le premier seuil au bout de quelques minutes. C'est le cas dans certaines salles de réunions ou salles de classes mal ventilées.
 +
 +
Attention, il existe des situations spécifiques pour lesquelles les seuils donnés ci-dessus ne sont pas pertinents :
 +
 +
* Ces seuils ne sont pas pertinents dans les salles dans lesquels un recyclage partiel de l'air est assuré par un dispositif de filtration de type HEPA. Cette solution de purification de l'air en milieu clos par filtration doit faire l'objet d'une étude spécifique
 +
* Ces seuils sont donnés pour un taux en "plein air" d'environ 400 à 420 ppm qui sert de référence. Ce taux peut monter dans les grandes métropoles jusqu'à 500 ppm voire 600 ppm lors des pics de pollution. Ces valeurs élevées sont usuellement mesurées le matin. Il convient alors d'ajuster les seuils à surveiller à l'augmentation constatée du taux "plein air". Par exemple, si le taux de CO2 mesuré en plein air est de 500 ppm, il faut ajouter 100 ppm à tous les seuils proposés ci-dessus.
 +
 +
Hors contexte covid-19, la mesure du CO2 et la vérification de la qualité de l'air reste importante. Une bonne aération diminue les risques de maladie respiratoire. D'autre part, une concentration en CO2 supérieure à 1 000 ppm entraîne une diminution (réversible) des facultés cognitives.
 +
 +
Ainsi les recommandation pour notre capteur :
 +
* <font color="#e31419">rouge</font> si CO2 >1000 ppm. au dessus de 1000 ppm c'est trop
 +
* <font color="#f28518">orange</font> si 1000 ppm > CO2 > 800 ppm. Entre 800 ppm et 1000 ppm de CO2, il faut aérer.
 +
* <font color="#158518">vert</font> si CO2 < 800 ppm. Sous les 800 ppm la qualité de l'air est excellente (avec un masques)
 +
 +
Pour info :
 +
le taux de CO2 atmosphérique était de 400 ppm en 2013, il a passé les 415 ppm en 2019, il était de 283 ppm en 1839.
 +
 +
==quel capteur choisir ?==
 +
Le SenseAir S8 LP
 +
 +
le capteur SenseAir S8 existe en plusieurs versions :
 +
* la classique : S8 LP - préférer celui-ci !!
 +
* la moins cher S8-4B (attention le capteur n'effectue une mesure que toutes les 20 secondes).
 +
===Pourquoi ?===
 +
C'est une technologie fiable : analyse de l'air par lumière infra-rouge (NDIR - Non dispersive InfraRed)
 +
* deux faisceaux de lumière
 +
* un qui n'est pas absorbé par les gaz de l'air sert de référence.
 +
* un qui n'est absorbé que par le CO2
 +
la différence permet de calculer la concentration en CO2 en ppm (partie par million de volume).
 +
* 10 000 ppm = 1%
 +
* la concentration normale en CO2 est de 415 ppm soient environ 0,04%
 +
C'est un capteur qui est recommandé par l'ANSES.
 +
 +
===calibration===
 +
Nécessaire de temps en temps si on constate une dérive (pour cela placer son capteur à l'extérieur pendant 15 minutes, si il ne donne pas 400 à 415 ppm, il faudra procéder à la calibration).
 +
 +
'''Comment faire ?'''
 +
 +
Avant de commencer l'étalonnage manuel, le capteur doit être à environ 400 ppm pendant quelques minutes (un minimum de 15 minutes) pour que le capteur se stabilise.
 +
 +
La procédure est très simple :
 +
# Laissez le capteur fonctionner à l'extérieur pendant au moins 15 minutes.
 +
# Connectez la broche bCAL_in à GND pendant plus de 4 secondes et moins de 8 secondes.
 +
# Laissez le capteur à l'extérieur pendant environ 5 minutes pour qu'il termine son étalonnage et se stabilise.
 +
# C'est fait. Le capteur va considérer que la concentration actuelle est de 400 ppm.
 +
# laissez 5 minutes à l'extérieur pour contrôler les mesures.
 +
 +
Il est important de ne pas laisser la broche bCAL_in connectée à GND pendant plus de 8 secondes, car si les 13 secondes sont dépassées, le capteur démarre un mode de calibration différent, qui n'est pas celui qui nous intéresse (c'est un mode de calibration avec une concentration de 0 ppm de CO2, pour lequel il faut immerger le capteur dans l'azote, par exemple).
 +
 +
 +
Source : https://emariete.com/en/meter-co2-esp8266-nodemcu-sensor-senseair-s8/
 +
 +
==un boitier==
 +
Un boitier qui signale s'il faut aérer avec des led.
 +
 +
[[Fichier:BoitierCapteurCO2.jpg|400px]]
 +
 +
===Accès précis à la mesure===
 +
Le boitier émet un réseau wifi ouvert permettant de s'y connecter et de rejoindre un site web local qui indique le taux de CO2 mesuré.
 +
 +
Un QRcode peut être utilisé pour rejoindre le site web à l'adresse 192.168.4.1
 +
 +
[[Fichier:CapteurCO2QRCode.jpg|400px]]
 +
 +
le QRCode
 +
 +
[[Fichier:QrCodeCapteurCO2.png|400px]]
 +
 +
Affichage sur un smartphone
 +
 +
[[Fichier:PagewebCapteurCO2.jpg|400px]]
 +
 +
===Montage électronique Schéma Fritzing===
 +
Matériel :
 +
* un D1 mini (esp8266).
 +
* un shield batterie
 +
* une batterie 18650
 +
* un capteur SenseAir S8
 +
* 3 led (rouge, orange, verte) de 10mm de diamètre (des grosses).
 +
* 3 résistances de 220 ohms (rouge-rouge-marron).
 +
* 1 interrupteur
 +
* du fil électrique
 +
 +
[[Fichier:MontageBoitiercapteurCO2.jpg|400px]]
 +
 +
[[Fichier:FritzingCapteurCO2.png|400px]]
 +
 +
===STL du Boitier===
 +
Ce stl est "grand" pour pouvoir être imprimé avec une imprimante 3D bas de gamme (qui bave un peu, quoi).
 +
 +
[[media:CapteurCO2.stl|téléchargez le stl du boitier]]
 +
 +
[[media:CapteurCO2.f3d.zip|téléchargez le zip du fichier Fusion 360 du boitier]]
 +
 +
[[Fichier:CapteurCO23DFusion360.png|400px]]
 +
 +
[[Fichier:CapteurCO2-FaceArriere.stl]]
 +
 +
[[Fichier:CapteurCO2-FaceAvant.stl]]
 +
 +
==montage avec Arduino==
 +
 +
 +
[[Fichier:D1mini SenseAir bb.png|400px]]
 +
 +
===Programme pour allumer des leds en fonction de la qualité de l'air===
 +
====BUG POSSIBLES====
 +
des utilisateurs ont constaté un problème d’attribution de broche.
 +
 +
Solutions :
 +
* soit modifier la bibliothèque,
 +
* soit dans le setup attribuer les GPIO au capteur et pas les numéros de broche monCapteur.CO2_Init(2,0) à la place de monCapteur.CO2_Init(D4,D3)(voir le schéma du D1 mini).
 +
 +
====ATTENTION AUX BIBLIOTHEQUES ARDUINO====
 +
 +
N'oubliez pas d'installer la bibliothèque "Airgradient", ainsi que "ESPAsyncWebServer" à partir du gestionnaire de bibliothèque.
 +
 +
[[Fichier:ArduinoajouterBib.png|400px]]
 +
 +
[[Fichier:ArduinoImportbibAirgradient.png|400px]]
 +
 +
Toutes les info sur les bibliothèques :
 +
* Airgradient : https://www.arduino.cc/reference/en/libraries/airgradient-air-quality-sensor/
 +
* ESPAsyncWebServer : https://github.com/me-no-dev/ESPAsyncWebServer
 +
 +
pour l'ESP8266 (le D1 mini) il faut aussi la bibliothèque [ESPAsyncTCP](https://github.com/me-no-dev/ESPAsyncTCP)
 +
====le code====
 +
<syntaxhighlight lang="Arduino" line>
 +
////////////////////
 +
// Capteur de CO2 //
 +
////////////////////
 +
/*
 +
* Proposé dans le cadre de PAPIFAB, un atelier mensuel à l'initiative de la ville Brest animé par les petits débrouillards.
 +
*
 +
*                                  D1 mini
 +
                                    BROCHAGE                           
 +
                                _________________                       
 +
                              /    D1 mini    \                     
 +
                              |[ ]RST        TX[ ]|                 
 +
                              |[ ]A0  -GPIO  RX[ ]|                   
 +
                              |[ ]D0-16    5-D1[ ]|                   
 +
                              |[ ]D5-14    4-D2[ ]|                   
 +
                    Led Rouge |[X]D6-12    0-D3[X]| -> UART_RxD           
 +
                  Led Orange |[X]D7-13    2-D4[X]| -> UART_TxD     
 +
                    Led Verte |[X]D8-15    GND[X]| -> G0             
 +
                              |[ ]3V3 .      5V[X]| -> G+     
 +
                              |      +---+      |                   
 +
                              |_______|USB|_______|   
 +
 +
                            ________________________
 +
                            |  |° ° ° ° ° °|    |  |
 +
                  +5V <- G+ |[X]| ° ° ° ° °/    |[ ]| DVCC_out
 +
                  GND <- G0 |[X]|° ° ° ° °/      |[X]| UART_RxD -> D3
 +
                  Alarm_OC |[ ]|_°_°_°_°|      |[X]| UART_TxD -> D4
 +
                  PWM 1Khz |[ ]|                |[ ]| UART_R/T
 +
                            |  |  SenseAir® S8  |[ ]| bCAL_in/CAL
 +
                            |___|________________|___|
 +
Matériel :
 +
- des fils dupont.
 +
- un capteur SenseAir® S8
 +
- Un D1 mini
 +
- ...
 +
 +
  ___
 +
/ ___ \
 +
|_|  | |
 +
    /_/
 +
    _  ___  _
 +
    |_| |___|_| |_
 +
        ___|_  _|
 +
        |___| |_|
 +
Les petits Débrouillards 2021- CC-By-Sa http://creativecommons.org/licenses/by-nc-sa/3.0/
 +
 +
Ce code est inspiré du code pour le "AirGradient DIY Air Quality Sensor" avec un Microcontroller ESP8266.
 +
Pour plus d'infos, visitez https://www.airgradient.com/diy/
 +
MIT License
 +
 +
Ce projet se nourrit également du travail de Nous aérons : https://nousaerons.fr/makersco2/
 +
*/
 +
 +
#include <AirGradient.h> //appel de la bibliothèque "AirGradient.h" qui gère le capteur
 +
AirGradient monCapteur = AirGradient(); // création de "monCapteur"
 +
 +
int CO2 = 400; // 400ppm c'est la valeur du CO2 dans l'air extérieur
 +
int ledR = 12; // broche D6 sur le GPIO 12
 +
int ledO = 13; // broche D7 sur le GPIO 13
 +
int ledV = 15; // broche D8 sur le GPIO 15
 +
long temps;    // cette variable sert à compter le temps
 +
int brillance = 0;
 +
int pas = 10;
 +
 +
void mesure () { // Cette fonction appelle le capteur et lui demande une mesure
 +
  CO2 = monCapteur.getCO2_Raw();
 +
  Serial.print("Taux de C02 : ");
 +
  Serial.print(CO2);
 +
  Serial.print(" ppm - ");
 +
}
 +
 +
void affichage (){ // Cette fonction allume les leds en fonction du taux de CO2 mesuré
 +
  /* Seuil recommandés dans un contexte ou l'air n'est pas filtré :
 +
  * ROUGE si CO2 > 1000ppm. Au dessus de 1000ppm c'est trop, il est est urgent d'aérer !
 +
  * ORANGE si 1000ppm > CO2 > 800ppm. Entre 800ppm et 1000ppm de CO2, il faut commencer à aérer.
 +
  * VERT si CO2 < 800ppm. Sous les 800ppm, la qualité de l'air est excellente (avec un masques)
 +
  * dans tous les cas, respectez les gestes barrières.
 +
  * Source : Haut Conseil pour la Santé Publique, avis du 22 novembre 2020.
 +
  */
 +
  if (CO2 < 800){ // La qualité de l'air est excellente (avec un masques)
 +
    digitalWrite(ledV,HIGH);
 +
    digitalWrite(ledO,LOW);
 +
    digitalWrite(ledR,LOW);
 +
    Serial.println("La qualité de l'air est excellente");
 +
    }
 +
  else if (CO2 > 800 && CO2 < 1000){ // Il faut commencer à aérer.
 +
    digitalWrite(ledV,LOW);
 +
    digitalWrite(ledO,HIGH);
 +
    digitalWrite(ledR,LOW);
 +
    Serial.println("Il faut commencer à aérer.");
 +
    }
 +
  else if (CO2 > 1000){ // C'est trop, il est est urgent d'aérer !
 +
    digitalWrite(ledV,LOW);
 +
    digitalWrite(ledO,LOW);
 +
    digitalWrite(ledR,HIGH);
 +
    Serial.println("C'est trop ! il est est urgent d'aérer !");
 +
    }
 +
}
 +
 +
void demarrage (){ // Procédure de test des leds (juste pour le fun, c'est pas indispensable)
 +
  for (int i=0; i<3; i++) { // boucle qui les allumes les unes après les autres
 +
    digitalWrite(ledV,LOW);
 +
    digitalWrite(ledO,LOW);
 +
    digitalWrite(ledR,HIGH);
 +
    delay(100);
 +
    digitalWrite(ledV,LOW);
 +
    digitalWrite(ledO,HIGH);
 +
    digitalWrite(ledR,LOW);
 +
    delay(100);
 +
    digitalWrite(ledV,HIGH);
 +
    digitalWrite(ledO,LOW);
 +
    digitalWrite(ledR,LOW);
 +
    delay(100);
 +
    }
 +
 +
  for (int i=0; i<3; i++) { // Boucle qui les allume toutes en un fondu enchainé.
 +
    for (int j=0; j<30; j++){
 +
    analogWrite(ledV,brillance);
 +
    analogWrite(ledO,brillance);
 +
    analogWrite(ledR,brillance);
 +
    brillance = brillance + pas ;
 +
    if (brillance <= 0 || brillance >= 130) {
 +
      pas = -pas;
 +
      }
 +
    delay(30);
 +
    }
 +
  }
 +
  digitalWrite(ledV,LOW); // on éteint tout
 +
  digitalWrite(ledO,LOW);
 +
  digitalWrite(ledR,LOW);
 +
}
 +
 +
void setup(){
 +
  Serial.begin(9600);    // ouverture du port série
 +
  monCapteur.CO2_Init(); // initialisation de "monCapteur"
 +
 
 +
  pinMode(ledR, OUTPUT); // broches configurée en sorties
 +
  pinMode(ledO, OUTPUT);
 +
  pinMode(ledV, OUTPUT);
 +
 +
  temps = millis();      // on enregistre le temps
 +
 +
  demarrage();          // procédure de test des leds au démarrage
 +
}
 +
 +
void loop(){
 +
  if((millis() - temps) > 5000){ // au bout de 5 secondes :
 +
    mesure ();                  // on mesure le taux de CO2
 +
    affichage ();                // on affiche le résultat
 +
    temps = millis();            // on remet le compteur à zero.
 +
    }
 +
}
 +
</syntaxhighlight>
 +
 +
===Programme qui allume les led et diffuse un réseau wifi avec la mesure===
 +
<syntaxhighlight lang="Arduino" line>
 +
//////////////////////
 +
//  Capteur de CO2  //
 +
// avec affiche web //
 +
//////////////////////
 +
/*
 +
* Proposé dans le cadre de PAPIFAB, un atelier mensuel à l'initiative de la ville Brest animé par les petits débrouillards.
 +
*
 +
*                                  D1 mini
 +
                                    BROCHAGE                           
 +
                                _________________                       
 +
                              /    D1 mini    \                     
 +
                              |[ ]RST        TX[ ]|                 
 +
                              |[ ]A0  -GPIO  RX[ ]|                   
 +
                              |[ ]D0-16    5-D1[ ]|                   
 +
                              |[ ]D5-14    4-D2[ ]|                   
 +
                    Led Rouge |[X]D6-12    0-D3[X]| -> UART_RxD           
 +
                  Led Orange |[X]D7-13    2-D4[X]| -> UART_TxD     
 +
                    Led Verte |[X]D8-15    GND[X]| -> G0             
 +
                              |[ ]3V3 .      5V[X]| -> G+     
 +
                              |      +---+      |                   
 +
                              |_______|USB|_______|   
 +
 +
                            ________________________
 +
                            |  |° ° ° ° ° °|    |  |
 +
                  +5V <- G+ |[X]| ° ° ° ° °/    |[ ]| DVCC_out
 +
                  GND <- G0 |[X]|° ° ° ° °/      |[X]| UART_RxD -> D3
 +
                  Alarm_OC |[ ]|_°_°_°_°|      |[X]| UART_TxD -> D4
 +
                  PWM 1Khz |[ ]|                |[ ]| UART_R/T
 +
                            |  |  SenseAir® S8  |[ ]| bCAL_in/CAL
 +
                            |___|________________|___|
 +
  Matériel :
 +
  - des fils dupont.
 +
  - un capteur SenseAir® S8
 +
  - Un D1 mini
 +
  - ...
 +
 +
    ___
 +
  / ___ \
 +
  |_|  | |
 +
      /_/
 +
      _  ___  _
 +
      |_| |___|_| |_
 +
          ___|_  _|
 +
          |___| |_|
 +
  Les petits Débrouillards 13 août 2021- CC-By-Sa http://creativecommons.org/licenses/by-nc-sa/3.0/
 +
 +
  Ce code est inspiré du code pour le "AirGradient DIY Air Quality Sensor" avec un Microcontroller ESP8266.
 +
  Pour plus d'infos, visitez https://www.airgradient.com/diy/
 +
  MIT License
 +
 +
  Ce projet se nourrit également du travail de Nous aérons : https://nousaerons.fr/makersco2/
 +
*/
 +
// Appel des bibliothèques
 +
#include <ESP8266WiFi.h>
 +
#include <ESPAsyncWebServer.h>
 +
#include <AirGradient.h> //appel de la bibliothèque "AirGradient.h" qui gère le capteur
 +
AirGradient monCapteur = AirGradient(); // création de "monCapteur"
 +
 +
const char* ssid    = "Taux de CO2";
 +
const char* password = "";
 +
 +
// Creation du serveur AsyncWebServer sur le port 80
 +
AsyncWebServer serveurCO2(80);
 +
 +
int CO2 = 400; // 400ppm c'est la valeur du CO2 dans l'air extérieur
 +
int ledV = 15; // broche D8 sur le GPIO 15
 +
int ledO = 13; // broche D7 sur le GPIO 13
 +
int ledR = 12; // broche D6 sur le GPIO 12
 +
 +
long temps;    // cette variable sert à compter le temps
 +
int brillance = 0;
 +
int pas = 10;
 +
 +
// page web "index.html"
 +
const char index_html[] PROGMEM = R"rawliteral(
 +
<!DOCTYPE HTML><html>
 +
<head>
 +
  <meta name="viewport" content="width=device-width, initial-scale=1">
 +
  <style>
 +
    html {
 +
    font-family: Arial;
 +
    display: inline-block;
 +
    margin: 0px auto;
 +
    text-align: center;
 +
    }
 +
    h2 { font-size: 3.0rem; }
 +
    p { font-size: 3.0rem; }
 +
  </style>
 +
</head>
 +
<body>
 +
  <h2>Taux de CO2 mesur&eacute;</h2>
 +
  <p>
 +
    <span>L'air ambiant contient</span>
 +
    <span>%TAUXCO2%</span>
 +
    <span>ppm de CO2</span>
 +
  </p>
 +
</body>
 +
<script>
 +
setInterval(function ( ) {
 +
  var xhttp = new XMLHttpRequest();
 +
  xhttp.onreadystatechange = function() {
 +
    if (this.readyState == 4 && this.status == 200) {
 +
      document.getElementById("TauxDeCO2").innerHTML = this.responseText;
 +
    }
 +
  };
 +
  xhttp.open("GET", "/TauxDeCO2", true);
 +
  xhttp.send();
 +
}, 10000 ) ;
 +
 +
</script>
 +
</html>)rawliteral";
 +
 +
// Renvooe les données du capteur de CO2
 +
String processor(const String& var){
 +
  if(var == "TAUXCO2"){
 +
    return String(CO2);
 +
  }
 +
  return String();
 +
}
 +
 +
void mesure () { // Cette fonction appelle le capteur et lui demande une mesure
 +
  CO2 = monCapteur.getCO2_Raw();
 +
  Serial.print("Taux de C02 : ");
 +
  Serial.print(CO2);
 +
  Serial.print(" ppm - ");
 +
}
 +
 +
void affichage (){ // Cette fonction allume les leds en fonction du taux de CO2 mesuré
 +
  /* Seuil recommandés dans un contexte ou l'air n'est pas filtré :
 +
  * ROUGE si CO2 > 1000ppm. Au dessus de 1000ppm c'est trop, il est est urgent d'aérer !
 +
  * ORANGE si 1000ppm > CO2 > 800ppm. Entre 800ppm et 1000ppm de CO2, il faut commencer à aérer.
 +
  * VERT si CO2 < 800ppm. Sous les 800ppm, la qualité de l'air est excellente (avec un masques)
 +
  * dans tous les cas, respectez les gestes barrières.
 +
  * Source : Haut Conseil pour la Santé Publique, avis du 22 novembre 2020.
 +
  */
 +
  if (CO2 < 800){ // La qualité de l'air est excellente (avec un masques)
 +
    digitalWrite(ledV,HIGH);
 +
    digitalWrite(ledO,LOW);
 +
    digitalWrite(ledR,LOW);
 +
    Serial.println("La qualité de l'air est excellente");
 +
    }
 +
  else if (CO2 > 800 && CO2 < 1000){ // Il faut commencer à aérer.
 +
    digitalWrite(ledV,LOW);
 +
    digitalWrite(ledO,HIGH);
 +
    digitalWrite(ledR,LOW);
 +
    Serial.println("Il faut commencer à aérer.");
 +
    }
 +
  else if (CO2 > 1000){ // C'est trop, il est est urgent d'aérer !
 +
    digitalWrite(ledV,LOW);
 +
    digitalWrite(ledO,LOW);
 +
    digitalWrite(ledR,HIGH);
 +
    Serial.println("C'est trop ! il est est urgent d'aérer !");
 +
    }
 +
}
 +
 +
void demarrage (){ // Procédure de test des leds (juste pour le fun, c'est pas indispensable)
 +
  for (int i=0; i<3; i++) { // boucle qui les allumes les unes après les autres
 +
    digitalWrite(ledV,LOW);
 +
    digitalWrite(ledO,LOW);
 +
    digitalWrite(ledR,HIGH);
 +
    delay(100);
 +
    digitalWrite(ledV,LOW);
 +
    digitalWrite(ledO,HIGH);
 +
    digitalWrite(ledR,LOW);
 +
    delay(100);
 +
    digitalWrite(ledV,HIGH);
 +
    digitalWrite(ledO,LOW);
 +
    digitalWrite(ledR,LOW);
 +
    delay(100);
 +
    }
 +
 +
  for (int i=0; i<3; i++) { // Boucle qui les allume toutes en un fondu enchainé.
 +
    for (int j=0; j<30; j++){
 +
    analogWrite(ledV,brillance);
 +
    analogWrite(ledO,brillance);
 +
    analogWrite(ledR,brillance);
 +
    brillance = brillance + pas ;
 +
    if (brillance <= 0 || brillance >= 130) {
 +
      pas = -pas;
 +
      }
 +
    delay(30);
 +
    }
 +
  }
 +
  digitalWrite(ledV,LOW); // on éteint tout
 +
  digitalWrite(ledO,LOW);
 +
  digitalWrite(ledR,LOW);
 +
}
 +
 +
void setup(){
 +
  Serial.begin(9600);    // ouverture de la communication série
 +
  monCapteur.CO2_Init(); // initialisation de "monCapteur"
 +
 
 +
  pinMode(ledR, OUTPUT); // broches configurée en sorties
 +
  pinMode(ledO, OUTPUT);
 +
  pinMode(ledV, OUTPUT);
 +
 +
  temps = millis();      // on enregistre le temps
 +
 +
  demarrage();          // procédure de test des leds au démarrage
 +
 
 +
  Serial.print("Réglage du point d'accès …");
 +
  WiFi.softAP(ssid);
 +
 +
  IPAddress IP = WiFi.softAPIP();
 +
  Serial.print("addresse IP du point d'accès: ");
 +
  Serial.println(IP);
 +
 +
  // Chemin vers le serveur web 
 +
  serveurCO2.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
 +
    request->send_P(200, "text/html", index_html, processor);
 +
  });
 +
  serveurCO2.on("/TauxDeCO2", HTTP_GET, [](AsyncWebServerRequest *request){
 +
    request->send_P(200, "text/plain", String(CO2).c_str());
 +
  });
 +
 +
  // démarrage du serveur
 +
  serveurCO2.begin();
 +
}
 +
 +
void loop(){
 +
  if((millis() - temps) > 5000){  // au bout de 5 secondes : (ajuster le temps !!)
 +
    mesure ();                    // on mesure le taux de CO2
 +
    affichage ();                // on affiche le résultat
 +
    temps = millis();            // on remet le compteur à zero.
 +
    }
 +
}
 +
</syntaxhighlight>
 +
 +
===Programme pour publier sur thingspeak===
 +
A faire !
 +
 +
===Ressources et inspirations===
 +
voir : https://www.arduino.cc/reference/en/libraries/airgradient-air-quality-sensor/
 +
Capteurs à disposition : Senseair S8
 +
* Voir https://www.airgradient.com/diy/
 +
* Tuto vidéo : https://www.youtube.com/watch?v=n059hQpybsE
 +
* Achat du capteur SenseAir S8 : chez Ali ou https://www.amazon.fr/infrarouge-Communication-400%E2%80%912000PPM-environnements-concentration/dp/B08N4LNQFM/
 +
* pas mal ici : https://wiki.lafabriquedesmobilites.fr/wiki/Capteur_d%C3%A9tecteur_CO2
 +
* https://wikifab.org/wiki/Afficheur_CO2
 +
* https://ducotedelascience.org/
 +
* https://nousaerons.fr/makersco2/
 +
* https://projetco2.fr/pourquoi-mesurer-co2
 +
 +
==Rien a voir==
 +
il faut tester ça ! http://hebergement.universite-paris-saclay.fr/supraconductivite/projet/smartphone/
  
 
==Ressources==
 
==Ressources==
Ligne 15 : Ligne 565 :
  
 
* http://nousaerons.fr/makersco2/
 
* http://nousaerons.fr/makersco2/
 +
 +
===ressources sur CO2 et santé===
 +
* https://www.anses.fr/fr/content/dioxyde-de-carbone-co2-dans-l%E2%80%99air-int%C3%A9rieur
 +
* Valeurs Guides de qualité d’Air Intérieur (VGAI) : https://www.anses.fr/fr/content/valeurs-guides-de-qualit%C3%A9-d%E2%80%99air-int%C3%A9rieur-vgai
 +
* https://www.kandu.fr/article/qualite-de-lair-interieur-impact-co2-sur-sante-efficacite/
 +
* https://elpais.com/especiales/coronavirus-covid-19/a-room-a-bar-and-a-class-how-the-coronavirus-is-spread-through-the-air/

Version actuelle datée du 20 mars 2024 à 14:35

En temps de covid, mesurer le taux de CO2 dans l'air d'une pièce peut-être un bon indicateur de la nécessité d'aération.

BoitierCapteurCO2.jpg PagewebCapteurCO2.jpg

de quoi s'agit-il ?

Avant toute chose

Il faut saluer et remercier le travail effectué par les personnes qui ont réalisé le site Nousaerons.fr (cliquez sur l'image pour y aller !).

CopieEcranNousAerons2021.png

D'une manière générale nous citons toutes les sources mobilisées pour réaliser cette page.

Taux de CO2 et qualité de l'air intérieur

Texte tiré de https://projetco2.fr/pourquoi-mesurer-co2

Le lien entre la qualité de l'air d'une pièce et la concentration en CO2 est donnée par les valeurs caractéristiques suivantes :

  • < 800 ppm : correspond à une qualité d'air excellente selon la norme NF EN 13779 et c'est une recommandation du Haut Conseil de la Santé publique. Cela constitue donc une valeur "cible" à atteindre.
  • entre 800 et 1000 ppm : correspond à une qualité d'air moyenne selon la norme NF EN 13779
  • entre 1000 et 1500 ppm : correspond à une qualité d'air modérée selon la norme NF EN 13779. Cela correspond à des valeurs trop élevées en contexte Covid-19.
  • > 1500 ppm : correspond à une qualité d'air basse selon la norme NF EN 13779. Cela correspond à des valeurs beaucoup trop élevées en contexte Covid-19.

Dans un lieu confiné, il n'est pas rare de dépasser le premier seuil au bout de quelques minutes. C'est le cas dans certaines salles de réunions ou salles de classes mal ventilées.

Attention, il existe des situations spécifiques pour lesquelles les seuils donnés ci-dessus ne sont pas pertinents :

  • Ces seuils ne sont pas pertinents dans les salles dans lesquels un recyclage partiel de l'air est assuré par un dispositif de filtration de type HEPA. Cette solution de purification de l'air en milieu clos par filtration doit faire l'objet d'une étude spécifique
  • Ces seuils sont donnés pour un taux en "plein air" d'environ 400 à 420 ppm qui sert de référence. Ce taux peut monter dans les grandes métropoles jusqu'à 500 ppm voire 600 ppm lors des pics de pollution. Ces valeurs élevées sont usuellement mesurées le matin. Il convient alors d'ajuster les seuils à surveiller à l'augmentation constatée du taux "plein air". Par exemple, si le taux de CO2 mesuré en plein air est de 500 ppm, il faut ajouter 100 ppm à tous les seuils proposés ci-dessus.

Hors contexte covid-19, la mesure du CO2 et la vérification de la qualité de l'air reste importante. Une bonne aération diminue les risques de maladie respiratoire. D'autre part, une concentration en CO2 supérieure à 1 000 ppm entraîne une diminution (réversible) des facultés cognitives.

Ainsi les recommandation pour notre capteur :

  • rouge si CO2 >1000 ppm. au dessus de 1000 ppm c'est trop
  • orange si 1000 ppm > CO2 > 800 ppm. Entre 800 ppm et 1000 ppm de CO2, il faut aérer.
  • vert si CO2 < 800 ppm. Sous les 800 ppm la qualité de l'air est excellente (avec un masques)

Pour info : le taux de CO2 atmosphérique était de 400 ppm en 2013, il a passé les 415 ppm en 2019, il était de 283 ppm en 1839.

quel capteur choisir ?

Le SenseAir S8 LP

le capteur SenseAir S8 existe en plusieurs versions :

  • la classique : S8 LP - préférer celui-ci !!
  • la moins cher S8-4B (attention le capteur n'effectue une mesure que toutes les 20 secondes).

Pourquoi ?

C'est une technologie fiable : analyse de l'air par lumière infra-rouge (NDIR - Non dispersive InfraRed)

  • deux faisceaux de lumière
  • un qui n'est pas absorbé par les gaz de l'air sert de référence.
  • un qui n'est absorbé que par le CO2

la différence permet de calculer la concentration en CO2 en ppm (partie par million de volume).

  • 10 000 ppm = 1%
  • la concentration normale en CO2 est de 415 ppm soient environ 0,04%

C'est un capteur qui est recommandé par l'ANSES.

calibration

Nécessaire de temps en temps si on constate une dérive (pour cela placer son capteur à l'extérieur pendant 15 minutes, si il ne donne pas 400 à 415 ppm, il faudra procéder à la calibration).

Comment faire ?

Avant de commencer l'étalonnage manuel, le capteur doit être à environ 400 ppm pendant quelques minutes (un minimum de 15 minutes) pour que le capteur se stabilise.

La procédure est très simple :

  1. Laissez le capteur fonctionner à l'extérieur pendant au moins 15 minutes.
  2. Connectez la broche bCAL_in à GND pendant plus de 4 secondes et moins de 8 secondes.
  3. Laissez le capteur à l'extérieur pendant environ 5 minutes pour qu'il termine son étalonnage et se stabilise.
  4. C'est fait. Le capteur va considérer que la concentration actuelle est de 400 ppm.
  5. laissez 5 minutes à l'extérieur pour contrôler les mesures.

Il est important de ne pas laisser la broche bCAL_in connectée à GND pendant plus de 8 secondes, car si les 13 secondes sont dépassées, le capteur démarre un mode de calibration différent, qui n'est pas celui qui nous intéresse (c'est un mode de calibration avec une concentration de 0 ppm de CO2, pour lequel il faut immerger le capteur dans l'azote, par exemple).


Source : https://emariete.com/en/meter-co2-esp8266-nodemcu-sensor-senseair-s8/

un boitier

Un boitier qui signale s'il faut aérer avec des led.

BoitierCapteurCO2.jpg

Accès précis à la mesure

Le boitier émet un réseau wifi ouvert permettant de s'y connecter et de rejoindre un site web local qui indique le taux de CO2 mesuré.

Un QRcode peut être utilisé pour rejoindre le site web à l'adresse 192.168.4.1

CapteurCO2QRCode.jpg

le QRCode

QrCodeCapteurCO2.png

Affichage sur un smartphone

PagewebCapteurCO2.jpg

Montage électronique Schéma Fritzing

Matériel :

  • un D1 mini (esp8266).
  • un shield batterie
  • une batterie 18650
  • un capteur SenseAir S8
  • 3 led (rouge, orange, verte) de 10mm de diamètre (des grosses).
  • 3 résistances de 220 ohms (rouge-rouge-marron).
  • 1 interrupteur
  • du fil électrique

MontageBoitiercapteurCO2.jpg

FritzingCapteurCO2.png

STL du Boitier

Ce stl est "grand" pour pouvoir être imprimé avec une imprimante 3D bas de gamme (qui bave un peu, quoi).

téléchargez le stl du boitier

téléchargez le zip du fichier Fusion 360 du boitier

CapteurCO23DFusion360.png

Fichier:CapteurCO2-FaceArriere.stl

Fichier:CapteurCO2-FaceAvant.stl

montage avec Arduino

D1mini SenseAir bb.png

Programme pour allumer des leds en fonction de la qualité de l'air

BUG POSSIBLES

des utilisateurs ont constaté un problème d’attribution de broche.

Solutions :

  • soit modifier la bibliothèque,
  • soit dans le setup attribuer les GPIO au capteur et pas les numéros de broche monCapteur.CO2_Init(2,0) à la place de monCapteur.CO2_Init(D4,D3)(voir le schéma du D1 mini).

ATTENTION AUX BIBLIOTHEQUES ARDUINO

N'oubliez pas d'installer la bibliothèque "Airgradient", ainsi que "ESPAsyncWebServer" à partir du gestionnaire de bibliothèque.

ArduinoajouterBib.png

ArduinoImportbibAirgradient.png

Toutes les info sur les bibliothèques :

pour l'ESP8266 (le D1 mini) il faut aussi la bibliothèque [ESPAsyncTCP](https://github.com/me-no-dev/ESPAsyncTCP)

le code

  1 ////////////////////
  2 // Capteur de CO2 //
  3 ////////////////////
  4 /*
  5  * Proposé dans le cadre de PAPIFAB, un atelier mensuel à l'initiative de la ville Brest animé par les petits débrouillards.
  6  * 
  7  *                                   D1 mini
  8                                      BROCHAGE                            
  9                                 _________________                        
 10                                /     D1 mini     \                       
 11                               |[ ]RST        TX[ ]|                   
 12                               |[ ]A0  -GPIO  RX[ ]|                    
 13                               |[ ]D0-16    5-D1[ ]|                     
 14                               |[ ]D5-14    4-D2[ ]|                     
 15                     Led Rouge |[X]D6-12    0-D3[X]| -> UART_RxD             
 16                    Led Orange |[X]D7-13    2-D4[X]| -> UART_TxD       
 17                     Led Verte |[X]D8-15     GND[X]| -> G0              
 18                               |[ ]3V3 .      5V[X]| -> G+       
 19                               |       +---+       |                     
 20                               |_______|USB|_______|     
 21 
 22                              ________________________
 23                             |   |° ° ° ° ° °|    |   |
 24                   +5V <- G+ |[X]| ° ° ° ° °/     |[ ]| DVCC_out
 25                   GND <- G0 |[X]|° ° ° ° °/      |[X]| UART_RxD -> D3
 26                    Alarm_OC |[ ]|_°_°_°_°|       |[X]| UART_TxD -> D4
 27                    PWM 1Khz |[ ]|                |[ ]| UART_R/T
 28                             |   |  SenseAir® S8  |[ ]| bCAL_in/CAL
 29                             |___|________________|___|
 30 Matériel :
 31 - des fils dupont.
 32 - un capteur SenseAir® S8
 33 - Un D1 mini
 34 - ...
 35 
 36    ___
 37  / ___ \
 38 |_|   | |
 39      /_/ 
 40      _   ___   _ 
 41     |_| |___|_| |_
 42          ___|_   _|
 43         |___| |_|
 44 Les petits Débrouillards 2021- CC-By-Sa http://creativecommons.org/licenses/by-nc-sa/3.0/
 45 
 46 Ce code est inspiré du code pour le "AirGradient DIY Air Quality Sensor" avec un Microcontroller ESP8266.
 47 Pour plus d'infos, visitez https://www.airgradient.com/diy/
 48 MIT License
 49 
 50 Ce projet se nourrit également du travail de Nous aérons : https://nousaerons.fr/makersco2/
 51 */
 52 
 53 #include <AirGradient.h> //appel de la bibliothèque "AirGradient.h" qui gère le capteur
 54 AirGradient monCapteur = AirGradient(); // création de "monCapteur"
 55 
 56 int CO2 = 400; // 400ppm c'est la valeur du CO2 dans l'air extérieur
 57 int ledR = 12; // broche D6 sur le GPIO 12
 58 int ledO = 13; // broche D7 sur le GPIO 13
 59 int ledV = 15; // broche D8 sur le GPIO 15
 60 long temps;    // cette variable sert à compter le temps
 61 int brillance = 0;
 62 int pas = 10;
 63 
 64 void mesure () { // Cette fonction appelle le capteur et lui demande une mesure
 65   CO2 = monCapteur.getCO2_Raw();
 66   Serial.print("Taux de C02 : ");
 67   Serial.print(CO2); 
 68   Serial.print(" ppm - ");
 69 }
 70 
 71 void affichage (){ // Cette fonction allume les leds en fonction du taux de CO2 mesuré
 72   /* Seuil recommandés dans un contexte ou l'air n'est pas filtré : 
 73    * ROUGE si CO2 > 1000ppm. Au dessus de 1000ppm c'est trop, il est est urgent d'aérer !
 74    * ORANGE si 1000ppm > CO2 > 800ppm. Entre 800ppm et 1000ppm de CO2, il faut commencer à aérer.
 75    * VERT si CO2 < 800ppm. Sous les 800ppm, la qualité de l'air est excellente (avec un masques)
 76    * dans tous les cas, respectez les gestes barrières.
 77    * Source : Haut Conseil pour la Santé Publique, avis du 22 novembre 2020.
 78    */
 79   if (CO2 < 800){ // La qualité de l'air est excellente (avec un masques)
 80     digitalWrite(ledV,HIGH);
 81     digitalWrite(ledO,LOW);
 82     digitalWrite(ledR,LOW);
 83     Serial.println("La qualité de l'air est excellente");
 84     }
 85   else if (CO2 > 800 && CO2 < 1000){ // Il faut commencer à aérer.
 86     digitalWrite(ledV,LOW); 
 87     digitalWrite(ledO,HIGH); 
 88     digitalWrite(ledR,LOW);
 89     Serial.println("Il faut commencer à aérer.");
 90     }
 91   else if (CO2 > 1000){ // C'est trop, il est est urgent d'aérer !
 92     digitalWrite(ledV,LOW);
 93     digitalWrite(ledO,LOW); 
 94     digitalWrite(ledR,HIGH); 
 95     Serial.println("C'est trop ! il est est urgent d'aérer !");
 96     }
 97 }
 98 
 99 void demarrage (){ // Procédure de test des leds (juste pour le fun, c'est pas indispensable)
100   for (int i=0; i<3; i++) { // boucle qui les allumes les unes après les autres
101     digitalWrite(ledV,LOW);
102     digitalWrite(ledO,LOW); 
103     digitalWrite(ledR,HIGH);
104     delay(100);
105     digitalWrite(ledV,LOW);
106     digitalWrite(ledO,HIGH); 
107     digitalWrite(ledR,LOW);
108     delay(100);
109     digitalWrite(ledV,HIGH);
110     digitalWrite(ledO,LOW); 
111     digitalWrite(ledR,LOW);
112     delay(100);
113     }
114 
115   for (int i=0; i<3; i++) { // Boucle qui les allume toutes en un fondu enchainé.
116     for (int j=0; j<30; j++){
117     analogWrite(ledV,brillance);
118     analogWrite(ledO,brillance); 
119     analogWrite(ledR,brillance);
120     brillance = brillance + pas ;
121     if (brillance <= 0 || brillance >= 130) {
122       pas = -pas;
123       }
124     delay(30);
125     }
126   }
127   digitalWrite(ledV,LOW); // on éteint tout
128   digitalWrite(ledO,LOW); 
129   digitalWrite(ledR,LOW);
130 }
131 
132 void setup(){
133   Serial.begin(9600);    // ouverture du port série
134   monCapteur.CO2_Init(); // initialisation de "monCapteur"
135   
136   pinMode(ledR, OUTPUT); // broches configurée en sorties
137   pinMode(ledO, OUTPUT); 
138   pinMode(ledV, OUTPUT);
139 
140   temps = millis();      // on enregistre le temps
141 
142   demarrage();           // procédure de test des leds au démarrage
143 }
144 
145 void loop(){
146   if((millis() - temps) > 5000){ // au bout de 5 secondes :
147     mesure ();                   // on mesure le taux de CO2
148     affichage ();                // on affiche le résultat
149     temps = millis();            // on remet le compteur à zero.
150     }
151 }

Programme qui allume les led et diffuse un réseau wifi avec la mesure

  1 //////////////////////
  2 //  Capteur de CO2  //
  3 // avec affiche web //
  4 //////////////////////
  5 /*
  6  * Proposé dans le cadre de PAPIFAB, un atelier mensuel à l'initiative de la ville Brest animé par les petits débrouillards.
  7  * 
  8  *                                   D1 mini
  9                                      BROCHAGE                            
 10                                 _________________                        
 11                                /     D1 mini     \                       
 12                               |[ ]RST        TX[ ]|                   
 13                               |[ ]A0  -GPIO  RX[ ]|                    
 14                               |[ ]D0-16    5-D1[ ]|                     
 15                               |[ ]D5-14    4-D2[ ]|                     
 16                     Led Rouge |[X]D6-12    0-D3[X]| -> UART_RxD             
 17                    Led Orange |[X]D7-13    2-D4[X]| -> UART_TxD       
 18                     Led Verte |[X]D8-15     GND[X]| -> G0              
 19                               |[ ]3V3 .      5V[X]| -> G+       
 20                               |       +---+       |                     
 21                               |_______|USB|_______|     
 22 
 23                              ________________________
 24                             |   |° ° ° ° ° °|    |   |
 25                   +5V <- G+ |[X]| ° ° ° ° °/     |[ ]| DVCC_out
 26                   GND <- G0 |[X]|° ° ° ° °/      |[X]| UART_RxD -> D3
 27                    Alarm_OC |[ ]|_°_°_°_°|       |[X]| UART_TxD -> D4
 28                    PWM 1Khz |[ ]|                |[ ]| UART_R/T
 29                             |   |  SenseAir® S8  |[ ]| bCAL_in/CAL
 30                             |___|________________|___|
 31   Matériel :
 32   - des fils dupont.
 33   - un capteur SenseAir® S8
 34   - Un D1 mini
 35   - ...
 36 
 37      ___
 38    / ___ \
 39   |_|   | |
 40        /_/ 
 41        _   ___   _ 
 42       |_| |___|_| |_
 43            ___|_   _|
 44           |___| |_|
 45   Les petits Débrouillards 13 août 2021- CC-By-Sa http://creativecommons.org/licenses/by-nc-sa/3.0/
 46 
 47   Ce code est inspiré du code pour le "AirGradient DIY Air Quality Sensor" avec un Microcontroller ESP8266.
 48   Pour plus d'infos, visitez https://www.airgradient.com/diy/
 49   MIT License
 50 
 51   Ce projet se nourrit également du travail de Nous aérons : https://nousaerons.fr/makersco2/
 52 */
 53 // Appel des bibliothèques
 54 #include <ESP8266WiFi.h>
 55 #include <ESPAsyncWebServer.h>
 56 #include <AirGradient.h> //appel de la bibliothèque "AirGradient.h" qui gère le capteur
 57 AirGradient monCapteur = AirGradient(); // création de "monCapteur"
 58 
 59 const char* ssid     = "Taux de CO2";
 60 const char* password = "";
 61 
 62 // Creation du serveur AsyncWebServer sur le port 80
 63 AsyncWebServer serveurCO2(80);
 64 
 65 int CO2 = 400; // 400ppm c'est la valeur du CO2 dans l'air extérieur
 66 int ledV = 15; // broche D8 sur le GPIO 15
 67 int ledO = 13; // broche D7 sur le GPIO 13
 68 int ledR = 12; // broche D6 sur le GPIO 12
 69 
 70 long temps;    // cette variable sert à compter le temps
 71 int brillance = 0;
 72 int pas = 10;
 73 
 74 // page web "index.html"
 75 const char index_html[] PROGMEM = R"rawliteral(
 76 <!DOCTYPE HTML><html>
 77 <head>
 78   <meta name="viewport" content="width=device-width, initial-scale=1">
 79   <style>
 80     html {
 81      font-family: Arial;
 82      display: inline-block;
 83      margin: 0px auto;
 84      text-align: center;
 85     }
 86     h2 { font-size: 3.0rem; }
 87     p { font-size: 3.0rem; }
 88   </style>
 89 </head>
 90 <body>
 91   <h2>Taux de CO2 mesur&eacute;</h2>
 92   <p>
 93     <span>L'air ambiant contient</span> 
 94     <span>%TAUXCO2%</span>
 95     <span>ppm de CO2</span>
 96   </p>
 97 </body>
 98 <script>
 99 setInterval(function ( ) {
100   var xhttp = new XMLHttpRequest();
101   xhttp.onreadystatechange = function() {
102     if (this.readyState == 4 && this.status == 200) {
103       document.getElementById("TauxDeCO2").innerHTML = this.responseText;
104     }
105   };
106   xhttp.open("GET", "/TauxDeCO2", true);
107   xhttp.send();
108 }, 10000 ) ;
109 
110 </script>
111 </html>)rawliteral";
112 
113 // Renvooe les données du capteur de CO2
114 String processor(const String& var){
115   if(var == "TAUXCO2"){
116     return String(CO2);
117   }
118   return String();
119 }
120 
121 void mesure () { // Cette fonction appelle le capteur et lui demande une mesure
122   CO2 = monCapteur.getCO2_Raw();
123   Serial.print("Taux de C02 : ");
124   Serial.print(CO2); 
125   Serial.print(" ppm - ");
126 }
127 
128 void affichage (){ // Cette fonction allume les leds en fonction du taux de CO2 mesuré
129   /* Seuil recommandés dans un contexte ou l'air n'est pas filtré : 
130    * ROUGE si CO2 > 1000ppm. Au dessus de 1000ppm c'est trop, il est est urgent d'aérer !
131    * ORANGE si 1000ppm > CO2 > 800ppm. Entre 800ppm et 1000ppm de CO2, il faut commencer à aérer.
132    * VERT si CO2 < 800ppm. Sous les 800ppm, la qualité de l'air est excellente (avec un masques)
133    * dans tous les cas, respectez les gestes barrières.
134    * Source : Haut Conseil pour la Santé Publique, avis du 22 novembre 2020.
135    */
136   if (CO2 < 800){ // La qualité de l'air est excellente (avec un masques)
137     digitalWrite(ledV,HIGH);
138     digitalWrite(ledO,LOW);
139     digitalWrite(ledR,LOW);
140     Serial.println("La qualité de l'air est excellente");
141     }
142   else if (CO2 > 800 && CO2 < 1000){ // Il faut commencer à aérer.
143     digitalWrite(ledV,LOW); 
144     digitalWrite(ledO,HIGH); 
145     digitalWrite(ledR,LOW);
146     Serial.println("Il faut commencer à aérer.");
147     }
148   else if (CO2 > 1000){ // C'est trop, il est est urgent d'aérer !
149     digitalWrite(ledV,LOW);
150     digitalWrite(ledO,LOW); 
151     digitalWrite(ledR,HIGH); 
152     Serial.println("C'est trop ! il est est urgent d'aérer !");
153     }
154 }
155 
156 void demarrage (){ // Procédure de test des leds (juste pour le fun, c'est pas indispensable)
157   for (int i=0; i<3; i++) { // boucle qui les allumes les unes après les autres
158     digitalWrite(ledV,LOW);
159     digitalWrite(ledO,LOW); 
160     digitalWrite(ledR,HIGH);
161     delay(100);
162     digitalWrite(ledV,LOW);
163     digitalWrite(ledO,HIGH); 
164     digitalWrite(ledR,LOW);
165     delay(100);
166     digitalWrite(ledV,HIGH);
167     digitalWrite(ledO,LOW); 
168     digitalWrite(ledR,LOW);
169     delay(100);
170     }
171 
172   for (int i=0; i<3; i++) { // Boucle qui les allume toutes en un fondu enchainé.
173     for (int j=0; j<30; j++){
174     analogWrite(ledV,brillance);
175     analogWrite(ledO,brillance); 
176     analogWrite(ledR,brillance);
177     brillance = brillance + pas ;
178     if (brillance <= 0 || brillance >= 130) {
179       pas = -pas;
180       }
181     delay(30);
182     }
183   }
184   digitalWrite(ledV,LOW); // on éteint tout
185   digitalWrite(ledO,LOW); 
186   digitalWrite(ledR,LOW);
187 }
188 
189 void setup(){
190   Serial.begin(9600);    // ouverture de la communication série
191   monCapteur.CO2_Init(); // initialisation de "monCapteur"
192   
193   pinMode(ledR, OUTPUT); // broches configurée en sorties
194   pinMode(ledO, OUTPUT); 
195   pinMode(ledV, OUTPUT);
196 
197   temps = millis();      // on enregistre le temps
198 
199   demarrage();           // procédure de test des leds au démarrage
200   
201   Serial.print("Réglage du point d'accès …");
202   WiFi.softAP(ssid);
203 
204   IPAddress IP = WiFi.softAPIP();
205   Serial.print("addresse IP du point d'accès: ");
206   Serial.println(IP);
207 
208   // Chemin vers le serveur web  
209   serveurCO2.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
210     request->send_P(200, "text/html", index_html, processor);
211   });
212   serveurCO2.on("/TauxDeCO2", HTTP_GET, [](AsyncWebServerRequest *request){
213     request->send_P(200, "text/plain", String(CO2).c_str());
214   });
215 
216   // démarrage du serveur
217   serveurCO2.begin();
218 }
219 
220 void loop(){
221   if((millis() - temps) > 5000){  // au bout de 5 secondes : (ajuster le temps !!)
222     mesure ();                    // on mesure le taux de CO2
223     affichage ();                 // on affiche le résultat
224     temps = millis();             // on remet le compteur à zero.
225     }
226 }

Programme pour publier sur thingspeak

A faire !

Ressources et inspirations

voir : https://www.arduino.cc/reference/en/libraries/airgradient-air-quality-sensor/ Capteurs à disposition : Senseair S8

Rien a voir

il faut tester ça ! http://hebergement.universite-paris-saclay.fr/supraconductivite/projet/smartphone/

Ressources

voir aussi

Compte twitter : https://twitter.com/nousaerons

ressources sur CO2 et santé