Tekijä: David Peaslee
Hiilimonoksidi-ilmaisimen rakentaminen, joka hälyttää vaarallisista CO-pitoisuuksista, onnistuu vain kaasuanturilla, Arduinolla (tai muulla mikrokontrollerilla) ja muutamalla vastuksella. Muutaman op-ampin lisääminen voi lisätä herkkyyttä mitata ympäristössä olevan CO:n määrää. Tämän tiedon pohjalta voit rakentaa oman ilmanlaadun seuranta-aseman ja verrata omaa takapihaasi paikallisten sääasemien ilmoittamiin pitoisuuksiin.
Tarvittavat materiaalit
- 1 Arduino Uno
- 1 yleismittari (DMM)
- 1 leipälauta, jossa on erilaisia hyppyjohtoja
- 2 vastusta 10 kΩ
- 1 vastus 100 kΩ
- 1 SPEC hiilidioksidi- kaasuanturi (Digi-Key-artikkelinumero: 1684-1000-ND)
Projektin tarina
Työskennellessäni kaasuanturifirmassa työskentelin monien startup-yritysten kanssa, joilla oli monia hyviä ideoita ilmanlaadun mittaamiseen. Vaikka toivonkin todella, että jonain päivänä kaikilla on kaasuanturit puhelimissaan ja tietokoneissaan, haluaisin toistaiseksi auttaa jokapäiväisiä tekijöitä rakentamaan omia ilmanseurantajärjestelmiään.
Tässä projektissa haluaisin aloittaa perusasioista: Mikä saa sähkökemiallisen anturin toimimaan?
- Elektrokemiallisia kaasuantureita on kahta perustyyppiä, 2-elektrodisia ja 3-elektrodisia. Molemmat toimivat samoilla perusperiaatteilla. Kaasu diffundoituu anturiin ja kulkeutuu työskentelyelektrodille. Siellä se reagoi katalyytin kanssa ja muodostaa ioneja (varattuja molekyylejä). Ionit kulkevat elektrolyytin (joskus samanlainen kuin paristohappo) läpi ja reagoivat jälleen vastaelektrodilla, jossa elektronit vapautuvat (tai kerääntyvät) liikkumaan virtapiirin läpi. Riippuen reagoivasta kaasusta ja katalysaattorista, elektronit voivat virrata jompaankumpaan elektrodiin tai jommastakummasta elektrodista. Mittaamalla tätä elektronien virtausta (virtaa) saamme käsityksen siitä, kuinka monta hiukkasta reagoi sekunnissa, mikä antaa meille käsityksen siitä, kuinka monta hiukkasta ylipäätään on olemassa.
- Lisäämällä kolmas elektrodi, referenssielektrodi, voimme luoda vakiojännite-eron referenssi- ja työjännitteiden välille. Tätä kutsumme bias-potentiaaliksi. Jos esimerkiksi viitejännite on 1,25 V ja työjännite on 1,35 V, sanomme, että bias on +100 mV. Kemialla ei ole mitään tekemistä 1,25 ja 1,35 voltin kanssa, se välittää vain siitä, että työskentelyelektrodissa on +100 mV potentiaali. Tähän sähkökemialliseen kennoon liittyy paljon muutakin, mutta tämä on kaikki, mitä meidän todella tarvitsee tietää aloittaaksemme. Tässä projektissa otamme 3-elektrodisen anturin ja käytämme sitä 2-elektrodisessa konfiguraatiossa, kuten kuvassa 1.
- Yksi viimeinen tieto, PPM eli parts per million, on standardi, jolla ilmoitetaan pitoisuus. Esimerkiksi 1 ppm on yksi hiukkanen tiettyä kaasua miljoonaa kaasun kokonaishiukkasta kohti.
Kuva 1. 3-elektrodinen kaasuanturi, joka on kytketty 2-elektrodiseen kokoonpanoon. (Image courtesy of SPEC Sensors)
Disclaimer 1: Caution: Näytän joitakin tuloksia testeistä, jotka tein paineistetulla hiilimonoksidikaasulla. Pieni kaasupullo CO:ta on saatavilla verkossa, mutta se on tappavaa. Kannattaa tutustua asiaan ennen kuin päätät käyttää CO:ta projektissa.1 Vastuuvapauslauseke 2: Jos sinun on löydettävä vaihtoehtoinen CO:n lähde, savuke tuottaa noin 300 ppm CO:ta sisäänhengitysvirrassa.
How-to
Kuvio 2. Kaasuanturin prototyyppi. Kaasuanturin prototyypin perusasennus. (Image courtesy of SPEC Sensors)
Part 1 – Basic sensor setup
Aloitan kaikkein yksinkertaisimmasta piiristä ja näytän, miten mittaat anturin pelkällä anturilla, 10 kΩ vastuksella ja yleismittarilla.
i. Leikkaa kaksi nastaa, joita ei ole merkitty (katso kuva 2), ja keskitä anturi leipälaudalle.
ii. Oikosulje R- ja C-nastat (laskuri ja referenssi) lyhyellä jumpperilla. Käytä toista lyhyttä hyppääjää W1- ja W2-nastojen oikosulkuun (tämä antaa vain ylimääräisen reitin virralle, koska nastat ovat jo oikosulussa piirilevyllä).
iii. Kytke yleismittarin positiivinen johto anturin R/C-puolelle. Kytke mittarin negatiivinen puoli anturin W1/W2-puolelle.
iv. Liitä lopuksi 10 kΩ:n vastuksella (R1) R/C-nastat W1/W2-nastoihin.
Tässä vaiheessa olet valmis testaamaan anturin. Voit käyttää tulitikkua tai savua, mutta se toimii paremmin, jos se on suljetussa astiassa. Pyrex/lasiastia, jossa on ilmatiivis kansi, toimii hyvin. Kokeile sytyttää tulitikku, puhaltaa se ulos ja laita se astiaan anturin kanssa. Sinun on ehkä leikattava reikiä sähköjohtoja varten. Omassa laitteistossani käytin 200 ppm CO:ta noin 100 kuutiosenttimetriä minuutissa, mikä on melko hidasta. Kuten kuvassa 3 näkyy, vain yleismittari on kytketty anturiin.
Kuva 3. CO-anturin asetus, jossa vain yleismittari on kytketty näyttämään ulostuloa. (Image courtesy of SPEC Sensors)
Joitakin tarvittavia matemaattisia laskutoimituksia:
Osaamasi mittaus riippuu asetuksestasi ja anturin herkkyydestä. Tässä 2 elektrodin tilassa voit odottaa noin puolet herkkyydestä, joten jos anturisi sanoo 4,0 nA/ppm, voit odottaa noin 2 nA/ppm. Muuttaaksesi mV:n ppm:ksi käytä Ohmin lakia: Jännite (V) = virta (A) x vastus (Ω). Esimerkiksi:
Kuvan 3 asetelmassa aloitan 0,2 mV:llä ilman kaasua ja lopetan 4,8 mV:llä, kun noin 200 ppm virtaa laatikkoon ja poistuu tuuletusaukon kautta ulos. Jännite-ero on 4,6 mV. Vastus R1 on 10 kΩ, joten virta on 0,0046 V/ 10 000 Ω eli 460 nA. Saadaksesi ppm:n, jaa mitattu virta herkkyydellä; 460 nA / ~2 nA/ppm, eli 230 ppm. Tämä on melko lähellä sitä, mitä laitoin laatikkoon; 200 ppm. Uuden herkkyyden laskemiseksi käytetään mV:tä ja ppm:ää. Uusi herkkyyteni on 4,6 mV/200 ppm eli 0,23 mV/ppm.
Kuvassa 4 näkyy virran kulkusuunta piirin läpi. Liitin A on DMM:n positiivinen johto ja B on negatiivinen (yhteinen) johto. Voit kuvitella, että elektronit kuluvat työskentelyelektrodissa ja syntyvät vasta-/referenssielektrodissa. Jos anturin johtimet ovat väärinpäin, mittaat sen sijaan negatiivisen jännitteen.
Kuva 4. Virran kulkusuunta. Virran kulkusuunta anturiasetuksessa. (Image courtesy of SPEC Sensors)
Part 2 – Edistynyt anturiasetelma
Nyt aiomme sisällyttää Arduino Unon tähän projektiin. Teemme muutamia muutoksia sen rajoitusten voittamiseksi, mutta todellisuudessa voit kytkeä sen samaan tapaan kuin yleismittarin kanssa. Positiivinen puoli yhdistää analogisen nastan A0 anturin R/C-nastoihin ja negatiivinen puoli yhdistää GND:n anturin W1/W2-nastoihin. Käytä tämän avulla analogRead()-ohjelmaa mitataksesi jännitteen anturin ja vastuksen R1 yli. Lopullinen Arduino-koodi löytyy tämän artikkelin lopussa, ja se sisältää näytteenoton parannukset, jotka olen hahmotellut alla.
Huomautuksia Arduinon ADC:stä:
Yllä olevasta laskelmasta näet, että 1 ppm tuottaa 0,23 mV: n jännitteen. Tämä on ongelma Arduinon 10-bittiselle ADC:lle, sillä Unon vähimmäisresoluutio on 4,88 mV (5 V/1024 tasoa). Tämä tarkoittaa, että minimi, jonka Arduino voi havaita, on 21 ppm, mikä on edelleen liian korkea.
Ensimmäinen parannus on vaihtaa analoginen referenssi sisäiseen 1,1 V:n referenssiin . Tämä muuttaa minimiresoluution 4,7 ppm:ään, mikä on parempi. Lue tätä koskevat ohjeet osoitteessa https://www.arduino.cc/en/Reference/AnalogReference. Seuraava korjaus on keskiarvonmäärityksen toteuttaminen. AnalogRead():n suurin lukunopeus on 10 000 kertaa sekunnissa. Jos keskiarvoistat joukon näitä lukemia sekunnin aikana, vaikkapa 256, se parantaa resoluutiota huomattavasti. 2
Viimeiseksi, kun olet lisännyt resoluutiota, saatat huomata, että nolla ei ole enää 0 V Arduinon ADC:ssä. Tämän korjaamiseksi meidän on saatava tuo nollajännite (eli nollavirta) korkeampaan arvoon, jonka ADC voi lukea. Tässä toteutamme jänniteportaat lisäämällä 100 kΩ ja 10 kΩ vastuksen. Kun anturin tuottama virta on nolla, mittaamme kahden uuden vastuksen välisen jännitteen. Vastusten läpi kulkeva virta on 3,3 V/ (100 000 + 10 000 Ω) eli 30 mikroAmpeeria. Kahden uuden vastuksen välillä mitataan siis 10 000 Ω * 30 mikroAmpeeria eli 0,3 volttia. Tämä jänniteportaikko käyttää 30 mikroAmpia, joten jos sinun on säästettävä virtaa akun keston vuoksi, kokeile lisätä 100 kΩ:n vastuksen arvoa. Nyt uusi nollajännitteemme on lähellä 0,3 volttia, ja kaikki tämän yläpuolella oleva johtuu siitä, että CO-kaasu tuottaa jännitteen vastuksen R1 yli.
Kuva 5. CO-anturin prototyyppi Arduino-levyllä. (Image courtesy of SPEC Sensors)
Viimeisenä esimerkkinä siis tällä kokoonpanolla mitataan 0,355 volttia. Vähennetään ensin nollajännite 0,3 V, jolloin saadaan 0,055 V eli 55 mV. Nyt jaetaan uudella herkkyydellämme 0,23 mV/ppm, ja mittaamme 240 ppm CO:ta, joka on vaarallinen taso hengitettäessä pitkiä aikoja.
Yhteenveto ja seuraavat vaiheet:
Käyttämällä sarjapäätettä pystyin kaappaamaan noin 2 tuntia lokitietoja noin 1 näytteen 1,5 sekunnin välein. Kuva 6 osoittaa, mitä on mahdollista tehdä Arduinon, joidenkin vastusten, anturin ja jonkin verran keskiarvoistusta käyttäen. Seuraavat vaiheet olisivat anturin käyttäminen 3 elektrodin kokoonpanossa, mikä lisää vakautta ja signaalin vahvistamista. Osat tätä varten sisältävät kaksoisop-vahvistimen tai kaksi kaksoisop-vahvistinta ja joitakin vastuksia. Todellisuudessa anturin ulostulo voi riippua muista tekijöistä, kuten lämpötilasta ja kosteuden muutoksista, mutta hyvä sääasema tallentaa myös nämä asiat.
Kuva 6. Arduino-anturiasetelman ulostulo tietojen keskiarvoistamisella. Arduino-anturiasetelman ulostulo tietojen keskiarvoistamisen kanssa. (Image courtesy of SPEC Sensors)
Tulevissa artikkeleissa esittelen muita projekteja, kuten 3-elektrodipiirin ja näiden antureiden digitaalisten versioiden käytön. Jos olet valmis rakentamaan oman piirisi, voit tutustua SPEC Sensorsin sovellusohjeisiin.
Arduino-koodi, jota käytettiin tässä projektissa:
/*
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
}
Lisäksi SPEC Sensor -kirjastoja, jotka toimivat eri ULP-antureiden kanssa, löydät tästä linkistä GitHubissa: https://github.com/SPEC-Sensors/ULPSM