Par David Peaslee
Construire un détecteur de CO (monoxyde de carbone) qui peut vous alerter en cas de niveaux dangereux de CO peut être fait avec aussi peu qu’un capteur de gaz, un Arduino (ou autre microcontrôleur) et quelques résistances. L’ajout de quelques amplificateurs opérationnels peut augmenter la sensibilité pour mesurer la quantité de CO présente dans l’environnement. En développant ces connaissances, vous pouvez construire votre propre station de surveillance de la qualité de l’air, et comparer votre propre arrière-cour avec les niveaux signalés par les stations météorologiques locales.
Matériel requis
- 1 Arduino Uno
- 1 multimètre (DMM)
- 1 planche à pain avec divers fils de liaison
- 2 résistances 10 kΩ
- 1 résistance 100 kΩ
- 1 capteur de gaz CO SPEC (numéro de pièce Digi-Key : 1684-1000-ND)
Histoire du projet
Alors que je travaillais dans une entreprise de capteurs de gaz, j’ai travaillé avec de nombreuses startups qui avaient beaucoup d’idées géniales pour mesurer la qualité de l’air. Bien que j’espère vraiment que tout le monde aura un jour des capteurs de gaz dans ses téléphones et ses ordinateurs, pour l’instant, j’aimerais aider le Maker de tous les jours à construire ses propres systèmes de surveillance de l’air.
Pour ce projet, j’aimerais commencer par les bases : Qu’est-ce qui fait fonctionner un capteur électrochimique ?
- Il existe deux types de base de capteurs de gaz électrochimiques, à 2 électrodes et à 3 électrodes. Ils fonctionnent tous deux selon les mêmes principes de base. Un gaz se diffuse dans le capteur et se dirige vers l’électrode de travail. Là, il réagit avec un catalyseur et crée des ions (molécules chargées). Ces ions se déplacent dans l’électrolyte (parfois similaire à l’acide d’une batterie) et réagissent à nouveau au niveau de la contre-électrode où les électrons sont libérés (ou collectés) pour se déplacer dans le circuit. Selon le gaz qui réagit et le catalyseur, ces électrons peuvent entrer ou sortir de l’une ou l’autre électrode. En mesurant ce flux d’électrons (courant), nous avons une idée du nombre de particules qui réagissent par seconde, ce qui nous donne une idée du nombre de particules présentes en premier lieu.
- Avec l’ajout d’une troisième électrode, la référence, nous pouvons créer une différence de tension constante entre les tensions de référence et de travail. C’est ce qu’on appelle le potentiel de polarisation. Par exemple, si la tension de référence est de 1,25 V et que la tension de travail est de 1,35 V, on dit que la polarisation est de +100 mV. La chimie n’a rien à voir avec les tensions de 1,25 et 1,35 V, elle se soucie uniquement de la présence d’un potentiel de +100 mV sur l’électrode de travail. Il y a beaucoup d’autres choses dans cette cellule électrochimique, mais c’est tout ce que nous devons savoir pour commencer. Dans ce projet, nous allons prendre un capteur à 3 électrodes et l’utiliser dans une configuration à 2 électrodes comme dans la figure 1.
- Une dernière info, PPM, ou parties par million, est une norme d’énonciation de la concentration. Par exemple, 1 ppm est une particule d’un gaz particulier par million de particules totales de gaz présentes.
Figure 1. Un capteur de gaz à 3 électrodes connecté dans une configuration à 2 électrodes. (Image reproduite avec l’aimable autorisation de SPEC Sensors)
Disclaimer 1 : Attention : Je vais vous montrer quelques résultats de tests que j’ai effectués avec du gaz monoxyde de carbone sous pression. Une petite bouteille de CO est disponible en ligne, mais elle est mortelle. Vous devriez vous renseigner à ce sujet avant de décider d’utiliser du CO dans un projet.1 Avertissement 2 : Si vous devez trouver une autre source de CO, une cigarette produira environ 300 ppm de CO dans le flux inhalé.
Comment faire
Figure 2. Configuration de base du prototype de capteur de gaz. (Image courtoisie de SPEC Sensors)
Partie 1 – Configuration de base du capteur
Je vais commencer par le circuit le plus basique et vous montrer comment mesurer le capteur avec juste un capteur, une résistance de 10 kΩ et un multimètre.
i. Coupez les deux broches qui ne sont pas étiquetées (voir la figure 2), puis centrez le capteur sur la planche à pain.
ii. Utilisez un cavalier court pour court-circuiter les broches R et C (compteur et référence). Utilisez un autre cavalier court pour court-circuiter les broches W1 et W2 (cela donne juste un chemin supplémentaire pour le courant car les broches sont déjà court-circuitées sur le PCB).
iii. Connectez le fil positif du multimètre au côté R/C du capteur. Connectez le côté négatif du multimètre au côté W1/W2 du capteur.
iv. Enfin, utilisez une résistance de 10 kΩ (R1) pour connecter les broches R/C aux broches W1/W2.
À ce stade, vous êtes prêt à tester le capteur. Vous pouvez utiliser une allumette ou de la fumée, mais il fonctionnera mieux s’il est dans un récipient scellé. Un plat en pyrex/verre avec un couvercle hermétique fera très bien l’affaire. Essayez d’allumer une allumette, puis soufflez-la et mettez-la dans le plat avec le capteur. Vous devrez peut-être faire des trous pour faire passer les lignes électriques. Dans mon installation, j’ai fait passer 200 ppm de CO à environ 100 centimètres cubes par minute, ce qui est plutôt lent. Comme le montre la figure 3, seul le multimètre est branché au capteur.
Figure 3. Configuration du capteur de CO avec seulement un multimètre connecté pour montrer la sortie. (Image courtoisie de SPEC Sensors)
Certains calculs nécessaires:
La mesure que vous pouvez attendre dépend de votre configuration et de la sensibilité du capteur. Dans ce mode à 2 électrodes, vous pouvez vous attendre à environ la moitié de la sensibilité, donc si votre capteur dit 4,0 nA/ppm, le vous pouvez vous attendre à environ 2 nA/ppm. Pour convertir les mV en ppm, utilisez la loi d’Ohm : Tension (V) = Courant (A) x Résistance (Ω). Par exemple :
Dans le montage de la figure 3, je commence avec 0,2 mV sans gaz et je termine avec 4,8 mV avec environ 200 ppm s’écoulant dans la boîte et sortant par un évent vers l’extérieur. La différence de tension est de 4,6 mV. La résistance R1 étant de 10 kΩ, le courant est de 0,0046 V/ 10 000 Ω, soit 460 nA. Pour obtenir des ppm, divisez le courant mesuré par la sensibilité ; 460 nA / ~2 nA/ppm, soit 230 ppm. C’est assez proche de ce que j’ai mis dans la boîte ; 200 ppm. Pour calculer la nouvelle sensibilité, utilisez mV et ppm. Ma nouvelle sensibilité est de 4,6 mV/200 ppm ou 0,23 mV/ppm.
La figure 4 montre la direction du courant dans le circuit. La borne A est le fil positif du DMM et B est le fil négatif (commun). Vous pouvez imaginer que les électrons sont consommés à l’électrode de travail et produits à l’électrode de compteur/référence. Si les fils du capteur sont à l’envers, vous mesurerez plutôt une tension négative.
Figure 4. Direction du flux de courant dans la configuration du capteur. (Image courtoisie de SPEC Sensors)
Partie 2 – Configuration avancée du capteur
Nous allons maintenant incorporer l’Arduino Uno dans ce projet. Il y a quelques changements que nous ferons pour surmonter ses limitations, mais en réalité, vous pouvez le brancher de la même manière que vous l’avez fait avec le multimètre. Le côté positif connectera la broche analogique A0 aux broches R/C du capteur, et le côté négatif connectera le GND aux broches W1/W2 du capteur. Avec ceci, utilisez analogRead() pour mesurer la tension à travers le capteur et la résistance R1. Le code Arduino final peut être trouvé dans le à la fin de cet article, et il inclut les améliorations d’échantillonnage que j’ai soulignées ci-dessous.
Notes sur l’ADC d’un Arduino:
D’après le calcul ci-dessus, vous pouvez voir que 1 ppm va générer une tension de 0,23 mV. C’est un problème pour l’ADC 10 bits de l’Arduino, car la résolution minimale de l’Uno est de 4,88 mV (5 V/1024 niveaux). Cela signifie que le minimum que l’Arduino peut détecter est de 21 ppm, ce qui est encore trop élevé.
La première amélioration consiste à changer la référence analogique pour la référence interne de 1,1 V . Cela change la résolution minimale à 4,7 ppm, ce qui est mieux. Veuillez lire les instructions à ce sujet à https://www.arduino.cc/en/Reference/AnalogReference. La correction suivante consiste à implémenter le calcul de la moyenne. Le taux de lecture maximum de analogRead() est de 10 000 fois par seconde. Si vous faites la moyenne d’un tas de ces lectures sur une seconde, disons 256, cela améliorera la résolution de manière significative.2
Enfin, comme vous avez augmenté la résolution, vous pouvez trouver que le zéro n’est plus 0 V sur l’ADC de l’Arduino. Pour résoudre ce problème, nous devons amener cette tension nulle (ce qui signifie un courant nul) à une valeur plus élevée qui peut être lue par l’ADC. Ici, nous allons mettre en œuvre une échelle de tension avec l’ajout d’une résistance de 100 kΩ et d’une résistance de 10 kΩ. Lorsque le courant généré par le capteur est nul, nous allons mesurer la tension entre les deux nouvelles résistances. Le courant qui traverse les résistances est de 3,3 V/(100 000 +10 000 Ω), soit 30 microAmps. Donc, entre les deux nouvelles résistances, nous allons mesurer 10 000 Ω * 30 microAmps ou 0,3 volt. Cette échelle de tension utilisera 30 microAmps, donc si vous devez économiser de l’énergie, pour la durée de vie de la batterie, essayez d’augmenter la valeur de la résistance de 100 kΩ. Maintenant, notre nouvelle tension nulle est proche de 0,3 Volts, et tout ce qui est au-dessus est dû au gaz CO générant une tension à travers la résistance R1.
Figure 5. Prototype de capteur de CO avec une carte Arduino. (Image courtoisie de SPEC Sensors)
Donc, comme dernier exemple, avec cette configuration, nous mesurons 0,355 volts. Soustrayez d’abord la tension nulle de 0,3 V, ce qui donne 0,055 V ou 55 mV. Maintenant, divisez par notre nouvelle sensibilité de 0,23 mV/ppm et nous mesurons 240 ppm de CO, ce qui est un niveau dangereux à respirer pendant de longues périodes.
Résumé et prochaines étapes :
En utilisant le terminal série, j’ai pu capturer environ 2 heures d’enregistrement à environ 1 échantillon toutes les 1,5 secondes. La figure 6 montre ce qui est possible avec l’Arduino, quelques résistances, le capteur et une moyenne. Les prochaines étapes seraient d’utiliser le capteur dans une configuration à 3 électrodes, ce qui fournit une stabilité supplémentaire et une amplification du signal. Pour cela, il faut un double amplificateur opérationnel, ou deux doubles amplificateurs opérationnels, et quelques résistances. En réalité, la sortie des capteurs peut dépendre d’autres facteurs tels que la température et les changements d’humidité, mais une bonne station météorologique enregistrera également ces choses.
Figure 6. Sortie de la configuration du capteur Arduino avec la moyenne des données. (Image gracieuseté de SPEC Sensors)
Dans les prochains articles, je présenterai d’autres projets, notamment le circuit à 3 électrodes et l’utilisation de versions numériques de ces capteurs. Si vous êtes prêt à construire votre propre circuit, vous pouvez consulter les notes d’application chez SPEC Sensors.
Code Arduino utilisé pour ce projet:
/*
Analog input, Serial output
Reads an analog gas sensor at pins A0,
Also prints the results to the serial monitor.
The circuit:
Gas sensor pin W (Working) connected to middle of resistor ladder (I used 10k and 100k).
Gas sensor C (counter) and R (reference) connected together and then jumped to analog pin A0.
10 kOhm resistor between W1/W2 and C/R.
created 01 Jul. 2017
by David Peaslee
*/
// these constants won't change. They're used to give names to the pins used:
const int analogInPin = A0; // Analog input pin that the sensor is attached to
const int resValue = 9700; // Value of 10kOhm resistor !change this to match your resistor
const float Vref = 1.1; //This is the voltage of the internal reference
const long int cOff = 68286; //286mV offset due to resistor ladder. Try taking the average of a long
//measurement of the counts without a sensor in place. This should give a good Zero.
const float Sf = 2.11; // sensitivity in nA/ppm,
//this is roughly about 1/2 the sensitivity of the barcode on the sensor. Try finding a known
//concentration of CO to measure, or just approximate.
const int extraBit = 256; //Number of samples averaged, like adding 8 bits to ADC
long int sensorValue = 0; // value read from the sensor
float currentValue = 0; // current read from the sensor
void setup() {
// initialize serial communications at 9600 bps:
Serial.begin(9600);
// !!!set analog reference to 1.1 Volts!!!
analogReference(INTERNAL);
}
void loop() {
// read the analog in value:
sensorValue = 0;
for (int i = 0; i < extraBit; i++) {
sensorValue = analogRead(analogInPin) + sensorValue;
delay(3); // needs 2 ms for the analog-to-digital converter to settle after the last reading
}
sensorValue = sensorValue - cOff; //subtract the offset of the resistor ladder * 256.
// print the results to the serial monitor:
Serial.print("PPM = ");
Serial.print( ((float) sensorValue / extraBit / 1024 * Vref / resValue * 1000000000) / Sf);
Serial.print("\tnA = ");
Serial.print( (float) (sensorValue) / extraBit / 1024 * Vref / resValue * 1000000000);
Serial.print("\tCounts = " );
Serial.println(sensorValue);
//Trying to make each loop 1 second
delay(218); //1 second – 3ms*256ms (each adc read)-14ms (for printing)= 218ms
}
Pour des bibliothèques de capteurs Spec supplémentaires pour travailler avec divers capteurs ULP, allez sur ce lien à GitHub : https://github.com/SPEC-Sensors/ULPSM