Capteur de gaz multicanaux MiCS-6814

Ce tutoriel explique comment mettre en oeuvre un module Grove I2C capteur de gaz multicanaux version 1 utilisant un MEMS MiCS-6814 de SGX SENSORTECH en MicroPython.

Le capteur MEMS MiCS-6814 est conçu pour détecter la pollution automobile et les odeurs agricoles et industrielles. Il est composé de 3 capteurs, un pour les gaz oxydants, un autre pour les gaz réducteurs et un dernier pour le NH3 (le gaz ammoniac). Chaque capteur est constitué d’un diaphragme micro-usiné et d’une résistance chauffante. Les concentrations rapportées sont en ppm soit parties par million. Le ppm permet de savoir combien de molécules de polluant on trouve sur un million de molécules d’air.

La mise en oeuvre de ce capteur est particulièrement délicate car la technologie utilisée ne permet pas de déterminer précisément quel gaz est détecté (parmi un pannel possible) et donne une estimation grossière de sa concentration. Les capteurs capables d’identifier les espèces chimiques et de les doser avec précision sont considérablement plus encombrants et plus chers…

Par conséquent, une utilisation du MiCS-6814 sans calibrage et sans cas d’usage emmènera nécessairement à des détections absurdes. Par exemple, le MiCS-6814 dont je dispose rapporte presque systématiquement 10000+ ppm de CH4 alors qu’il n’y en a pas mon environnement campagnard ! Il est cependant très sensible : une fois calibré, si un gaz qu’il peut détecter dépasse dans son environnement sa concentration habituelle, il renvoie immédiatement un signal.

Pour ces raisons il est indispensable :

  1. De commencer par calibrer le module et d’ajuster ses mesures à l’endroit où il va fonctionner.
  2. De choisir quelle espèce chimique on veut surveiller et autant que possible de s’assurer que d’autres gaz polluants ne se présenteront pas, afin éviter de fausses alertes.

L’exemple qui nous a paru le plus parlant est la détection de monoxyde de carbone, un gaz que l’on trouve présent dans la plupart des fumées de combustions, mais aussi dans le souffle des fumeurs. Le monoxyde de carbone (CO) est un gaz inodore et toxique (asphyxiant) à partir d’une concentration de 200 ppm et potentiellement mortel autour de 800 ppm. Attention, l’objectif de ce tutoriel n’est pas de fabriquer un détecteur de CO homologué et fiable mais simplement d’en faire une démonstration en MicroPython.

Matériel requis

  1. Une carte d’extension de base Grove
  2. La carte NUCLEO-WB55
  3. Un module Grove Multichannel Gas Sensor

Le module Grove Multichannel Gas Sensor version 1.0 :

Grove - Multichannel Gas Sensor (MiCS-6814)

Crédit image : Seeed Studio

Première étape : le code MicroPython pour calibrer le MiCS-6814

Les scripts présentés ci-après sont disponibles dans la zone de téléchargement.

Il faut ajouter le fichier mics6814.py dans le répertoire du périphérique PYBLASH.

Editez maintenant le script main.py :

# Objet du script : Calibrage du module Grove capteur de gaz basé sur le MEMS MiCS-6814
# Exécutez ce script dans un environnement aéré et non pollué.
# Ce programme réalise deux opérations :
# 1 - Il calibre les ADC des trois canaux de capture du MiCS-6814 pour le caclul des concentrations des différents gaz
# 2 - Il évalue le signal maximum du capteur concernant les différents gaz pour les déduire par la suites des mesures (offsets)

from array import array # Pour utiliser des tableaux
from machine import I2C # Pilote du bus I2C
from time import sleep_ms # Pour temporiser
from mics6814 import MICS6814 # Pilote du MICS6814

PRE_HEAT_ROUNDS = const(60) # Nombre d'itérations de chauffage
PRE_HEAT_TIME_TEMPO = const(60000) # Durée d'une itération de chauffage (en millisecondes)

#Initialisation du bus I2C numéro 1 du STM32WB55 
i2c = I2C(1)

# Pause d'une seconde pour laisser à l'I2C le temps de s'initialiser
sleep_ms(1000)

# Instanciation du capteur
sensor = MICS6814(i2c)

print("\nPréchauffage du capteur avant calibration : %d minutes" %((PRE_HEAT_ROUNDS * PRE_HEAT_TIME_TEMPO) // 60000))

# On démarre les résistances chauffantes des capteurs 
sensor.heater_on()

p = 0
for i in range(PRE_HEAT_ROUNDS):
	sleep_ms(PRE_HEAT_TIME_TEMPO)
	p += 1
	# On affiche l'avancement toutes les cinq minutes
	if p == 5: 
		print(" Avancement : %d minutes" %(i+1))
		p = 0

# Temporisation de 5 secondes
sleep_ms(5000)

print("\nCalibration démarrée")
sensor.do_calibrate()
print("\nCalibration terminée")

# On éteint les résistances chaufffantes des capteurs
sensor.heater_off()

# Affichage des valeurs mémorisées en EEPROM
sensor.display_eeprom()

# Mesures ambiantes / offsets pour les concentrations mesurées
sensor.flush_raw()

Sortie sur le port série de l’USB USER

Appuyez sur CTRL+D dans le terminal PuTTY laisser le calibrage se faire pendant un peu plus de 60 minutes. Pour mon capteur à l’endroit où je me trouve, ceci donne les résultats suivants :


Grove - calibrage MiCS-6814 sortie


A la fin de cette étape, je sais que lorsqu’il est chaud, le capteur signale en général 4 ppm de CO qui n’existent pas ; c’est un décalage systématique (“offset”) qu’il faudra déduire des mesures de notre détecteur dans le script suivant.

Deuxième étape : le code MicroPython pour détécter le monoxyde de carbone

Les scripts présentés ci-après sont disponibles dans la zone de téléchargement.

Il faut ajouter le fichier mics6814.py dans le répertoire du périphérique PYBLASH.

Editez maintenant le script main.py et copiez-y le code qui suit :

# Objet du script :
# Mesure de la concentrations de monoxyde de carbone à l'aide du module Grove basé sur le capteur MEMS MiCS-6814.
# Fiche technique : https://www.sgxsensortech.com/content/uploads/2015/02/1143_Datasheet-MiCS-6814-rev-8.pdf

from machine import I2C # Pilote du bus I2C
from time import sleep # Pour temporiser

#Initialisation du bus I2C numéro 1 du STM32WB55 
i2c = I2C(1)

# Pause d'une seconde pour laisser à l'I2C le temps de s'initialiser
sleep(1)

from mics6814 import MICS6814

sensor = MICS6814(i2c)

# Seuils de détection pour le monoxyde de carbone en ppm
CO_LT = 1 # seuil bas, d'après la  fiche technique du MICS6814
CO_HT = 50 # seuil haut, seuil de risque sanitaire

# Offset (ambiant) fourni par le script de calibrage
Offset_CO = 4.0

# On démarre les résistances chaufffantes du capteur 
sensor.heater_on()
nb_detect = 0

# On fait une série de mesures "à blanc" pour préchauffer le capteur

PREHEAT_ROUNDS = const(20)

print("Préchauffage pendant %d minutes" %(PREHEAT_ROUNDS * 10 // 60) )
for i in range(PREHEAT_ROUNDS):
	co = sensor.get_co()
	sleep(10)
print("Préchauffage terminé\n")

while True: # boucle ...

	# Pourt le moment, pas de mesure faite, donc potentiellement pas de CO détecté
	co_detecte = False

	# Estime la concentration en CO, en déduisant l'offset ambiant
	co = sensor.get_co() - Offset_CO
	
	# Si le résultat est positif, vérifie qu'il est bien au-dessus du seuil de détection bas du capteur
	if co > CO_LT:
		co_detecte = True
		nb_detect += 1
		if co < CO_HT:
			print("%1d - Concentration CO : %.1f ppm" %(nb_detect, co))
		else:
			# Si on dépasse le seuil d'alerte, signale le
			print("%1d - Alerte CO : %.1f > %.1f ppm : " %(nb_detect, co, CO_HT))
	elif co < 0:
			# Si la concentration mesurée est négative, signale une erreur du capteur
			print("%1d - Monoxyde de carbone (CO) : Erreur de mesure !")
			# Quitte la boucle
			break

	if co_detecte:
		print('')
		# Si du CO a été détecté, allume la LED du module pendant 10 secondes
		sensor.led_on()
		sleep(10)
		sensor.led_off()

Sortie sur le port série de l’USB USER

Appuyez sur CTRL+D dans le terminal PuTTY. Allumez une bougie, éteignez-là et approchez-là du capteur. Pour mon capteur, cela fait augmenter brusquement la concentration en CO et génère les messages ci-dessous :


Grove - mesure CO MiCS-6814 - sortie