De David Peaslee

Construirea unui detector de CO (monoxid de carbon) care vă poate alerta la niveluri periculoase de CO se poate face cu doar un senzor de gaz, un Arduino (sau alt microcontroler) și câteva rezistențe. Adăugarea câtorva amplificatoare operaționale poate crește sensibilitatea pentru a măsura cantitatea de CO prezentă în mediul înconjurător. Extinzând aceste cunoștințe, vă puteți construi propria stație de monitorizare a calității aerului și puteți compara propria curte cu nivelurile raportate de stațiile meteo locale.

Materiale necesare

  • 1 Arduino Uno
  • 1 multimetru (DMM)
  • 1 placă de pâine cu diverse fire jumper
  • 2 rezistențe de 10 kΩ
  • 1 rezistență de 100 kΩ
  • 1 senzor de gaz SPEC CO (număr de piesă Digi-Key: 1684-1000-ND)

Povestea proiectului

În timp ce lucram la o companie de senzori de gaz, am lucrat cu multe startup-uri care aveau multe idei grozave pentru măsurarea calității aerului. Deși sper cu adevărat că toată lumea va avea într-o zi senzori de gaz în telefoanele și computerele lor, deocamdată, aș vrea să îi ajut pe Makerul de zi cu zi să își construiască propriile sisteme de monitorizare a aerului.

Pentru acest proiect, aș vrea să încep cu elementele de bază: Ce face ca un senzor electrochimic să funcționeze?

  • Există două tipuri de bază de senzori electrochimici de gaz, cu 2 electrozi și cu 3 electrozi. Ambele funcționează cu aceleași principii de bază. Un gaz difuzează în senzor și își face drum spre electrodul de lucru. Acolo reacționează cu un catalizator și creează ioni (molecule încărcate). Acești ioni se deplasează prin electrolit (uneori similar acidului de baterie) și reacționează din nou la contraelectrod, unde electronii sunt eliberați (sau colectați) pentru a se deplasa prin circuit. În funcție de gazul care reacționează și de catalizator, acei electroni pot intra sau ieși din oricare dintre electrozi. Măsurând acest flux de electroni (curent) obținem o idee despre câte particule reacționează pe secundă, ceea ce ne dă o idee despre câte particule sunt acolo în primul rând.
  • Cu adăugarea unui al treilea electrod, cel de referință, putem crea o diferență de tensiune constantă între tensiunea de referință și cea de lucru. Aceasta este ceea ce numim potențial de polarizare. De exemplu, dacă tensiunea de referință este de 1,25 V, iar cea de lucru este la 1,35 V, spunem că polarizarea este de +100 mV. Chimia nu are nimic de-a face cu cei 1,25 și 1,35 volți, îi pasă doar de faptul că există un potențial de +100 mV pe electrodul de lucru. Există mult mai multe lucruri care intră în această celulă electrochimică, dar asta este tot ce trebuie să știm cu adevărat pentru a începe. În acest proiect, vom lua un senzor cu 3 electrozi și îl vom folosi într-o configurație cu 2 electrozi, ca în figura 1.

  • O ultimă informație, PPM, sau părți pe milion, este un standard de indicare a concentrației. De exemplu, 1 ppm reprezintă o particulă a unui anumit gaz la un milion de particule totale de gaz prezente.

Senzor SPEC - Monoxid de carbon

Figura 1. Un senzor de gaz cu 3 electrozi conectat într-o configurație cu 2 electrozi. (Imagine oferită de SPEC Sensors)

Disclaimer 1: Atenție: Vă voi arăta câteva rezultate ale unor teste pe care le-am făcut cu monoxid de carbon gazos presurizat. O butelie mică de CO este disponibilă online, dar este letală. Ar trebui să vă documentați în acest sens înainte de a vă decide să folosiți CO într-un proiect. 1 Disclaimer 2: Dacă trebuie să găsiți o sursă alternativă de CO, o țigară va produce aproximativ 300 ppm de CO în fluxul inhalat.

Cum se face

Configurarea de bază a prototipului senzorului de gaz.

Figura 2: Configurarea prototipului senzorului de gaz. Configurația de bază a prototipului senzorului de gaz. (Pentru imagine, mulțumim SPEC Sensors)

Partea 1 – Configurarea de bază a senzorului

Voi începe cu cel mai de bază circuit și vă voi arăta cum să măsurați senzorul doar cu un senzor, o rezistență de 10 kΩ și un multimetru.

i. Tăiați cei doi pini care nu sunt etichetați (vezi figura 2), apoi centrați senzorul pe breadboard.

ii. Folosiți un jumper scurt pentru a scurtcircuita pinii R și C (contor și referință). Folosiți un alt jumper scurt pentru a scurtcircuita pinii W1 și W2 (acest lucru oferă doar un traseu suplimentar pentru curent, deoarece pinii sunt deja scurtcircuitați pe PCB).

iii. Conectați cablul pozitiv al multimetrului la partea R/C a senzorului. Conectați partea negativă a multimetrului la partea W1/W2 a senzorului.

iv. În cele din urmă folosiți un rezistor de 10 kΩ (R1) pentru a conecta pinii R/C la pinii W1/W2.

În acest punct sunteți gata să testați senzorul. Puteți folosi un chibrit sau un fum, dar va funcționa mai bine dacă se află într-un recipient sigilat. O farfurie Pyrex/de sticlă cu un capac ermetic va funcționa foarte bine. Încercați să aprindeți un chibrit, apoi suflați-l și puneți-l în vasul cu senzorul. Este posibil să trebuiască să faceți găuri pentru a trece liniile electrice. În configurația mea, am rulat 200 ppm CO la aproximativ 100 de centimetri cubi pe minut, ceea ce este destul de lent. Așa cum se arată în figura 3, doar multimetrul este conectat la senzor.

Configurarea senzorului de CO cu doar un multimetru conectat

Figura 3. Configurația senzorului de CO cu doar un multimetru conectat pentru a arăta ieșirea. (Imagine oferită de SPEC Sensors)

Câteva calcule matematice necesare:

Măsura la care vă puteți aștepta depinde de configurația dvs. și de sensibilitatea senzorului. În acest mod cu 2 electrozi vă puteți aștepta la aproximativ jumătate din sensibilitate, deci dacă senzorul dvs. spune 4,0 nA/ppm, atunci vă puteți aștepta la aproximativ 2 nA/ppm. Pentru a converti mV în ppm folosiți legea lui Ohm: Tensiune (V) = Curent (A) x Rezistență (Ω). De exemplu:

În configurația din figura 3, încep cu 0,2 mV fără gaz și termin cu 4,8 mV cu aproximativ 200 ppm care curg în cutie și ies prin intermediul unei guri de aerisire în exterior. Diferența de tensiune este de 4,6 mV. Rezistorul R1 este de 10 kΩ, astfel încât curentul este de 0,0046 V/ 10.000 Ω, sau 460 nA. Pentru a obține ppm, împărțiți curentul măsurat la sensibilitate; 460 nA / ~2 nA/ppm, sau 230 ppm. Aceasta este destul de aproape de ceea ce am pus în cutie; 200 ppm. Pentru a calcula noua sensibilitate, folosiți mV și ppm. Noua mea sensibilitate este de 4,6 mV/200 ppm sau 0,23 mV/ppm.

Figura 4 arată direcția în care se deplasează curentul prin circuit. Terminalul A este cablul pozitiv al DMM, iar B este cablul negativ (comun). Vă puteți imagina că electronii sunt consumați la electrodul de lucru și produși la contra/electrodul de referință. Dacă conductorii senzorului sunt în sens invers, veți măsura în schimb o tensiune negativă.

Direcția de curgere a curentului în configurația senzorului

Figura 4. Direcția fluxului de curent în configurația senzorului. (Imagine oferită de SPEC Sensors)

Partea 2 – Configurația avansată a senzorilor

Acum vom încorpora Arduino Uno în acest proiect. Există câteva modificări pe care le vom face pentru a depăși limitările sale, dar, în realitate, îl puteți conecta în același mod în care ați făcut-o cu multimetrul. Partea pozitivă va conecta pinul analogic A0 la pinii R/C ai senzorului, iar partea negativă va conecta GND la pinii W1/W2 ai senzorului. Cu aceasta, utilizați analogRead() pentru a măsura tensiunea între senzor și rezistorul R1. Codul final Arduino poate fi găsit la sfârșitul acestui articol și include îmbunătățirile de eșantionare pe care le-am prezentat mai jos.

Note despre ADC-ul unui Arduino:

Din calculul de mai sus, puteți vedea că 1 ppm va genera o tensiune de 0,23 mV. Aceasta este o problemă pentru ADC-ul pe 10 biți al lui Arduino, deoarece rezoluția minimă pentru Uno este de 4,88 mV (5 V/1024 niveluri). Asta înseamnă că minimul pe care Arduino îl poate detecta este de 21 ppm, ceea ce este încă prea mare.

Prima îmbunătățire este de a schimba referința analogică cu referința internă de 1,1 V . Acest lucru schimbă rezoluția minimă la 4,7 ppm, ceea ce este mai bine. Vă rugăm să citiți instrucțiunile pentru aceasta la https://www.arduino.cc/en/Reference/AnalogReference. Următoarea remediere este de a implementa medierea. Rata maximă de citire a analogRead() este de 10.000 de ori pe secundă. Dacă faceți o medie a câtorva dintre aceste citiri pe o secundă, să zicem 256, acest lucru va îmbunătăți semnificativ rezoluția. 2

UH-OH MOMENT

În cele din urmă, pe măsură ce ați crescut rezoluția, s-ar putea să constatați că zero nu mai este 0 V pe ADC-ul lui Arduino. Pentru a remedia acest lucru, trebuie să aducem acea tensiune zero (ceea ce înseamnă curent zero) la o valoare mai mare care poate fi citită de ADC. Aici vom implementa o scară de tensiune cu adăugarea unei rezistențe de 100 kΩ și a unei rezistențe de 10 kΩ. Atunci când există un curent zero generat de senzor, vom măsura tensiunea dintre cele două noi rezistențe. Curentul prin rezistențe este de 3,3 V/ (100.000 +10.000 Ω), adică 30 microAmperi. Așadar, între cele două noi rezistențe vom măsura 10.000 Ω * 30 microAmperi sau 0,3 volți. Această scară de tensiune va utiliza 30 de microAmperi, așa că, dacă aveți nevoie să economisiți energie, pentru durata de viață a bateriei, încercați să măriți valoarea rezistenței de 100 kΩ. Acum, noua noastră tensiune zero este aproape de 0,3 volți, iar orice lucru care depășește această valoare se datorează gazului CO care generează o tensiune pe rezistorul R1.

Prototip de senzor CO cu o placă Arduino

Figura 5. Prototip de senzor de CO cu o placă Arduino. (Pentru imagine, mulțumim SPEC Sensors)

Acum, ca exemplu final, cu această configurație măsurăm 0,355 volți. Mai întâi scădem tensiunea zero de 0,3 V, obținând 0,055 V sau 55 mV. Acum împărțiți la noua noastră sensibilitate de 0,23 mV/ppm și măsurăm 240 ppm CO, ceea ce reprezintă un nivel periculos pentru a respira pentru perioade lungi de timp.

Rezumat și pași următori:

Utilizând terminalul serial, am reușit să capturez aproximativ 2 ore de înregistrare la aproximativ 1 eșantion la 1,5 secunde. Figura 6 arată ce este posibil cu Arduino, câteva rezistențe, senzorul și câteva medii. Următorii pași ar fi utilizarea senzorului într-o configurație cu 3 electrozi, care oferă un plus de stabilitate, precum și amplificarea semnalului. Piesele necesare pentru aceasta includ un amplificator operațional dublu sau două amplificatoare operaționale duble și câteva rezistențe. În realitate, ieșirea senzorilor poate depinde de alți factori, cum ar fi temperatura și schimbările de umiditate, dar o stație meteorologică bună va înregistra și aceste lucruri.

Ieșire a configurației senzorului Arduino cu medierea datelor

Figura 6. Ieșire a configurației senzorului Arduino cu medierea datelor. (Imagine oferită de SPEC Sensors)

În articolele viitoare, voi prezenta alte proiecte, inclusiv circuitul cu 3 electrozi și utilizarea versiunilor digitale ale acestor senzori. Dacă sunteți gata să vă construiți propriul circuit, puteți consulta notele de aplicare de la SPEC Sensors.

Codul Arduino utilizat pentru acest proiect:

Cod de copiere

/*
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
}

Pentru biblioteci suplimentare Spec Sensor Libraries pentru a lucra cu diferiți senzori ULP, accesați acest link de pe GitHub: https://github.com/SPEC-Sensors/ULPSM

Articles

Lasă un răspuns

Adresa ta de email nu va fi publicată.