Le capteur CCS811 est un capteur environnemental qui permet de détecteur la présence de COV dans l’atmosphère et d’en déduire le niveau de composés organiques volatils totaux (TVOC en anglais). Le CCS811 permet également de déterminer le taux de CO2 équivalent (eCO2) présent dans l’atmosphère. Le capteur CCS811 est produit par le spécialiste Autrichien ams AG (site internet). Il équipe les cartes Adafruit (environ 35€) et Sparkfun (SparkFun Air Quality Breakout ou SparkFun Environmental Combo Breakout – CCS811/BME280, environ 58€). Je vous propose de tester une version beaucoup plus économique du fabricant chinois CJMCU.
Vous pourrez la trouver un direct de chine pour moins de 8€. Si vous préférez les solutions de Bosch Sensortec, le BME680 est un capteur équivalent. On le trouve pour moins de 15€.
Sommaire
C’est quoi les COV ?
Les COV (Composés Organiques Volatiles) sont des molécules chimiques produites par les matériaux de construction, produits de nettoyage, peintures, produits cosmétiques et même le corps humain. Ce sont des polluants qui peuvent être à l’origine de problèmes de santé. Pour en savoir plus, vous pouvez commencer par cet article publié sur Wikipedia. Voici les polluants les plus courants que l’on trouve dans nos habitations.
Source de contamination | Exemple | Contaminant de l’atmosphére intérieure |
Matériaux de construction | Adhésifs, Tapis, Ciment, Revêtement de sol, Solvants |
Formaldéhyde, Alcanes, Alcools, Aldéhydes, cétones |
Combustion | Moteurs à combustion, électroménagers, hydrocarbures à fumée | Hydrocarbures |
Produits de nettoyage | Produits de nettoyage ménagers | Acétone, alcool, spiritueux |
Meubles | Bois, polychlorure de vinyle (PVC), colles | Formaldéhyde, toluène, xylène, Decane |
Corps humain | Cosmétique, respiration | Acétone, Ethanol, Isoprène, Méthane, Hydrogène |
Matériel de bureau | Imprimantes, photocopieurs, PC | Ozone, Benzène, Styrène, Phénol |
D’après https://ams.com/documents/20143/36005/CCS811_WP000103_1-00.pdf/2da5de97-7c63-f605-aaf0-7320c5ec9101
Caractéristiques générales du CCS811 (CMJCU et autres fabricants)
Le CCS811 d’ams AG est un capteur de type MOX (Metal oxide) qui est sensible à la présence de polluant de l’air
- Tension d’alimentation : 1,8V à 3,6V
- Courant consommé : 30mA (pic à 54mA)
- Puissance consommée : 60mW
- Plage de température de fonctionnement : -40°C à +85°C
- Plage d’humidité de fonctionnement : 10% à 95%
- Durée de vie du capteur : > 5 ans
- Fréquence du bus I2C : 10 à 400 kHz
- eCO2 : de 400ppm à 64000ppm
- TVOC : de 0ppb à 64000ppb
Toutes les caractéristiques techniques
4 modes de mesures sont disponibles (en détail page 8 de la documentation technique)
- Mode 0 (idle) fonctionnement au ralenti, basse consommation (0,034 mW)
- Mode 1 alimentation continue, mesure chaque seconde (46 mW)
- Mode 2 alimentation pulsée, mesure toutes les 10 secondes (7 mW)
- Mode 3 alimentation pulsée basse consommation, mesure toutes les 60 secondes (1,2 W)
- Mode 4 alimentation permanente, mesure possible toutes les 250ms (46 mW). Mode inadapté à un fonctionnement sur batterie
Comme la plupart des capteurs physico-chimiques, il faudra faire fonctionner le CCS-811 d’ams est continue durant au moins 48 heures avant que les mesures soient représentatives. En fonctionnement normal, il faudra attendre environ 30 minutes pour obtenir une mesure fiable
Source : https://ams.com/documents/20143/36005/CCS811_AN000370_1-00.pdf/5753a519-0a6f-be87-ed5f-eb069c652bb5
Installer la librairie Adafruit à l’IDE Arduino
J’ai testé plusieurs librairies permettant de communiquer avec le CCS811. J’ai finalement opté pour la librairie d’Adafruit qui est très bien supportée par l’ESP8266 (la Wemos d1 mini en l’occurence). Vous pouvez la récupérer sur GuitHub ici. Comme d’habitude, commercez par télécharger la librairie sans la décompresser.
Lancez l’IDE Arduino. Dans le menu croquis, allez dans le menu Inclure une bibliothèque puis Ajouter la bibliothèque ZIP. Indiquez le chemin vers la librairie Adafruit que vous venez de télécharger.
D’autres librairies au cas où :
Comparaison du taux de eCO2 (équivalent) avec une mesure réelle faite avec le MHZ19
Le CCS811 retourne donc deux valeurs. Le TVOC qui est la somme de tous les composés organiques volatils (COV) trouvés dans l’atmosphère et l’eCO2. Le eCO2 est un taux de CO2 calculé mathématiquement par le capteur. ams a publié notamment cette courbe comparative entre le taux de COV dans l’atmosphère et le taux de CO2.
D’après https://ams.com/documents/20143/36005/CCS811_WP000103_1-00.pdf/2da5de97-7c63-f605-aaf0-7320c5ec9101
Ce n’est donc pas une mesure réelle. Attention, c’est un indicateur théorique qu’il faut lire avec précaution. En présence de polluant(s), l’indicateur eCO2 risque de s’envoler sans pour autant représenter la teneur réelle en CO2 dans l’atmosphère. Pour connaître tous les seuils, vous pouvez lire ce document de l’INRS.
Branchement du CCS811 en I2C sur un ESP8266 (Wemos d1 mini)
Contrairement aux autres capteurs qui fonctionnent sur le bus de données I2C, il est nécessaire de connecter la broche WAK (Wakeup, réveil) pour démarrer le capteur. On peut le faire manuellement (ans ce cas le capteur reste en permanence sous tension) ou depuis le programme. Dans ce cas, il faudra s’assurer que la librairie prennent en compte le réveil du capteur avant chaque mesure. Ici, nous allons forcer le démarrage du capteur en reliant la broche WAK au GND de l’Arduino ou de l’ESP8266.
Pour améliorer la précision du CCS811, vous pouvez également compenser la température et l’humidité en utilisant la méthode setEnvironmentalData de la librairie Adafruit. Vous pouvez par exemple utiliser un DHT22, un BME280 ou un SHT30 pour cela.
Nous avons déjà pu utiliser le détecteur de CO2 MH-Z9 a plusieurs reprises. Nous utiliserons le port série pour récupérer les mesures du MH-Z19. Câblez le port série en croisant les broches comme d’habitude. La broche RX du MH-Z19 sur la D6 de l’ESP8266. La broche TX du MH-Z19 sur la D7 de l’ESP8266. Le MH-Z19 peut être alimenté avec une tension comprise entre 3,6V et 5,6V, il faudra donc l’alimenter depuis la broche +5V de l’Arduino ou de l’ESP8266. Sur un ESP8266, vous pouvez aussi alimenter le module en connectant la broche 3V3 du MH-Z19 sur la broche 3V3 de l’ESP8266. Fermez le circuit en connectant les broches GND.
Deux adresses I2C peuvent être sélectionnées (0x5A ou 0x5B). Par défaut le capteur se trouve à l’adresse 0x5A. Pour attribuer l’adresse 0x5B, reliez la broche ADD (ADDress à la broche GND de l’Arduino, ESP8266). Dans le code, vous devrez également indiquer la nouvelle adresse lors à l’initialisation de l’objet css (ccs.begin(0x5B)).
Pour vérifier l’adresse du capteur, vous pouvez utiliser ce scanner I2C dont le code source est disponible un peu partout (GitHub par exemple)
#include const int sclPin = D1; const int sdaPin = D2; void setup() { // put your setup code here, to run once: Serial.begin(9600); Serial.println("I2C scanner"); pinMode(D0,OUTPUT); digitalWrite(D0, LOW); Wire.begin(sdaPin, sclPin); // join i2c bus (sda,scl), sets speed to 100k } void loop() { // put your main code here, to run repeatedly: Serial.println(I2Ctest()); delay(5000); } String I2Ctest() { byte error, address; int nDevices; String s; s="Scanning:\n"; nDevices = 0; for(address = 1; address < 127; address++ ) { Wire.beginTransmission(address); error = Wire.endTransmission(); if (error == 0) { //s+="\n"; s+="I2C device found at address 0x"; if (address 0 && (unsigned char)co2Serial.peek() != 0xFF) { co2Serial.read(); } memset(response, 0, 9); co2Serial.readBytes(response, 9); if (response[1] != 0x86) { Serial.println("Invalid response from co2 sensor!"); return -1; } byte crc = 0; for (int i = 1; i < 8; i++) { crc += response[i]; } crc = 255 - crc + 1; if (response[8] == crc) { int responseHigh = (int) response[2]; int responseLow = (int) response[3]; int ppm = (256 * responseHigh) + responseLow; return ppm; } else { Serial.println("CRC error!"); return -1; } } void loop() { if(ccs.available()){ double temp = bme.readTemperature(); //ccs.calculateTemperature(); uint8_t hum = bme.readHumidity(); // uncomment to //ccs.setEnvironmentalData(hum,temp); int ppm = readCO2(); Serial.print(" CO2 " + String(ppm)); if(!ccs.readData()){ Serial.print(" ppm, eCO2: "); Serial.print(ccs.geteCO2()); Serial.print(" ppm, TVOC: "); Serial.print(ccs.getTVOC()); Serial.print(" ppb Temp:"); Serial.print(temp); Serial.print("*C Humidity: "); Serial.println(hum + String("%")); } else{ Serial.println("ERROR!"); while(1); } } delay(10*1000); }
Téléversez le programme et ouvrez le moniteur série de l’IDE Arduino. Si c’est la première fois que vous utilisez le CCS811, vous risquez d’obtenir des mesures très au dessus de la réalité. Il faut au moins le faire fonctionner en continu (mode 4) durant 48 heures. Comme vous pouvez le constater, on peut observer un écart d’environ 400ppm entre le niveau de CO2 mesuré à l’aide du MH-Z19 et le taux de CO2 équivalent calculé par l’algorithme du CCS811. Comme je vous l’avais annoncé dans l’introduction, c’est plus un indicateur qui donne un aperçu de la teneur en CO2.
Avec compensation de température et d’humidité
Et les résultats en retirant la compensation de température et d’humidité.
Sans compensation de température et d’humidité
La carte CJMCU CCS811 est une carte low cost de bonne qualité. Lorsque j’ai rédigé l’article, le capteur était placé sur mon bureau en face de moi. J’ai cependant pu observer de grandes variations d’une minute à l’autre du TVOC. Il pouvait passer de 42ppb à 1156 sans aucune explication. J’ai d’abord pensé que l’air de mon bureau était pollué et donc ouvert la fenêtre, mais rien ni a changé. C’est peut être normal mais je n’ai pas encore assez de retour ni d’autres capteurs similaires pour comparer les mesures (pour le moment). Je suis bien tenté de tester le BME680 de Bosch Sensortech, mais celui-ci est beaucoup plus cher.
Si vous avez pu tester d’autres cartes (Adafruit ou Sparkfun), profitez des commentaires pour partager vos expériences.
Autre remarque, dans vos programmes, ne tenez jamais compte de la première mesure (au démarrage de l’Arduino / ESP8266). Elle est en général nulle ou au maximum
COV, composés organiques volatils. VOC en anglais. Ce sont des polluants qui peuvent être dangereux pour la santé.
TVOC, Total Volatile Organic Compunds (niveau de composés organiques volatils totaux) est une mesure de la somme de tous les composés organiques volatils (COV) trouvés dans un échantillon d’air. C’est un très bon indicateur de la qualité de l’air dans un bâtiment.
I2C (pour en savoir plus sur le bus
ppb (unité), parts per billion, parties par milliard
- ESP32, broches GPIO et fonctions associées. I/O, PWM, RTC, I2C, SPI, ADC, DAC
- ESP32-CAM. Broches et équipements ESP-EYE, AI Thinker, TTGO T-Camera, M5Stack Timer Camera…
- ESP32-CAM. Quel modèle choisir ? ESP-EYE, AI Thinker, TTGO T-Camera, M5Stack Timer Camera…
- M5Stack Atomic GPS. Tracker ESP32 TinyGPS++, export GPX sur carte SD, visualisation sur Google Maps ou VSCode
- Home Assistant. Installer le snap sur NAS Synology sur une machine virtuelle Ubuntu
Avez-vous aimé cet article ?