CCS811 IAQ, test du capteur de qualité de l'air TVOC, eCO2 bus i2C (Arduino, ESP8266) • Domotique et objets connectés à faire soi-même

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€.

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

xkpftjdi41husr84ib7f-2569634

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.

rwentb5nywfvoeqchoyl-6030728

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.

k6c59xjrvjvz3jx76qa3-9054128

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.

nrbwfpbqhnu2eljxuree-9690359

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.

ikghylwkzpqngcwaw8or-4757747

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.

tgos8txurf3fghbsvxmx-2932691

Avec compensation de température et d’humidité

Et les résultats en retirant la compensation de température et d’humidité.

mvnjerbvotn1ik97mmea-4092772

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.

wlvfbofcccxhlpdhnxzt-6361896

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

is39cz5jjr4fzx2ckxz9-2157023

COVcomposé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

Tous les documents techniques

Avez-vous aimé cet article ?