By David Peaslee
Egy olyan CO-érzékelő (szén-monoxid) építése, amely figyelmeztet a veszélyes CO-szintre, mindössze egy gázérzékelő, egy Arduino (vagy más mikrokontroller) és néhány ellenállás segítségével elvégezhető. Néhány optikai erősítő hozzáadásával növelhető az érzékenység a környezetben lévő CO mennyiségének mérésére. Ezt a tudást kibővítve megépítheti saját levegőminőség-mérő állomását, és összehasonlíthatja a saját kertjét a helyi időjárási állomások által jelentett értékekkel.
Szükséges anyagok
- 1 Arduino Uno
- 1 multiméter (DMM)
- 1 kenyérlap különböző jumperhuzalokkal
- 2 ellenállás 10 kΩ
- 1 ellenállás 100 kΩ
- 1 SPEC CO gázérzékelő (Digi-Key cikkszám: 1684-1000-ND)
Projekt történet
Amíg egy gázérzékelős cégnél dolgoztam, sok startuppal dolgoztam együtt, amelyeknek sok nagyszerű ötletük volt a levegőminőség mérésére. Bár nagyon remélem, hogy egy nap mindenkinek lesz gázérzékelője a telefonjában és a számítógépében, egyelőre szeretnék segíteni a hétköznapi döntéshozóknak abban, hogy saját levegőfigyelő rendszereket építsenek.
Ezzel a projekttel az alapokkal szeretnék kezdeni: Mitől működik egy elektrokémiai érzékelő?
- Az elektrokémiai gázérzékelőknek két alapvető típusa van, a 2 elektródos és a 3 elektródos. Mindkettő ugyanazzal az alapelvvel működik. A gáz behatol az érzékelőbe, és utat tör magának a munkaelektródig. Ott reakcióba lép egy katalizátorral, és ionokat (töltött molekulákat) hoz létre. Ezek az ionok áthaladnak az elektroliton (néha az akkumulátorsavhoz hasonlóan), és ismét reakcióba lépnek az ellenelektródon, ahol az elektronok felszabadulnak (vagy összegyűlnek), hogy az áramkörön keresztül mozogjanak. A reakcióba lépő gáztól és a katalizátortól függően ezek az elektronok bármelyik elektródra befelé vagy kifelé áramolhatnak. Ezt az elektronáramlást (áramot) mérve képet kapunk arról, hogy hány részecske reagál másodpercenként, ami képet ad arról, hogy egyáltalán hány részecske van ott.
- Egy harmadik elektród, a referenciaelektród hozzáadásával állandó feszültségkülönbséget hozhatunk létre a referencia- és a munkafeszültség között. Ezt nevezzük előfeszültségnek. Ha például a referenciafeszültség 1,25 V, a munkafeszültség pedig 1,35 V, akkor azt mondjuk, hogy az előfeszítés +100 mV. A kémiának semmi köze az 1,25 és 1,35 V-hoz, csak azzal törődik, hogy a munkaelektródon +100 mV potenciál van. Még sok minden más is van ebben az elektrokémiai cellában, de ez minden, amit tudnunk kell, hogy elkezdhessük. Ebben a projektben egy 3 elektródás érzékelőt fogunk venni, és az 1. ábrán látható 2 elektródás konfigurációban fogjuk használni.
- Egy utolsó információ: a PPM, vagyis a parts per million (milliomodrész) a koncentráció megadásának szabványa. Például 1 ppm egy adott gáz egy részecskéje a jelen lévő gáz egymillió összes részecskéjére.
1. ábra. Egy 3 elektródos gázérzékelő 2 elektródos elrendezésben csatlakoztatva. (A kép a SPEC Sensors jóvoltából)
Disclaimer 1: Vigyázat! Megmutatok néhány eredményt a nyomás alatt lévő szén-monoxid gázzal végzett vizsgálataimból. Az interneten kapható egy kis palack CO, de ez halálos. Olvasson utána ennek, mielőtt úgy dönt, hogy CO-t használ egy projektben.1 2. Felelősségi nyilatkozat: Ha alternatív CO-forrást kell találnia, egy cigaretta körülbelül 300 ppm CO-t termel a belélegzett áramban.
How-to
2. ábra. Alapvető gázérzékelő prototípus beállítása. (A kép a SPEC Sensors jóvoltából)
1. rész – Az érzékelő alapfelépítése
A legegyszerűbb áramkörrel kezdem, és megmutatom, hogyan lehet az érzékelőt csak egy érzékelővel, egy 10 kΩ ellenállással és egy multiméterrel mérni.
i. Vágja le a két fel nem jelölt csapot (lásd a 2. ábrát), majd központosítsa az érzékelőt a kenyérvágólapon.
ii. Rövid jumperrel zárja rövidre az R és C csapokat (számláló és referencia). Egy másik rövid jumperrel zárja rövidre a W1 és W2 csapokat (ez csak egy extra útvonalat biztosít az áram számára, mivel a csapok már rövidre vannak zárva a NYÁK-on).
iii. Csatlakoztassa a multiméter pozitív vezetékét az érzékelő R/C oldalához. Csatlakoztassa a mérő negatív oldalát az érzékelő W1/W2 oldalához.
iv. Végül egy 10 kΩ-os ellenállással (R1) csatlakoztassa az R/C csapokat a W1/W2 csapokhoz.
Ezzel a ponttal készen áll az érzékelő tesztelésére. Használhat gyufát vagy füstöt, de jobban fog működni, ha lezárt tartályban van. Egy Pyrex/üvegedény légmentesen záródó felsővel nagyszerűen fog működni. Próbáljon meg meggyújtani egy gyufát, majd fújja ki, és tegye az edénybe az érzékelővel együtt. Lehet, hogy lyukakat kell vágnia az elektromos vezetékek átvezetéséhez. Az én berendezésemben 200 ppm CO-t futtattam körülbelül 100 köbcentiméter per perc sebességgel, ami meglehetősen lassú. Ahogy a 3. ábrán látható, csak a multiméter van az érzékelőhöz csatlakoztatva.
3. ábra. CO-érzékelő beállítása csak egy multiméterrel csatlakoztatva a kimenet megjelenítésére. (A kép a SPEC Sensors jóvoltából)
Egy kis szükséges matematika:
A várható mérés a beállításától és az érzékelő érzékenységétől függ. Ebben a 2 elektródás üzemmódban körülbelül az érzékenység felére számíthat, tehát ha az érzékelője 4,0 nA/ppm-t mond, akkor körülbelül 2 nA/ppm-re számíthat. Az mV ppm-re történő átszámításához használja Ohm törvényét: Feszültség (V) = áram (A) x ellenállás (Ω). Például:
A 3. ábrán látható elrendezésben 0,2 mV-val kezdem gáz nélkül, és 4,8 mV-val fejezem be, amikor körülbelül 200 ppm áramlik a dobozba, és egy szellőzőn keresztül kifelé. A feszültségkülönbség 4,6 mV. Az R1 ellenállás 10 kΩ, így az áram 0,0046 V/ 10 000 Ω, azaz 460 nA. A ppm kiszámításához ossza el a mért áramot az érzékenységgel; 460 nA / ~2 nA/ppm, azaz 230 ppm. Ez elég közel van ahhoz, amit a dobozba tettem; 200 ppm. Az új érzékenység kiszámításához használjon mV-ot és ppm-et. Az új érzékenységem 4,6 mV/200 ppm vagy 0,23 mV/ppm.
A 4. ábra mutatja az áram irányát az áramkörön keresztül. Az A csatlakozó a DMM pozitív vezetéke, a B pedig a negatív (közös) vezeték. Elképzelhető, hogy az elektronok a munkaelektródon elhasználódnak, és az ellen/referenciaelektródon keletkeznek. Ha az érzékelő vezetékei fordítva vannak, akkor helyette negatív feszültséget fog mérni.
4. ábra. Az áramáramlás iránya az érzékelő beállításában. (A kép a SPEC Sensors jóvoltából)
2. rész – Fejlett érzékelő beállítás
Most az Arduino Uno-t fogjuk beépíteni ebbe a projektbe. Van néhány változtatás, amit meg fogunk tenni, hogy leküzdjük a korlátait, de a valóságban ugyanúgy csatlakoztathatja, mint a multiméterrel. A pozitív oldal az A0 analóg csapot az érzékelő R / C csapjaihoz csatlakoztatja, a negatív oldal pedig a GND-t az érzékelő W1 / W2 csapjaihoz csatlakoztatja. Ezzel az analógRead() segítségével mérje meg a feszültséget az érzékelőn és az R1 ellenálláson. A végleges Arduino kód megtalálható a cikk végén, és tartalmazza az alábbiakban vázolt mintavételi javításokat.
Megjegyzések az Arduino ADC-jéről:
A fenti számításból látható, hogy 1 ppm 0,23 mV feszültséget fog generálni. Ez problémát jelent az Arduino 10 bites ADC-je számára, mivel az Uno minimális felbontása 4,88 mV (5 V/1024 szint). Ez azt jelenti, hogy az Arduino által érzékelhető minimum 21 ppm, ami még mindig túl magas.
Az első javítás az analóg referencia megváltoztatása az 1,1 V-os belső referenciára . Ez a minimális felbontást 4,7 ppm-re változtatja, ami jobb. Kérjük, olvassa el az erre vonatkozó utasításokat https://www.arduino.cc/en/Reference/AnalogReference. A következő javítás az átlagolás megvalósítása. Az analógRead() maximális olvasási sebessége 10 000 alkalommal másodpercenként. Ha egy csomó ilyen leolvasást átlagolsz egy másodperc alatt, mondjuk 256-ot, az jelentősen javítja a felbontást. 2
Végül, ahogy növelted a felbontást, azt tapasztalhatod, hogy a nulla már nem 0 V az Arduino ADC-jén. Ennek kijavításához ezt a nulla feszültséget (vagyis a nulla áramot) egy magasabb értékre kell hoznunk, amelyet az ADC le tud olvasni. Itt egy feszültséglétrát fogunk megvalósítani egy 100 kΩ és egy 10 kΩ ellenállás hozzáadásával. Amikor az érzékelő által generált nulla áram van, a két új ellenállás közötti feszültséget fogjuk mérni. Az ellenállásokon átfolyó áram 3,3 V/ (100 000 +10 000 Ω), azaz 30 mikroAmps. Tehát a két új ellenállás között 10 000 Ω * 30 mikroAmps vagy 0,3 Voltot fogunk mérni. Ez a feszültséglétra 30 mikroAmps-t fog használni, így ha energiát kell megtakarítania, az akkumulátor élettartama érdekében, próbálja meg növelni a 100 kΩ ellenállás értékét. Most az új nullfeszültségünk 0,3 Volt közelében van, és minden, ami e fölött van, annak köszönhető, hogy a CO gáz feszültséget generál az R1 ellenálláson.
5. ábra. CO-érzékelő prototípusa egy Arduino kártyával. (A kép a SPEC Sensors jóvoltából)
Az utolsó példaként tehát ezzel a beállítással 0,355 voltot mérünk. Először vonjuk le a 0,3 V nullfeszültséget, ami 0,055 V-ot vagy 55 mV-ot ad. Most osszuk el az új, 0,23 mV/ppm érzékenységünkkel, és máris 240 ppm CO-t mérünk, ami veszélyes szint a hosszabb ideig történő belégzéshez.
Összefoglaló és következő lépések:
A soros terminál használatával körülbelül 2 órányi naplózást tudtam rögzíteni, körülbelül 1,5 másodpercenként 1 mintával. A 6. ábra mutatja, hogy mi lehetséges az Arduino, néhány ellenállás, az érzékelő és némi átlagolás segítségével. A következő lépések az lenne, hogy az érzékelőt 3 elektródás konfigurációban használjuk, ami további stabilitást és jelerősítést biztosít. Az ehhez szükséges alkatrészek közé tartozik egy kettős op-erősítő vagy két kettős op-erősítő és néhány ellenállás. A valóságban az érzékelők kimenete más tényezőktől is függhet, például a hőmérséklettől és a páratartalom változásától, de egy jó időjárási állomás ezeket a dolgokat is rögzíti.
6. ábra. Az Arduino szenzorbeállítás kimenete az adatok átlagolásával. (A kép a SPEC Sensors jóvoltából)
A jövőbeli cikkekben további projekteket fogok bemutatni, beleértve a 3 elektródás áramkört és ezen érzékelők digitális változatainak használatát. Ha készen áll arra, hogy saját áramkört építsen, megnézheti a SPEC Sensors alkalmazási jegyzeteit.
A projekthez használt arduino kód:
/*
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
}
A különböző ULP érzékelőkkel való munkához további SPEC Sensor könyvtárakat talál a GitHub-on ezen a linken: https://github.com/SPEC-Sensors/ULPSM