Spisu treści:

Monitor Arduino CO za pomocą czujnika MQ-7: 8 kroków (ze zdjęciami)
Monitor Arduino CO za pomocą czujnika MQ-7: 8 kroków (ze zdjęciami)

Wideo: Monitor Arduino CO za pomocą czujnika MQ-7: 8 kroków (ze zdjęciami)

Wideo: Monitor Arduino CO za pomocą czujnika MQ-7: 8 kroków (ze zdjęciami)
Wideo: 49. Jak do Arduino podłączyć czujnik alkoholu MQ3? 2024, Lipiec
Anonim
Monitor Arduino CO za pomocą czujnika MQ-7
Monitor Arduino CO za pomocą czujnika MQ-7
Monitor Arduino CO za pomocą czujnika MQ-7
Monitor Arduino CO za pomocą czujnika MQ-7

Kilka słów, dlaczego powstała ta instrukcja: pewnego dnia mama mojej dziewczyny zadzwoniła do nas w środku nocy, bo czuła się naprawdę chora – miała zawroty głowy, tachykardię, nudności, wysokie ciśnienie krwi, nawet zemdlała na niewiadomy czas (prawdopodobnie ~5 minut, ale nie ma sposobu, aby powiedzieć), wszystko bez wyraźnego powodu. Mieszka w małej wiosce z dala od szpitali (60 km od nas, 30 km do najbliższego szpitala, 10 km bez zwykłej drogi), więc pospieszyliśmy do niej i dotarliśmy tam zaraz po karetce. Trafiła do szpitala i rano czuła się prawie dobrze, ale lekarze nie byli w stanie znaleźć przyczyny. Następnego dnia wpadliśmy na pomysł: mogło to być zatrucie CO, bo ma bojler gazowy (na zdjęciu) i siedział przy nim przez cały wieczór, kiedy to się stało. Niedawno kupiliśmy czujnik CO MQ-7, ale nigdy nie miałem czasu na zbudowanie do tego schematu, więc był to idealny czas, aby to zrobić. Po godzinie szukania w internecie jakichkolwiek instrukcji zdałem sobie sprawę, że nie mogę znaleźć żadnego poradnika, który jednocześnie postępuje zgodnie z instrukcjami producenta czujnika zawartymi w jego karcie katalogowej i cokolwiek wyjaśnia (jeden przykład wydawał się mieć całkiem dobry kod, ale nie było jasne, jak to zastosować, inne były zbyt uproszczone i nie działały dobrze). Poświęciliśmy więc około 12 godzin na opracowanie schematów, wykonanie i wydrukowanie obudowy 3d, testowanie i kalibrację czujnika, a następnego dnia udaliśmy się do podejrzanego kotła. Okazało się, że poziomy CO są tam bardzo wysokie i mogą być śmiertelne, jeśli czas ekspozycji na CO będzie dłuższy. Dlatego uważam, że każdy, kto ma podobną sytuację (np. kocioł gazowy lub inne spalanie w pomieszczeniu mieszkalnym) powinien zaopatrzyć się w taki czujnik, aby zapobiec wydarzeniu się czegoś złego.

Wszystko to wydarzyło się dwa tygodnie temu, od tego czasu sporo poprawiłem schematy i program, a teraz wydaje się, że jest w miarę dobry i stosunkowo prosty (nie proste 3 linijki kodu, ale jednak). Chociaż mam nadzieję, że ktoś z precyzyjnym miernikiem CO udzieli mi opinii na temat domyślnej kalibracji, którą umieściłem w szkicu - podejrzewam, że daleko mu do dobrego. Oto kompletny poradnik z kilkoma danymi eksperymentalnymi.

Krok 1: Zestawienie materiałów

Zestawienie materiałów
Zestawienie materiałów

Będziesz potrzebował:0. Płytka Arduino. Wolę chińskiego klona Arduino Nano ze względu na jego wyjątkową cenę 3 USD, ale każde 8-bitowe arduino będzie tutaj działać. Sketch wykorzystuje zaawansowane działanie timerów i był testowany tylko na mikrokontrolerze atmega328 - choć prawdopodobnie będzie działał również dobrze na innych.1. Czujnik CO MQ-7. Najczęściej dostępny z tym modułem czujnika Flying Fish, musi przejść przez małą modyfikację, szczegóły w następnym kroku lub możesz użyć oddzielnego czujnika MQ-7.

2. Tranzystor bipolarny NPN. Praktycznie każdy tranzystor NPN, który może obsłużyć 300 mA lub więcej, będzie tutaj działał. Tranzystor PNP nie współpracuje ze wspomnianym modułem Flying Fish (ponieważ ma pin grzałki wlutowany do wyjścia czujnika), ale może współpracować z dyskretnym czujnikiem MQ-7.

3. Rezystory: 2 x 1k (od 0,5k do 1,2k będzie działać dobrze) i 1 x 10k (najlepiej zachować dokładność - chociaż jeśli koniecznie musisz użyć innej wartości, dostosuj odpowiednio zmienną reference_resistor_kOhm w szkicu).

4. Kondensatory: 2 x 10uF lub więcej. Wymagane są tantalowe lub ceramiczne, elektrolityczne nie będą działać dobrze ze względu na wysoki ESR (nie będą w stanie zapewnić wystarczającego prądu do wygładzenia tętnienia wysokoprądowego). Zielone i czerwone diody LED wskazujące aktualny poziom CO (można również użyć pojedynczej dwukolorowej diody LED z 3 zaciskami, jak użyliśmy w naszym prototypie żółtej skrzynki).6. Brzęczyk piezoelektryczny wskazujący wysoki poziom CO.7. Płytka prototypowa i przewody (możesz też wszystko przylutować do pinów Nano lub wcisnąć do gniazd Uno, ale łatwo o pomyłkę w ten sposób).

Krok 2: Modyfikacja modułu lub okablowanie czujnika dyskretnego

Modyfikacja modułu lub okablowanie czujnika dyskretnego
Modyfikacja modułu lub okablowanie czujnika dyskretnego

Do modułu należy wylutować rezystor i kondensator tak jak na zdjęciu. Możesz wylutować w zasadzie wszystko jak chcesz - elektronika modułu jest kompletnie bezużyteczna, używamy jej tylko jako uchwytu dla samego czujnika, ale te dwa elementy uniemożliwią uzyskanie poprawnych odczytów, Jeśli używasz czujnika dyskretnego, podłącz styki grzałki (H1 i H2) do 5V i odpowiednio do kolektora tranzystora. Podłącz jedną stronę czujnikową (dowolny z pinów A) do 5 V, drugą stronę czujnikową (dowolny z pinów B) do rezystora 10 k, podobnie jak pin analogowy modułu na schemacie.

Krok 3: Zasada działania

Zasada działania
Zasada działania
Zasada działania
Zasada działania

Po co nam w ogóle te wszystkie komplikacje, dlaczego nie podłączyć 5V, uziemić i po prostu uzyskać odczyty? Cóż, w ten sposób nie dostaniesz niczego pożytecznego. i niskie cykle nagrzewania w celu uzyskania prawidłowych pomiarów. Podczas fazy niskiej temperatury CO jest absorbowany na płytce, dając znaczące dane. W fazie wysokiej temperatury zaabsorbowany CO i inne związki odparowują z płytki czujnika, czyszcząc ją do następnego pomiaru.

Ogólnie rzecz biorąc, operacja jest prosta:

1. Zastosuj napięcie 5 V przez 60 sekund, nie używaj tych odczytów do pomiaru CO.

2. Przyłącz 1,4 V przez 90 sekund, użyj tych odczytów do pomiaru CO.

3. Przejdź do kroku 1.

Ale oto problem: Arduino nie może zapewnić wystarczającej mocy, aby uruchomić ten czujnik z jego pinów - grzałka czujnika wymaga 150 mA, podczas gdy pin Arduino może dostarczyć nie więcej niż 40 mA, więc jeśli jest podłączony bezpośrednio, pin Arduino będzie się palił, a czujnik nadal będzie wygrywał nie działa. Musimy więc użyć pewnego rodzaju wzmacniacza prądowego, który pobiera mały prąd wejściowy do sterowania dużym prądem wyjściowym. Innym problemem jest uzyskanie 1,4 V. Jedynym sposobem, aby niezawodnie uzyskać tę wartość bez wprowadzania wielu komponentów analogowych, jest zastosowanie podejścia PWM (modulacja szerokości impulsu) ze sprzężeniem zwrotnym, które będzie sterować napięciem wyjściowym.

Tranzystor NPN rozwiązuje oba problemy: gdy jest stale włączony, napięcie na czujniku wynosi 5V i nagrzewa się do fazy wysokiej temperatury. Gdy zastosujemy PWM do jego wejścia, prąd pulsuje, a następnie jest wygładzany przez kondensator, a średnie napięcie jest utrzymywane na stałym poziomie. Jeśli użyjemy PWM wysokiej częstotliwości (w szkicu ma częstotliwość 62,5KHz) i uśredniamy wiele odczytów analogowych (w szkicu średnio ponad ~1000 odczytów), to wynik jest dość wiarygodny.

Bardzo ważne jest dodawanie kondensatorów zgodnie ze schematami. Obrazy tutaj ilustrują różnicę sygnału z kondensatorem C2 i bez niego: bez niego tętnienie PWM jest wyraźnie widoczne i znacząco zniekształca odczyty.

Krok 4: Schematy i tablica do krojenia chleba

Schematy i tablica do krojenia chleba
Schematy i tablica do krojenia chleba
Schematy i tablica do krojenia chleba
Schematy i tablica do krojenia chleba
Schematy i tablica do krojenia chleba
Schematy i tablica do krojenia chleba

Oto schematy i montaż płytki stykowej.

OSTRZEŻENIE! Wymagana jest modyfikacja standardowego modułu breakout! Bez modyfikacji moduł jest bezużyteczny. Modyfikacja jest opisana w drugim kroku

Ważne jest, aby dla diod LED wykorzystać piny D9 i D10, ponieważ mamy tam wyjścia sprzętowego Timera1, co pozwoli na płynną zmianę ich kolorów. Piny D5 i D6 służą do brzęczyka, ponieważ D5 i D6 są wyjściami sprzętowego Timera0. Skonfigurujemy je tak, aby były odwrotne względem siebie, tak aby przełączały się między stanami (5V, 0V) i (0V, 5V), wytwarzając w ten sposób dźwięk na buzzerze. Ostrzeżenie: wpływa to na główne przerwanie czasowe Arduino, więc wszystkie funkcje zależne od czasu (takie jak millis()) nie dadzą poprawnych wyników w tym szkicu (więcej o tym później). Pin D3 ma podłączone do niego wyjście sprzętowe Timer2 (jak również D11 - ale mniej wygodniej jest podłączyć przewód na D11 niż na D3) - więc używamy go do zapewnienia PWM dla tranzystora sterującego napięciem. Rezystor R1 służy do sterowania jasnością diod LED. Może wynosić od 300 do 3000 Ohm, 1k jest raczej optymalny pod względem jasności/poboru mocy. Rezystor R2 służy do ograniczenia prądu bazy tranzystora. Nie powinna być niższa niż 300 Ohm (aby nie przeciążać pinu Arduino), ani wyższa niż 1500 Ohm. 1k to bezpieczny wybór.

Rezystor R3 jest stosowany szeregowo z płytką czujnika w celu utworzenia dzielnika napięcia. Napięcie na wyjściu czujnika wynosi R3 / (R3 + Rs) * 5V, gdzie Rs jest aktualną rezystancją czujnika. Rezystancja czujnika zależy od stężenia CO, więc napięcie odpowiednio się zmienia. Kondensator C1 służy do wygładzania napięcia wejściowego PWM na czujniku MQ-7, im wyższa jego pojemność tym lepiej, ale też musi mieć niski ESR - czyli ceramiczny (lub tantalowy) Kondensator jest tutaj preferowany, elektrolityczny nie będzie działał dobrze.

Kondensator C2 służy do wygładzenia wyjścia analogowego czujnika (napięcie wyjściowe zależy od napięcia wejściowego - a mamy tutaj dość duży prąd PWM, który wpływa na wszystkie schematy, więc potrzebujemy C2). Najprostszym rozwiązaniem jest zastosowanie tego samego kondensatora, co tranzystor C1. NPN albo cały czas przewodzi prąd, aby zapewnić duży prąd na grzałce czujnika, albo pracuje w trybie PWM, zmniejszając w ten sposób prąd grzania.

Krok 5: Program Arduino

Program Arduino
Program Arduino

OSTRZEŻENIE: CZUJNIK WYMAGA RĘCZNEJ KALIBRACJI DO KAŻDEGO PRAKTYCZNEGO UŻYCIA. BEZ KALIBRACJI W ZALEŻNOŚCI OD PARAMETRÓW TWOJEGO CZUJNIKA TEN SZKIC MOŻE WŁĄCZYĆ ALARM W CZYSTYM POWIETRZU LUB NIE WYKRYWAĆ ŚMIERTELNEGO STĘŻENIA TLENKU WĘGLA

Kalibracja jest opisana w kolejnych krokach. Kalibracja zgrubna jest bardzo prosta, precyzyjna dość złożona.

Na poziomie ogólnym program jest dość prosty:

Najpierw kalibrujemy nasz PWM, aby uzyskać stabilne napięcie 1,4V wymagane przez czujnik (odpowiednia szerokość PWM zależy od wielu parametrów, takich jak dokładna wartość rezystora, rezystancja tego konkretnego czujnika, krzywa VA tranzystora itp., więc najlepszym sposobem jest wypróbowanie różnych wartości i używaj takiego, który najlepiej pasuje). Następnie nieprzerwanie wykonujemy cykl 60 sekund nagrzewania i 90 sekund pomiaru. Wdrożenie staje się nieco skomplikowane. Musimy korzystać z timerów sprzętowych, ponieważ wszystko co tu mamy potrzebuje stabilnego PWM o wysokiej częstotliwości do poprawnego działania. Kod jest załączony tutaj i można go pobrać z naszego githuba, a także źródła schematów w Fritzing. W programie znajdują się 3 funkcje obsługujące timery: setTimer0PWM, setTimer1PWM, setTimer2PWM. Każdy z nich ustawia timer w trybie PWM o zadanych parametrach (komentowanych w kodzie) oraz ustawia szerokość impulsu według wartości wejściowych. Przełączanie faz pomiaru odbywa się za pomocą funkcji startMeasurementPhase i startHeatingPhase, obsłużyć wszystko w środku. oraz ustawić odpowiednie wartości timera do przełączania pomiędzy 5V i 1.4V grzaniem. Stan diod jest ustawiany przez funkcję setLEDs, która na swoim wejściu przyjmuje zieloną i czerwoną jasność (w skali liniowej 1-100) i zamienia ją na odpowiednie ustawienie timera.

Stan brzęczyka jest kontrolowany za pomocą funkcji buzz_on, buzz_off, buzz_beep. Funkcje włączania/wyłączania włączają i wyłączają dźwięk, funkcja beep generuje określoną sekwencję dźwiękową z okresem 1,5 sekundy, jeśli jest wywoływana okresowo (funkcja powraca natychmiast, więc nie zatrzymuje głównego programu - ale trzeba ją wywoływać raz za razem aby wytworzyć sygnał dźwiękowy).

Program najpierw uruchamia funkcję pwm_adjust, która wyszukuje odpowiednią szerokość cyklu PWM w celu uzyskania 1,4V podczas fazy pomiarowej. Następnie kilka razy wydaje sygnał dźwiękowy, aby wskazać gotowość czujnika, przechodzi w fazę pomiaru i uruchamia pętlę główną.

W pętli głównej program sprawdza, czy wystarczająco dużo czasu spędziliśmy w bieżącej fazie (90 sekund na fazę pomiaru, 60 sekund na fazę grzania) i jeśli tak, to zmienia aktualną fazę. Ponadto stale aktualizuje odczyty czujników za pomocą wygładzania wykładniczego: nowa_wartość = 0,999*stara_wartość + 0,001*nowa_wartość. Przy takich parametrach i cyklu pomiarowym uśrednia sygnał z ostatnich około 300 milisekund. OSTRZEŻENIE: CZUJNIK WYMAGA RĘCZNEJ KALIBRACJI W PRZYPADKU PRAKTYCZNEGO UŻYCIA. BEZ KALIBRACJI, W ZALEŻNOŚCI OD PARAMETRÓW TWOJEGO CZUJNIKA, TEN SZKIC MOŻE WŁĄCZYĆ ALARM W CZYSTYM POWIETRZU LUB NIE WYKRYWAĆ ŚMIERTELNEGO STĘŻENIA TLENKU WĘGLA.

Krok 6: Pierwsze uruchomienie: czego się spodziewać

Pierwsze uruchomienie: czego się spodziewać
Pierwsze uruchomienie: czego się spodziewać

Jeśli wszystko zmontowałeś poprawnie, po uruchomieniu szkicu zobaczysz coś takiego na monitorze Serial:

regulacja PWM w=0, V=4,93

regulacja PWM w=17, V=3,57 PWM wynik: szerokość 17, napięcie 3,57

a następnie szereg liczb reprezentujących aktualne odczyty czujnika. Ta część reguluje szerokość PWM w celu wytworzenia napięcia grzałki czujnika jak najbliższego 1,4 V, zmierzone napięcie jest odejmowane od 5 V, więc nasza idealna zmierzona wartość wynosi 3,6 V. Jeśli ten proces nigdy się nie kończy lub kończy po jednym kroku (co daje szerokość równą 0 lub 254) - coś jest nie tak. Sprawdź, czy twój tranzystor jest rzeczywiście NPN i jest prawidłowo podłączony (upewnij się, że poprawnie użyłeś pinów bazy, kolektora, emitera - baza idzie na D3, kolektor do MQ-7 a emiter do masy, nie licz na widok płytki stykowej Fritzing - jest źle dla niektórych tranzystorów) i upewnij się, że podłączyłeś wejście czujnika do wejścia A1 Arduino. Jeśli wszystko jest w porządku, powinieneś zobaczyć w Serial Plotter z Arduino IDE coś podobnego do obrazu. Cykle ogrzewania i pomiaru o długości 60 i 90 sekund przebiegają jeden po drugim, przy czym ppm CO jest mierzony i aktualizowany na koniec każdego cyklu. Możesz zbliżyć trochę otwartego płomienia do czujnika, gdy cykl pomiarowy jest prawie zakończony i zobaczyć, jak wpłynie to na odczyty (w zależności od rodzaju płomienia, może on wytwarzać do 2000 ppm stężenia CO na otwartym powietrzu - więc nawet jeśli tylko niewielka część faktycznie wchodzi do czujnika, nadal włączy alarm i nie wyłączy się do końca następnego cyklu). Pokazałem to na zdjęciu, a także reakcję na ogień z zapalniczki.

Krok 7: Kalibracja czujnika

Kalibracja czujnika
Kalibracja czujnika
Kalibracja czujnika
Kalibracja czujnika

Zgodnie z arkuszem danych producenta czujnik powinien pracować w cyklach ogrzewania-chłodzenia przez 48 godzin z rzędu, zanim będzie można go skalibrować. I powinieneś to zrobić, jeśli zamierzasz go używać przez dłuższy czas: w moim przypadku odczyt czujnika w czystym powietrzu zmienił się o około 30% w ciągu 10 godzin. Jeśli nie weźmiesz tego pod uwagę, możesz otrzymać wynik 0 ppm tam, gdzie faktycznie jest 100 ppm CO. Jeśli nie chcesz czekać 48 godzin, możesz monitorować wyjście czujnika na koniec cyklu pomiarowego. Gdy ponad godzinę nie zmieni się o więcej niż 1-2 punkty - możesz tam przestać grzać.

Kalibracja zgrubna:

Po uruchomieniu szkicu przez co najmniej 10 godzin w czystym powietrzu, pobierz surową wartość czujnika na końcu cyklu pomiarowego, 2-3 sekundy przed rozpoczęciem fazy nagrzewania, i zapisz ją do zmiennej sensor_reading_clean_air (linia 100). Otóż to. Program oszacuje inne parametry czujnika, nie będą one precyzyjne, ale powinny wystarczyć do rozróżnienia między 10 a 100 ppm stężenia.

Precyzyjna kalibracja:

Gorąco polecam znaleźć skalibrowany miernik CO, zrobić próbkę CO 100 ppm (można to zrobić pobierając trochę gazów spalinowych do strzykawki - stężenie CO może łatwo wynosić kilka tysięcy ppm - i powoli wkładając go do zamkniętego słoika z skalibrowany miernik i czujnik MQ-7), weź nieprzetworzony odczyt czujnika przy tym stężeniu i umieść go w zmiennej czujnik_odczyt_100_ppm_CO. Bez tego kroku pomiar ppm może być błędny kilka razy w każdym kierunku (nadal jest ok, jeśli potrzebujesz alarmu o niebezpiecznym stężeniu CO w domu, gdzie normalnie nie powinno być wcale CO, ale nie jest to dobre dla żadnego zastosowania przemysłowego).

Ponieważ nie miałem żadnego miernika CO, zastosowałem bardziej wyrafinowane podejście. Najpierw przygotowałem wysokie stężenie CO poprzez spalanie w izolowanej objętości (pierwsze zdjęcie). W tym artykule znalazłem najbardziej przydatne dane, w tym wydajność CO dla różnych typów płomienia - nie ma ich na zdjęciu, ale w końcowym eksperymencie wykorzystałem spalanie gazu propanowego w tej samej konfiguracji, co dało ~5000 ppm stężenia CO. Następnie został rozcieńczony 1:50 w celu uzyskania 100 ppm, jak pokazano na drugim zdjęciu i wykorzystany do wyznaczenia punktu odniesienia czujnika.

Krok 8: Niektóre dane eksperymentalne

Niektóre dane eksperymentalne
Niektóre dane eksperymentalne

W moim przypadku czujnik działał całkiem nieźle - nie jest zbyt czuły dla naprawdę niskich stężeń, ale wystarczająco dobry do wykrycia czegokolwiek powyżej 50ppm. Próbowałem stopniowo zwiększać koncentrację, wykonując pomiary i zbudowałem zestaw wykresów. Istnieją dwa zestawy linii 0ppm - czysto zielony przed ekspozycją na CO i żółtozielony po. Czujnik wydaje się nieznacznie zmieniać opór czystego powietrza po ekspozycji, ale efekt ten jest niewielki. Wydaje się, że nie jest w stanie wyraźnie odróżnić stężeń 8 i 15, 15 i 26, 26 i 45 ppm - ale trend jest bardzo wyraźny, więc może stwierdzić, czy stężenie mieści się w zakresie 0-20 lub 40-60 ppm. Dla wyższych stężeń zależność jest znacznie bardziej wyrazista - pod wpływem spalin z otwartego płomienia krzywa od samego początku wznosi się nie opadając wcale, a jej dynamika jest zupełnie inna. Więc dla wysokich stężeń nie ma wątpliwości, że działa niezawodnie, chociaż nie mogę potwierdzić jego precyzji, ponieważ nie mam żadnego miernika nominalnego CO. Również ten zestaw eksperymentów został wykonany z użyciem rezystora obciążenia 20k - i po tym zdecydowałem aby polecić 10k jako wartość domyślną, w ten sposób powinno być bardziej wrażliwe. To wszystko. Jeśli masz niezawodny miernik CO i zmontowałeś tę płytkę, podziel się opinią na temat precyzji czujnika - byłoby wspaniale zebrać statystyki dotyczące różnych czujników i poprawić domyślne założenia szkicu.

Zalecana: