Czujnik pyłu GP2Y1010AU0F
W dzisiejszym zagadnieniu zabawimy się Greenpeace i zajmiemy się czystością oraz jakością powietrza, a dokładniej jego zanieczyszczeniem. Według Światowej Organizacji Zdrowia, najbardziej zagrożonymi pod tym względem są Państwa o agresywnym wzroście gospodarczym takie jak Indie, Chiny czy Pakistan. Podstawowym kryterium oceny jest średnia roczna ilość pyłu zawieszonego w powietrzu o wielkości większej niż 10μg/m3 (cząsteczki PM10). Dlaczego akurat 10μg? Naukowo udowodniono, że cząsteczki te mogą z łatwością przedostać się do płuc, a następnie do krwiobiegu stając się jedną z przyczyn chorób serca, astmy czy nawet raka płuc.
Według najnowszysch danych niechlubny prym pod tym względem wiodą: Pakistan (282μg), Afganistan (282μg) oraz Bahrajn (254μg). Polska znajduje się pod tym względem na 39 miejscu z wynikiem 39μg. Pozazdrościć możemy natomiast Islandii z wynikiem 9μg oraz Kanadzie z wynikiem 11μg.
Oczywiście wynik dla Polski jest uśredniony i zależy od danego regionu (dane z 2011 roku). Inowrocław może pochwalić się zanieczyszczeniami w postaci pyłu na poziomie 17μg, Gdynia na poziomie 18μg oraz Bydgoszcz na poziomie 19μg. Po drugiej stronie barykady znajdują się Sosnowiec :) z wynikiem 60μg, Rybinik i Kraków z wynikiem 59μg oraz Zabrze z wynikiem 56μg.
Dopuszczalny dla zdrowia wielkośc pytłu według WHO to 20μg, jednak polskie normy dopuszczają poziom tego stężenia średnio 40μg na rok oraz 50μg na dobę.
Ok dość już straszenia :) zajmijmy się bohaterem dzisiejszego wpisu - czujnikiem pyłu GP2Y1010AU0F produkcji firmy Sharp.
Sharp GP2Y1010AU0F posiada zdolność wykrywania cząsteczek pyłu w powietrzu o średnicy większej niż 0.8μm, czyli niespełna 1/1000 mm, pozwoli to nam na określenie zanieczyszczenia nawet PM2.5! Charakteryzuje się również niskim poborem prądu o maksymalnym natężeniu 20mA i może być zasilany napięciem od 5V do 7V.
Wynik pomiaru podawany jest na wyjście analogowe, którego wartość napięcia jest liniowo proporcjonalna do ilości pyłu z typową czułością wynoszącą 0.5V na każde 100μg/m3.
Dopuszczalny zakres pomiarowy to 500μg/m3. Czujnik może z powodzeniem pracować w temperaturze od -10℃ do 65℃. Maksymalna żywotność czujnika szacowana jest z kolei na 5 lat.
Sam czujnik to jednak nie wszystko, bowiem wymaga trochę dodatkowej elektroniki, dlatego z pomocą przyjdzie nam odpowiedni moduł dla Arduino z oferty sklepu Elty.pl
Jak to właściwie działa?
GP2Y1010AU0Fw swojej budowie posiada diodę emitującą światło podczerwone oraz odpowiedni fototranzystor, a także zestaw soczewek. Elementy te zostały umieszczone względem siebie po przekątnej, tak aby promienie podczerwone odbijały się od zawiesiny pyłu i trafiały do fototranzystora.
Ilość odbitego promieniowania odpowiada poziomowi zanieczyszczenia powietrza - czyli ilości pyłu. Pomiary odbywane są poprzez generowanie impulsu podczerwieni IR o czasie trwania Pw=0,32ms i okresie T=10ms. Po tym zabiegu należy poczekać 0,28ms i odczytać wartość na pinie analogowym. Czas trwania impulsu Pw=0,32ms zapewniają dodatkowe, dobrane elementy R/C elementy na płytce modułu.
Podłączenie
Moduł podłączamy bezbośrednio do Arduino UNO, zasilając go z linii 5V. Wejście modułu ILED podłączamy do pinu cyfrowego 7, natomiast wyjście AOUT do pinu analogowego A0.
Program
- #define MIN_VOLTAGE 600 // mv - próg dolnego zakresu napięcia dla braku pyłu
- #define VREF 5000 // mv - napięcie referencyjne komparatora
- #define PIN_LED 7 // numer pinu ILED
- #define PIN_ANALOG 0 // numer pinu AOUT
- #define MAX_ITERS 10 // liczba pomiarow do sredniej
- int ADC_VALUE; // odczytana wartosc A0
- int ITER; // numer pomiaru
- float VOLTAGE; // wartosc napiecia
- float DUST; // wynik
- float AVG_DUST; // sredni wynik
- void setup(void)
- {
- // analogReference(INTERNAL);
- Serial.begin(9600);
- pinMode(PIN_LED, OUTPUT);
- digitalWrite(PIN_LED, LOW);
- }
- float computeDust()
- {
- // Blyskamy IR, czekamy 280ms, odczytujemy napiecie ADC
- digitalWrite(PIN_LED, HIGH);
- delayMicroseconds(280);
- ADC_VALUE = analogRead(PIN_ANALOG);
- digitalWrite(PIN_LED, LOW);
- // Przeliczamy na mV. Calosc mnozymy przez 11, poniewaz w module
- // zastosowano dzielinik napiecia 1k/10k
- VOLTAGE = (VREF / 1024.0) * ADC_VALUE * 11;
- // Obliczamy zanieczyszczenie jesli zmierzone napiecie ponad prog
- if (VOLTAGE > MIN_VOLTAGE)
- {
- return (VOLTAGE - MIN_VOLTAGE) * 0.2;
- }
- return 0;
- }
- void loop(void)
- {
- AVG_DUST = 0;
- ITER = 0;
- while (ITER < MAX_ITERS)
- {
- DUST = computeDust();
- // Do sredniej liczmy tylko prawidlowe pomiary
- if (DUST > 0)
- {
- AVG_DUST += DUST;
- ITER++;
- delay(50);
- }
- }
- AVG_DUST /= MAX_ITERS;
- Serial.print("D = ");
- Serial.print(AVG_DUST);
- Serial.println("ug/m3");
- delay(500);
- }
Zaraz, zaraz... średni odczyt 50μg/m3 w zamkniętym pomieszczeniu? Coś tu musi być nie tak - spodziewany wynik było w okolicach 30μg/m3 dla zamkniętego pomieszczenia bez dymu papierosowego :)
Problemem okazuje się przetwornik ADC w Arduino UNO, w którym domyślnie napięcie odniesienia to napięcie zasilania.
Z moich wcześniejszych obserwacji wynika, że pomiar małych wartości napięcia z takim zakresem pracy przetwornika ADC będzie obarczony jest sporym błędem. Tym bardziej, jeśli Arduino zasilane jest z USB, gdzie napięcie lubi "pływać" w skrajnych przypadkach 4.8V ÷ 5.0V.
Przetwornik ADC w Arduino jest oczywiście 10-bitowy, co przy 1024 poziomach napięcia powinniśmy mieć wystarczającą dokładność 0,005V. Niby wszystko powinno być OK, ale okazuje się, że wyjście czujnika przechodzi przez dzielnik napięcia 1kΩ/10kΩ. Innymi słowy - faktyczne napięcie podawane na pin analogowy Arduino jest 11x niższe.
Dla przykładu. Kiedy czujnik będzie wystawiał napięcie 600mV (0.6V) do Arduino dotrze zaledwie 54mV (0.054V). Czy w takim razie, dokładność 5mV ma już znaczenie? A jeśli tak, to jak duże?
Jak wspomniałem wcześniej, czujnik podnosi napięcie wyjściowe o 0.5V na każde 100μg/m3, a więc od strony Arduino na ten sam zakres będzie przypadło napięcie 11 krotne niższe, czyli 0,045V.
Po przeliczeniu, na każdy 1mV przypada więc 4.5μg/m3. Skoro rozdzielczość ADC to 0,005V, to łatwo wywnioskować, że odczyt może być błędny nawet o 22.5μg/m3 !!! (jak nie więcej).
No dobrze, jak sobie z tym poradzić? Zakładając, że czujnik wystawi maksymalne napięcie 4V, do Arduino nie dotrze więcej niż 370mV. Teraz widzimy, że pomiar takiego napięcia w zakresie domyślnej pracy przetwornika ADC jest szalonym pomysłem. Z pomocą przyjdzie nam zmiana napięcia odniesienia.
Wystarczy, że wywołamy funkcję analogReference(INTERNAL); (została ona zakomentowana w programie powyżej) i zmienimy wartość definicji VREF z 5000 na 1100. Dzięki temu uzyskamy dokładne, wewnętrzne źródło napięcia 1.1V - stabilne jak skała :) Powinno dać nam to rozdzieczość 1mV, co przełoży się na maksymalny błąd pomiaru w granicach 4.5μg/m3.
Jak będą prezentowały się wyniki w takich warunkach?
Zdecydowanie lepiej prawda? Dokładność i stabilność można by jeszcze poprawić, podając wzorcowe napięcie zasilania 0.5V do pinu AREF i korzystając ponownie z funkcji analogReference() ale już z parametrem EXTERNAL
. Na koniec jeszcze indeksy jakości powietrza:
PM2.5 w μg/m3 | Poziom jakości | Ocena |
0 - 35 | 1 | Doskonała |
35 - 75 | 2 | Średnia |
75 - 115 | 3 | Niskie zanieczyszczenie |
115 - 150 | 4 | Umiarkowane zanieczyszczenie |
150 - 250 | 5 | Ciężkie zanieczyszczenie |
250 - 500 | 6 | Tragedia |
Porównajmy jeszcze wyniki z powyższych przypadków, ale interpretację pozostawię już Wam :) Czujnik na pewno wykorzystam do budowy swojej stacji meteo lub innego ciekawego projektu, bowiem radzi sobie doskonale nawet z wykrywaniem dymu papierosowego. Jak na wydatek 70 złotych jest to bardzo fajny gadżet.
Reklama
Komentarze
Mam 2x ten moduł ale w wersji bare w użyciu. Nie warto dopłacać do wersji z wave share. 16 zł to odpowiednia cena, na PCB 60zł to już dużo jak za rezystor+kondensator i lamiat.
Warto używając go zadbać o mały wentylator za otworem tak aby wymusić na chwilę przed odczytem ruch powietrza. Ogólnie to w PM2.5 nie ma co wierzyć - to zwykły czujnik z klimatyzatorów i filtrów powietrza. Bardziej dla przemysłu niż monitorowania jakości powietrza. Choć na dym papierosowy itp. reaguje poprawnie.
Z jednej strony tak i nie. Wersję bare faktycznie można dostać na ebay w tej cenie, jednak dla wielu taka płytka jest wygodna. Dla niebojących się lutownicy oczywiście cena o której wspominasz będzie lepszym rozwiązaniem. Ale dla mniej doświadczonych już nie koniecznie. Wykonanie PCB w polskich warunkach o tych wymiarach to koszt ~50-60zł. Do tego przesyłka, kilka elementów, lutowanie z lepszym lub gorszym skutkiem i sumarycznie taki moduł jest bardziej opłacalny dla fanów kabelków.
Co do wentylatora masz rację, widziałem również metodę polegającą na umieszczeniu elementu grzejnego (np. rezystora) aby wymusić konwencję powietrza. Jeśli chodzi o PM2.5 to jest to na granicy jego czułości, ale do PM10 jest OK, a to również jest jedna z cech jakości powietrza. Do większości przypadków może być to wystarczające.
Mam jednak pytanie, odnośnie tego co napisał niżej cwiek. Widać, że już obcowałeś z tymi czujnikami - czy jesteś w stanie coś więcej napisać o pływaniu wyników? Przeglądałem różne materiały w sieci i praktycznie bywało tak samo lub gorzej.
Pływa ale mnie interesują tylko duże skoki stężenia pyłu żeby włączyć wyciąg. Do tego się nadaje idealnie.
wybacz, ale cos jest nie tak ze stabilnoscia tego drugiego zrodla odniesienia. na obu sygnalach masz podobne wachania probek przed filtrowaniem, co nie?
Wahania faktycznie są, ale zdecydowanie mniejsze. Sprawdzę jeszcze na innym Arduino, wszak referencyjne źródło odniesienia 1.1V powinno być stabilne i bardziej odporne na wahanie zasilania 4.9-5V. Może to kwestia przewodów - tak czy inaczej zastanawia mnie teraz, czy wahania te są normalne dla dolnego zakresu, czy da się to jeszcze poprawić.
p.s. jako ze zmiany ilosci pylu w powietrzu sa raczej malej czestotliwosci proponowalbym dodac nisko nastrojonego low passa przed wejsciem adc dla dodatkowej poprawy precyzji. mozliwe jeszcze ze wachania odczytu wynikaja z nieodfiltrowanego zasilania ktore zasila modul (polecam popatrzec kiedys na 5V z usb na oscyloskopie)
A wiesz? spróbuję jeszcze dziś, korzystając z jakiegoś stabilizatora do zasilania czujnika i Arduino nie przez USB - dzięki za wzbudzenie ciekawości!
Testowałeś? Jakie efekty?
Praktycznie bez zmian :) w module znajduje się kondensator filtrujący. Lepiej troszkę dla ADC 5V, ale w przypadku ADC 1.1V różnic nie widać
Na jednym z chińskich portali ten czujnik kosztuje w granicach 4 $
Bardzo fajna strona, szkoda ze wcześniej na nią nie trafiłem.
Mam pytanie odnośnie tego czujnika - autor wspominał nad wykorzystaniem w stacji meteo, mnie też interesuje zewnętrzne wykorzystanie głownie do monitoringu jakości powietrza wśród sąsiadów palących w zimie czym się da. Czy ktoś uporał się z dobrym zabezpieczeniem przed wpływem warunków atmosferycznych?
Ja sam posiadam inny czujnik DSM501A, o trochę większym zakresie - do 1,4mg/m3 i z wyjściem PWM. Przy okazji mam pytanie czy ktoś monitorował powietrze w płd-wsch lub bardziej centralnej Polsce w połowie sierpnia w czasie pożaru torfowisk na Ukrainie i Białorusi? Momentami smród swądu był bardzo wyraźny, Straż twierdziła że wszystkie parametry są OK, a stacja monitoringu powietrza na szpitalu napjpierw pokazywała wzrost zanieczyszczenia ponad normę, po czym została wyłączona na wiele godzin…..
A co proponujecie do pomiaru zanieczyszczenia powietrza zasysanego przez silnik (ciągnika). Pomiar nie musi być bardzo dokładny i chodzi mi tylko o ciągłość pomiaru. Całość oczywiście podłączona do Arduino.
Witam,
Czemu w linii #39 jest "* 0.2"?
Mam 2 takie czujniki i w tych samych warunkach dają różne odczyty, np. #1 daje 56 ug/m3 a #2 daje 85 ug/m3, a wg. stacji badawczej (takiej prawdziwej stacji monitorującej powietrze) w pobliżu której odczytywałem wartości było 16 ug/m3 :-(
W czujniku jest potencjometr do regulacji czułości, ale w specyfikacji piszą, żeby nie ruszać.
Pozdrawiam
Bartosz
Ok. Już wiem, czemu w linii #39 jest \'* 2\'. To wynika ze współczynnika liniowości wykresu. To już jest jasne.
Skoro moje czujniki pokazywały różnie postanowiłem pobawić się potencjometrem na jednym z nich. Służy on do ustawiania czułości czujnika, i ustawiłem jeden względem drugiego. Teraz przynajmniej pokazują takie same wartości. Przydałoby się jakieś profesjonalne urządzenie, żeby skalibrować.
Wg. specyfikacji (https://www.sparkfun.com/datasheets/Sensors/gp2y1010au_e.pdf) napięcie wyjściowe przy braku pyłu to 0.9V (w przykładzie ustawione na 0.6V) i ustawienie takiej wartości daje mi sensowne odczyty.
Kwestia kalibracji tych czujników... :-( Piszą, że przychodzą z fabryki skalibrowane... Przynajmniej jeden z moich nie był :-(
Czy laser musi być włączany/wyłączany? Testuję tą płytkę z micropythonem na pyboard i wartości nie zależą od niczego ani od ustawiania pinu lasera na wysoki (to czerwony laser? widać go?).
czujnik MQ-135 obok niego wyraźnie reaguje na np. dym ze świeczki ;)
Mam pytanie, czy ktoś zauważył problemy przy współpracy wielu czujników. W moim wypadku po podłączeniu MQ9 (zastrzegam - to samo źródło zasilania) pomiary wzrosły x4. Odłączenie fizyczne MQ9 przywraca prawidłowe pomiary pyłów. Dodam, że odsprzęgania zasilania jeszcze nie testowałem, zapewne usunie problem.
Wg Twojego oprogramowania wartości wychodzą mi 2x mniejsze niż wg softu proponowanego jako przykład producenta:
http://www.waveshare.com/wiki/File:Dust-Sensor-code.7z
wiesz dlaczego?
(oba kalibrowałem na INTERNAL czyli dla Leonardo 2,56V)
pozdr. P
W sumie to tak naprawdę nie wiadomo co ten czujni mierzy.
Stacje pomiarowe mierzą osobno PM2.5, PM10 itp... i na tej podstawie określają jakość powietrza. Od wielkości cząstek zależy też jak bardzo są szkodliwe dla zdrowia.
A tutaj mamy pomiar w zakresie do PM500 i tak na dobrą sprawę to
trudno tu o jakieś sensowne wyniki, bo nie ma tego do czego porównać.
I jak to odnieść do jakości powietrza z tej tabeli:
Oryginalny obraz posiada rozmiar 390x258
albo z tej:
https://sojp.wios.warszawa.pl/skala-jakosci-powietrza
Wiemy, ze dymi, ale czy szkodliwe, czy nie tego się już nie dowiemy.
http://blog.dedietrich.pl/jakosc-powietrza-w-polsce-pyl-zawieszony-pm25/
Pozdrawiam
W końcu sensowny komentarz! Widzę, że nikt oprócz Ciebie nie zastanowił się nad najważniejszą rzeczą, czyli co właściwie ten czujnik mierzy!
Ale po kolei.
PM2.5 oznacza cząstki MNIEJSZE niż 2,5 µm
PM10 oznacza cząstki MNIEJSZE niż 10 µm, czyli wliczając w to również cząstki PM2.5 - dlatego normy wobec PM10 są zawsze wyższe niż dla PM2.5 - i jeśli widzicie gdzieś wyniki pomiarów, w których ilość cząstek PM2.5 jest większa niż PM10, to jest to oczywista bzdura i takie wyniki należy wyrzucić do kosza.
Natomiast ten czujnik Sharpa, wg dokumentacji liczy ilość cząstek WIĘKSZYCH niż 0,8 µm, nie ma jednak podanej informacji istotniejszej, czyli do jakiej średnicy cząstki są liczone. Jeśli jego zakres kończy się np. na PM2, to nie mamy żadnej informacji na temat PM10 ani PM2.5.
I tu pytanie do Ciebie - skąd wziąłeś informację że zakres pomiaru jest aż do PM500?
Jedyne informacje jakie znalazłem, to tabelka, którą umieścił autor w tym artykule, choć z błędem, bo nie chodzi o dane dla PM2.5, tylko dla cząstek większych niż PM10. Chodzi mi o tę, gdzie najlepszy zakres wynosi 0-35 µg/m³. Według danych, które podałeś najlepszy zakres dla PM10 to 0-20 µg/m³, a dla PM2.5 to 0-12 µg/m³. Mając tylko te dane, ekstrapoluję, że tabelka podana przez autora dotyczy cząstek PM150-200 i być może taki jest właśnie zakres pomiaru tego czujnika.
Przepraszam, zrobiłem błąd w ostatnim zdaniu. Ekstrapolowany zakres pomiaru tego czujnika szacuję na PM40-PM50.
Jednak udało mi się znaleźć jakieś oficjalne informacje na temat zakresu pomiaru tego czujnika. Wg tego dokumentu: https://media.digikey.com/pdf/Data%20Sheets/Sharp%20PDFs/Sharp%20Sensor%20Product%20Intro-%20Dust%20and%20T&H.pdf
a konkretnie tego fragmentu: "Detects particles of 0.1um – 100um diameter (w/o separation)" - czujnik ten miałby mierzyć cząstki PM100. Należy jednak zwrócić uwagę, że druga granica (0,1µg) różni się od granicy znalezionej w innej oficjalnej dokumentacji (0,8µg), więc podane zakresy są są i tak bardzo zgrubne.
na dworze warto brac pod uwagę pomiary tylko jeśli temperatura jest wyższa niż powiedzmy 3 stopnie. bo te czujniki wykrywają mgłę i to właśnie one podnoszą alarmy smogowe gdy temperatura jest w okolicy -3...3*C :)
Tych którzy większej dokladnośći potrzebują może zainteresować czujnik SDS011.
Na tym czujniku bazuje też projekt http://luftdaten.info
Gotowe software jest dostępne na github https://github.com/opendata-stuttgart
Moim zdaniem w powyższym programie jest jeden zasadniczy błąd. Jeśli "Wejście modułu ILED podłączamy do pinu cyfrowego 7" to linie 26 i 29 programu powinny być zamienione miejscami.
Raczej nie - co Ci da odczyt ADC bez wysłanego wcześniej impulsu IR ?
A ma ktoś takie cudo podłączone do LCD 16 pinowego lub 4 pin przez konwerter i jakiś fajny skecz?
Czy ktoś może mi wskazać na jakiej podstawie stwierdzone zostało, że czujnik ten mierzy PM2.5?
W komentarzu Krzyśka z 30 stycznia 2017 mówi on, że zakres pomiarowy sięga PM500 - to chyba pomyłka.
PM jest klasyfikowane na podstawie średnicy cząstek pyłu [PM2.5 = 2.5um].
Czujnik ten daje informację o ZAPYLENIU OGÓLNYM, w mg/m3.
W PM jest wymiar, czujnik podaje gęstość (bez frakcjonowania).
Cześć, mam małe pytanie :)
Zmontowałem dokładnie taki sam układ jednak moje pomiary są dużo dużo wyższe i oscylują przy około 100 ug...używałem kodu dostarczonego przez producenta ale po wrzuceniu Twojego nic się nie zmieniło. Masz jakiś pomysł co może być tego przyczyną? Oczywiście w pokoju nie jest aż tak źle, sprawdzałem drugim, droższym czujnikiem.
Również miałem zawyżone wartości, wrzuciłem kod ze strony adeept.com i teraz pomiary wyglądają logicznie. Mam pytanie czy sam czujnik bez płytki (czujnik i kostka z 6 kablami) może być na zewnątrz w obudowie chroniącej przed wilgocią.
aby uzyskać prawidłowe wyniki dla czujnika który nie ma dodatkowej płytki jak na tym projekcie należy usunąć mnożnik *11 gdyż modułu Sharp bez tej dodatkowej płytki nie mają na wyjściu dzielnika napięcia więc nie ma potrzeby sztucznego podwyższania wyniku.
pzdr
Świetny artykuł, zwłaszcza przydatny w zimie kiedy wszyscy palą czym popadną.
Sam przymierzam się do realizacji i waham się też, czy nie użyć SDS011: https://www.elektronika24.pl/blog/czujniki/czujniki-pylu/czujnik-sds011/
Cena SDS waha się w okolicy 180 zł, natomiast GP2Y1010AU0F można dostać za około 60 zł, więc jeszcze muszę rozważyć za i przeciw :).
Witam. Postanowiłem wykorzystać kod do filtra wentylacji ale jakoś nie mogę ogarnąć oprogramowania. Proszę o pomoc.
#define MIN_VOLTAGE 600 // mv - próg dolnego zakresu napięcia dla braku pyłu
#define VREF 1100 // mv - napięcie referencyjne komparatora
#define PIN_LED 8 // numer pinu ILED
#define PIN_ANALOG 0 // numer pinu AOUT
#define MAX_ITERS 10 // liczba pomiarow do sredniej
int ADC_VALUE; // odczytana wartosc A0
int ITER; // numer pomiaru
float VOLTAGE; // wartosc napiecia
float DUST; // wynik
float AVG_DUST; // sredni wynik
void setup(void)
{
analogReference(INTERNAL);
pinMode(2, OUTPUT); //Konfiguracja wyjść na przekaźniki
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
Serial.begin(9600);
pinMode(PIN_LED, OUTPUT);
digitalWrite(PIN_LED, LOW);
}
float computeDust()
{
// Blyskamy IR, czekamy 280ms, odczytujemy napiecie ADC
digitalWrite(PIN_LED, HIGH);
delayMicroseconds(280);
ADC_VALUE = analogRead(PIN_ANALOG);
digitalWrite(PIN_LED, LOW);
// Przeliczamy na mV. Calosc mnozymy przez 11, poniewaz w module
// zastosowano dzielinik napiecia 1k/10k
VOLTAGE = (VREF / 1024.0) * ADC_VALUE * 11;
// Obliczamy zanieczyszczenie jesli zmierzone napiecie ponad prog
if (VOLTAGE > MIN_VOLTAGE)
{
return (VOLTAGE - MIN_VOLTAGE) * 0.2;
}
return 0;
}
void loop(void)
{
AVG_DUST = 0;
ITER = 0;
while (ITER < MAX_ITERS)
{
DUST = computeDust();
// Do sredniej liczmy tylko prawidlowe pomiary
if (DUST > 0)
{
AVG_DUST += DUST;
ITER++;
delay(50);
}
}
AVG_DUST /= MAX_ITERS;
Serial.print("D = ");
Serial.print(AVG_DUST);
Serial.println("ug/m3");
delay(50);
}
if (AVG_DUST <= 13) { //Pierwszy zakres
digitalWrite(2, LOW);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
}
else if (AVG_DUST > 14 && AVG_DUST <= 37) { //Drugi zakres
digitalWrite(2, HIGH);
digitalWrite(3, LOW);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
}
else if (AVG_DUST > 38 && AVG_DUST <= 61) { //Trzeci zakres
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, LOW);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
}
else if (AVG_DUST > 62 && AVG_DUST <= 85) { //Czwarty zakres
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, LOW);
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
}
else if (density > 86 && density <= 121) { //Piąty zakres
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, LOW);
digitalWrite(7, HIGH);
} else (density > 122 && density <= 500) { //Szusty zakres
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, LOW);
digitalWrite(7, HIGH);
}
Jest to czujnik optyczny. Jak ten czujnik zareaguje na parę wodną?
Stosuje się go w oczyszczaczach Sharpa.