By David Peaslee
Budowanie detektora CO (tlenku węgla), który może ostrzegać o niebezpiecznych poziomach CO, można wykonać przy użyciu tak niewiele, jak czujnik gazu, Arduino (lub inny mikrokontroler) i kilka rezystorów. Dodanie kilku op-ampów może zwiększyć czułość, aby zmierzyć ilość CO obecnego w otoczeniu. Rozwijając tę wiedzę, można zbudować własną stację monitorowania jakości powietrza i porównać własne podwórko z poziomami podawanymi przez lokalne stacje meteorologiczne.
Wymagane materiały
- 1 Arduino Uno
- 1 multimetr (DMM)
- 1 płytka drukowana z różnymi zworkami
- 2 oporniki 10 kΩ
- 1 opornik 100 kΩ
- 1 czujnik gazu SPEC CO (Digi-Key Part Number: 1684-1000-ND)
Project Story
Pracując w firmie produkującej czujniki gazu, współpracowałem z wieloma startupami, które miały wiele świetnych pomysłów na pomiar jakości powietrza. Choć mam nadzieję, że pewnego dnia wszyscy będą mieli czujniki gazu w swoich telefonach i komputerach, na razie chciałbym pomóc zwykłym Makerom zbudować ich własne systemy monitorowania powietrza.
W tym projekcie chciałbym zacząć od podstaw: Co sprawia, że czujnik elektrochemiczny działa?
- Są dwa podstawowe typy elektrochemicznych czujników gazu, 2-elektrodowe i 3-elektrodowe. Oba działają w oparciu o te same podstawowe zasady. Gaz dyfunduje do czujnika i przedostaje się do elektrody roboczej. Tam wchodzi w reakcję z katalizatorem i tworzy jony (naładowane cząsteczki). Jony te przechodzą przez elektrolit (czasami podobny do kwasu akumulatorowego) i ponownie reagują na elektrodzie przeciwnej, gdzie elektrony są uwalniane (lub gromadzone), aby poruszać się w obwodzie. W zależności od gazu będącego przedmiotem reakcji i katalizatora, elektrony mogą przepływać do lub z każdej elektrody. Mierząc przepływ elektronów (natężenie prądu), uzyskujemy informację, ile cząsteczek reaguje na sekundę, co daje nam pojęcie, ile cząsteczek jest tam na początku.
- Dodając trzecią elektrodę, referencyjną, możemy stworzyć stałą różnicę napięć pomiędzy napięciem referencyjnym i roboczym. Taką różnicę nazywamy potencjałem biasu. Na przykład, jeśli napięcie referencyjne wynosi 1,25 V, a robocze 1,35 V, mówimy, że bias wynosi +100 mV. Chemia nie ma nic wspólnego z napięciami 1,25 V i 1,35 V, obchodzi ją tylko to, że na elektrodzie roboczej jest potencjał +100 mV. Jest wiele więcej informacji na temat ogniwa elektrochemicznego, ale to wszystko, co musimy wiedzieć, aby zacząć. W tym projekcie weźmiemy czujnik 3-elektrodowy i użyjemy go w konfiguracji 2-elektrodowej, jak na rysunku 1.
- Jeszcze jedna informacja, PPM, czyli części na milion, to standard określania stężenia. Na przykład, 1 ppm oznacza jedną cząsteczkę danego gazu na milion wszystkich obecnych cząsteczek gazu.
Rysunek 1. 3-elektrodowy czujnik gazu połączony w konfiguracji 2-elektrodowej. (Obraz dzięki uprzejmości firmy SPEC Sensors)
Zastrzeżenie 1: Ostrożnie: Pokażę wam kilka wyników z testów, które przeprowadziłem z gazem tlenku węgla pod ciśnieniem. Mała butla CO jest dostępna online, ale jest śmiertelnie niebezpieczna. Powinieneś o tym poczytać, zanim zdecydujesz się użyć CO w projekcie.1 Zastrzeżenie 2: Jeśli musisz znaleźć alternatywne źródło CO, papieros wyprodukuje około 300 ppm CO we wdychanym strumieniu.
How-to
Rysunek 2. Podstawowa konfiguracja prototypu czujnika gazu. (Zdjęcie dzięki uprzejmości SPEC Sensors)
Część 1 – Podstawowa konfiguracja czujnika
Zacznę od najbardziej podstawowego układu i pokażę jak zmierzyć czujnik używając tylko czujnika, rezystora 10 kΩ i multimetru.
i. Odetnij dwa piny, które nie są oznaczone (patrz rysunek 2), a następnie wyśrodkuj czujnik na płytce chlebowej.
ii. Użyj krótkiej zworki do zwarcia pinów R i C (licznika i odniesienia). Użyj kolejnej krótkiej zworki do zwarcia pinów W1 i W2 (jest to tylko dodatkowa droga dla prądu, ponieważ piny są już zwarte na płytce drukowanej).
iii. Podłącz dodatni przewód multimetru do strony R/C czujnika. Podłącz ujemną stronę miernika do strony W1/W2 czujnika.
iv. Na koniec użyj rezystora 10 kΩ (R1) do połączenia pinów R/C z pinami W1/W2.
W tym momencie jesteś gotowy do przetestowania czujnika. Możesz użyć zapałki lub dymu, ale będzie działał lepiej, jeśli będzie w szczelnym pojemniku. Pyrex/szklane naczynie z hermetyczną górą będzie działać świetnie. Spróbuj zapalić zapałkę, a następnie wydmuchać ją i włożyć do naczynia z czujnikiem. Być może będziesz musiał wyciąć otwory, aby przeprowadzić przez nie przewody elektryczne. W mojej konfiguracji, uruchomiłem 200 ppm CO przy około 100 centymetrach sześciennych na minutę, co jest raczej powolne. Jak pokazano na rysunku 3, tylko multimetr jest podłączony do czujnika.
Rysunek 3. Konfiguracja czujnika CO z podłączonym tylko multimetrem pokazującym wyjście. (Zdjęcie dzięki uprzejmości SPEC Sensors)
Kilka potrzebnych obliczeń:
Pomiar, którego możesz się spodziewać, zależy od ustawień i czułości czujnika. W tym trybie 2 elektrodowym można oczekiwać około połowy czułości, więc jeśli czujnik mówi 4.0 nA/ppm, można oczekiwać około 2 nA/ppm. Aby przeliczyć mV na ppm użyj prawa Ohma: Napięcie (V) = Prąd (A) x Rezystancja (Ω). Na przykład:
W konfiguracji na rysunku 3, zaczynam od 0,2 mV bez gazu i kończę na 4,8 mV z około 200 ppm płynąc do pudełka i wychodząc przez otwór wentylacyjny na zewnątrz. Różnica napięcia wynosi 4,6 mV. Rezystor R1 ma wartość 10 kΩ, więc prąd wynosi 0,0046 V/ 10 000 Ω, czyli 460 nA. Aby otrzymać ppm, podziel zmierzony prąd przez czułość; 460 nA / ~2 nA/ppm, czyli 230 ppm. To jest całkiem blisko tego, co umieściłem w pudełku; 200 ppm. Aby obliczyć nową czułość, użyj mV i ppm. Moja nowa czułość jest 4,6 mV/200 ppm lub 0,23 mV/ppm.
Rysunek 4 pokazuje kierunek prądu podróżuje przez obwód. Zacisk A jest dodatnim przewodem multimetru cyfrowego, a B jest ujemnym (wspólnym) przewodem. Można sobie wyobrazić, że elektrony są zużywane na elektrodzie roboczej i produkowane na elektrodzie przeciwnej/referencyjnej. Jeśli przewody czujnika są odwrócone, zamiast tego zmierzysz napięcie ujemne.
Rysunek 4. Kierunek przepływu prądu w układzie czujnika. (Obraz dzięki uprzejmości SPEC Sensors)
Część 2 – Zaawansowana konfiguracja czujnika
Teraz włączymy Arduino Uno do tego projektu. Jest kilka zmian, które wprowadzimy, aby pokonać jego ograniczenia, ale w rzeczywistości można go podłączyć w taki sam sposób jak multimetr. Dodatnią stroną podłączymy pin analogowy A0 do pinów R/C czujnika, a ujemną stroną podłączymy GND do pinów W1/W2 czujnika. Następnie użyj funkcji analogRead(), aby zmierzyć napięcie na czujniku i rezystorze R1. Ostateczny kod Arduino można znaleźć na końcu tego artykułu, i zawiera on ulepszenia próbkowania, które opisałem poniżej.
Uwagi na temat przetwornika ADC Arduino:
Z powyższych obliczeń widać, że 1 ppm wygeneruje napięcie 0,23 mV. Jest to problem dla 10-bitowego przetwornika ADC Arduino, ponieważ minimalna rozdzielczość dla Uno wynosi 4,88 mV (5 V/1024 poziomy). Oznacza to, że minimum, które może wykryć Arduino to 21 ppm, co nadal jest zbyt wysokie.
Pierwszym usprawnieniem jest zmiana odniesienia analogowego na wewnętrzne odniesienie 1,1 V . To zmienia minimalną rozdzielczość na 4,7 ppm, co jest lepsze. Proszę przeczytać instrukcje na ten temat w https://www.arduino.cc/en/Reference/AnalogReference. Następną poprawką jest zaimplementowanie uśredniania. Maksymalna szybkość odczytu funkcji analogRead() wynosi 10,000 razy na sekundę. Jeśli uśrednisz kilka takich odczytów w ciągu sekundy, powiedzmy 256, to znacznie poprawi to rozdzielczość.2
W końcu, po zwiększeniu rozdzielczości, możesz zauważyć, że zero nie jest już 0 V na przetworniku ADC Arduino. Aby to naprawić, musimy doprowadzić to zerowe napięcie (czyli zerowy prąd) do wyższej wartości, która może być odczytana przez ADC. Tutaj zaimplementujemy drabinkę napięciową z dodaniem rezystora 100 kΩ i 10 kΩ. Gdy prąd generowany przez czujnik jest zerowy, będziemy mierzyć napięcie pomiędzy dwoma nowymi rezystorami. Prąd przez oporniki wynosi 3,3 V/ (100 000 +10 000 Ω), czyli 30 mikroAmperów. Zatem pomiędzy dwoma nowymi rezystorami będziemy mierzyć 10,000 Ω * 30 mikroAmperów lub 0,3 V. Ta drabinka napięciowa zużyje 30 mikroAmperów, więc jeśli musisz oszczędzać energię, dla żywotności baterii, spróbuj zwiększyć wartość rezystora 100 kΩ. Teraz nasze nowe napięcie zerowe jest bliskie 0,3 V, a wszystko powyżej tej wartości jest spowodowane przez gaz CO generujący napięcie przez rezystor R1.
Rysunek 5. Prototyp czujnika CO z płytką Arduino. (Zdjęcie dzięki uprzejmości SPEC Sensors)
Więc jako ostatni przykład, z tym ustawieniem mierzymy 0,355 V. Najpierw odejmujemy napięcie zerowe 0,3 V, co daje 0,055 V lub 55 mV. Teraz podziel przez naszą nową czułość 0.23 mV/ppm i mamy pomiar 240 ppm CO, który jest niebezpiecznym poziomem do oddychania przez długi okres czasu.
Podsumowanie i następne kroki:
Używając terminala szeregowego, byłem w stanie przechwycić około 2 godzin logowania przy około 1 próbce co 1.5 sekundy. Rysunek 6 pokazuje, co jest możliwe przy użyciu Arduino, kilku rezystorów, czujnika i uśredniania. Następnym krokiem byłoby użycie czujnika w konfiguracji 3-elektrodowej, co zapewnia dodatkową stabilność i wzmocnienie sygnału. Części do tego zawierają podwójny wzmacniacz op, lub dwa podwójne wzmacniacze op, i kilka rezystorów. W rzeczywistości wyjście czujników może zależeć od innych czynników, takich jak temperatura i zmiany wilgotności, ale dobra stacja pogodowa będzie rejestrować również te rzeczy.
Rysunek 6. Wyjście konfiguracji czujnika Arduino z uśrednianiem danych. (Obraz dzięki uprzejmości SPEC Sensors)
W przyszłych artykułach będę przedstawiał inne projekty, w tym układ 3-elektrodowy i wykorzystanie cyfrowych wersji tych czujników. Jeśli jesteś gotowy do zbudowania własnego obwodu, możesz sprawdzić noty aplikacyjne na stronie SPEC Sensors.
KodArduino użyty w tym projekcie:
/*
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
}
Aby uzyskać dodatkowe biblioteki Spec Sensor Libraries do pracy z różnymi czujnikami ULP Sensors, przejdź do tego linku na GitHubie: https://github.com/SPEC-Sensors/ULPSM