Test du capteur de CO2 STC31 de Sensirion

Test du capteur de CO2 STC31 de Sensirion

Cela fait longtemps que Yoctopuce propose un capteur de CO2. Le modèle actuel, le Yocto-C02-V2, a une plage de mesure de 0-40000ppm soit 0 à 4%. Ce qui est suffisant pour la plupart des applications courantes. Mais que faire si vous avez besoin de mesurer des concentrations plus élevée ? Il se trouve que Sensirion propose maintenant le capteur STC31 avec une plage de mesure de 0 à 100%.


Le capteur STC31

Comparé au SCD30, dont est équipé le Yocto-C02-V2, le STC31 est minuscule 3x3.5mm. S'il est capable de mesurer jusqu'à 100% sa précision n'est, au mieux que, de 5000ppm (0.5%) contre environ 30ppm pour le SCD30.

On a commandé le nôtre sur Sparkfun sous la référence SPX-18385. Il est livré soudé sur un petit PCB de 26x26mm. Sur ce PCB, on trouve aussi un capteur de température et d'humidité SHTC3. Les deux capteurs ont une interface I2C.

Le SPX-18385 de sparkfun
Le SPX-18385 de sparkfun


Pour tester notre capteur, on a bien sûr utilisé un Yocto-I2C. La présence de connecteurs Qwiic sur le board rend la connexion triviale.

Connexion à un Yocto-I2C ?  trop facile.
Connexion à un Yocto-I2C ? trop facile.


Programmation

Le plus pratique pour interroger le capteur consiste à écrire un job qui, exécuté par le Yocto-I2C, se chargera de gérer les requêtes I2C et de présenter les valeurs à la manière d'un capteur Yoctopuce standard, ce qui rendra son intégration triviale grâce à l'API Yoctopuce.

Méthode un peu simpliste

L'adresse du 7bits du capteur est 0x29. Comme tous les capteurs Sensirion, le STC31 utilise de nombreux CRC, mais cette fois, on peut les désactiver à l'aide de la commande 0x3768 ce qui rend la programmation nettement plus facile. Il faut ensuite configurer le mode de fonctionnement, on a le choix entre:

  • Commande 0x3615000 : 0..100% dans l'azote
  • Commande 0x3615001 : 0..100% dans l'air
  • Commande 0x3615002 : 0..25% dans l'azote
  • Commande 0x3615003 : 0..25% dans l'air

Optionnellement, on peut activer l'auto-calibration avec la commande 0x3FEF .


On peut donc écrire un job qui contient la tâche d'initialisation suivante:

assert !isset($started) writeLine {S}523768{P} expect 29:{A}{A}{A} writeLine {S}5236150003{P} expect 29:{A}{A}{A}{A}{A} writeLine {S}523FEF{P} expect 29:{A}{A}{A} compute $started=1



Pour la lecture, on ajoute au job une tâche périodique (période=1000ms) qui utilise la commande 0x3639 pour lancer la mesure, attend 75ms, lit le résultat sous la forme d'un entier non signé 16 bit (WORD) que l'on stocke dans la variable $CO2RAW. Enfin on converti $CO2RAW en pourcentage à l'aide de la formule 100*($CO2RAW-16384)/32768 et on affecte le résultat au genericSensor1 du Yocto-I2C.

assert isset($started) writeLine {S}523639{P} wait 75 writeLine {S}53xx{A}xx{N}{P} expect 29:{A}($CO2RAW:WORD) compute $1=100*($CO2RAW-16384)/32768



Pour voir si ça marche et vérifier que le capteur est un peu crédible, on peut évidemment utiliser VirtualHub, mais on aura une bien meilleure vue d'ensemble avec Yocto-Visualization.

Test avec Yocto-Visualization. Y'a comme un truc bizarre
Test avec Yocto-Visualization. Y'a comme un truc bizarre


A priori, ça marche. La valeur mesurée de 0.2% est clairement élevée par rapport au 0.05% (500ppm) attendus mais compte tenu de la précision de 0.5% annoncée dans le datasheet du STC31, on est dans les clous. Par contre si, sachant que les humains émettent un peu de CO2 à travers la peau, on essaye de faire monter le taux de CO2 en posant le doigt sur le capteur, la valeur mesurée s'effondre et descend même jusque dans les négatifs.

Renseignements pris, il apparaît que le capteur est très sensible à l'humidité. C'est pourquoi il est plus que conseillé de fournir un capteur mesurant le taux d'humidité ambiante afin qu'il puisse la compenser. On comprend maintenant pourquoi il y a un capteur d'humidité sur le board de Sparkfun.

Méthode qui tient compte de l'humidité

Le capteur SHTC3 dont l'adresse sur 7 bits est 0x70 ne nécessite pas d’initialisation spécifique. Pour interroger le capteur il faut

  • Réveiller le capteur à l'aide de la commande 0x3517
  • Attendre 1 ms
  • Lancer une mesure à l'aide de la commande 0x7866
  • Attendre 15 ms
  • Lire la température et l'humidité sous la forme de deux entiers 16bits que l'on stocke dans les variables $TEMPRAW et $HUMRAW, attention le troisième byte est un CRC


Optionnellement, on peut convertir $TEMPRAW en °C et $HUMRAW en pourcentage grâce au formules -45+175*$TEMPRAW/65536 et 100*$HUMRAW/65536 puis affecter le résultat aux genericSensors 2 et 3 du Yocto-I2C.

Pour injecter la valeur d'humidité dans le capteur STC31, il faut utiliser la commande 0x3624 suivie de la valeur de $HUMRAW. Le reste de la tâche est identique. La tâche de mesure devient donc:

assert isset($started) writeLine {S}E03517{P} wait 1 expect 70:{A}{A}{A} writeLine {S}E07866{P} expect 70:{A}{A}{A} wait 15 writeLine {S}E1{A}xx{A}xx{A}xx{A}xx{A}xx{N}{P} expect 70:{A}($TEMPRAW:WORD)($CRC:BYTE)($HUMRAW:WORD).* compute $2=-45+175*$TEMPRAW/65536 compute $3=100*$HUMRAW/65536 writeVar {S}523624($HUMRAW:WORD){P} expect 29:{A}{A}{A}{A}{A} writeLine {S}52362F03C1{P} expect 29:{A}{A}{A}{A}{A} writeLine {S}523639{P} wait 75 writeLine {S}53xx{A}xx{N}{P} expect 29:{A}($CO2RAW:WORD) compute $1=100*($CO2RAW-16384)/32768


Cette fois, lorsque qu'on pose le doigt sur le capteur, le changement brutal d'humidité continue de perturber le capteur, mais on voit que la compensation a un effet sur la mesure. Même si cette compensation n'est pas parfaite, la mesure compensée reste dans la limite des 0.5% annoncés par le datasheet.

Avec la compensation de l'humidité, c'est un peu mieux.
Avec la compensation de l'humidité, c'est un peu mieux.


Conclusion

Le capteur STC31 de Sensirion pourrait vous intéresser si vous avez besoin de mesurer des grosses concentrations de CO2 mais que la précision n'est pas une grosse priorité. Par contre, il n'est clairement pas interchangeable avec le SCD30 présent sur le Yocto-C02-V2, les deux capteurs ont une plage de mesure et une précision qui n'ont rien en commun. De plus, il est apparemment indispensable de coupler le STC31 avec un capteur d'humidité, sans quoi sa précision risque d'être affectée de manière significative. On peut facilement interroger le capteur STC31 de Sensirion avec un Yocto-I2C. Si vous voulez essayer vous-même, vous pouvez télécharger le job qu'on a écrit pour ce test.

Commenter aucun commentaire Retour au blog












Yoctopuce, get your stuff connected.