SantyagoSantyago
YouTube RSS Google+ Facebook GitHub

Okazje Allegro

10x Przewody elektroluminescencyjne neon ELWire 5m

10x Przewody elektroluminescencyjne neon ELWire 5m
Kup teraz: 175,00 zł

Taśma LED APA102 (APA102C) - długość 1m - 30 diod/

Taśma LED APA102 (APA102C) - długość 1m - 30 diod/
Kup teraz: 44,00 zł

Arduino poradnik

Wstęp

Teoria

Biblioteki

Komponenty

Czujniki i sensory

Rozwiązania i algorytmy

Narzędzia

Mikrokontrolery i Arduino IDE

Arduino i klony

Poradniki wideo

Sprzęt dostarczają

Reklama na Blogu

Najnowsze poradniki

Ostatnie komentarze

Popularne wpisy

Facebook

Google+

Ostatnie fotografie

polskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorywieliczka-szyb-danilowicza

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

  1. #define MIN_VOLTAGE     600 // mv - próg dolnego zakresu napięcia dla braku pyłu
  2. #define VREF           5000 // mv - napięcie referencyjne komparatora
  3. #define PIN_LED           7 // numer pinu ILED
  4. #define PIN_ANALOG        0 // numer pinu AOUT
  5. #define MAX_ITERS        10 // liczba pomiarow do sredniej
  6.  
  7. int ADC_VALUE; // odczytana wartosc A0
  8. int ITER; // numer pomiaru
  9. float VOLTAGE; // wartosc napiecia
  10. float DUST; // wynik
  11. float AVG_DUST; // sredni wynik
  12.  
  13. void setup(void)
  14. {
  15.   // analogReference(INTERNAL);
  16.  
  17.   Serial.begin(9600);
  18.  
  19.   pinMode(PIN_LED, OUTPUT);
  20.   digitalWrite(PIN_LED, LOW);
  21. }
  22.  
  23. float computeDust()
  24. {
  25.   // Blyskamy IR, czekamy 280ms, odczytujemy napiecie ADC
  26.   digitalWrite(PIN_LED, HIGH);
  27.   delayMicroseconds(280);
  28.   ADC_VALUE = analogRead(PIN_ANALOG);
  29.   digitalWrite(PIN_LED, LOW);
  30.  
  31.   // Przeliczamy na mV. Calosc mnozymy przez 11, poniewaz w module
  32.   // zastosowano dzielinik napiecia 1k/10k
  33.   VOLTAGE = (VREF / 1024.0) * ADC_VALUE * 11;
  34.  
  35.   // Obliczamy zanieczyszczenie jesli zmierzone napiecie ponad prog
  36.  
  37.   if (VOLTAGE > MIN_VOLTAGE)
  38.   {
  39.     return (VOLTAGE - MIN_VOLTAGE) * 0.2;
  40.   }
  41.  
  42.   return 0;
  43. }
  44.  
  45. void loop(void)
  46. {
  47.    AVG_DUST = 0;
  48.    ITER = 0;
  49.  
  50.    while (ITER < MAX_ITERS)
  51.    {
  52.      DUST = computeDust();
  53.      // Do sredniej liczmy tylko prawidlowe pomiary
  54.      if (DUST > 0)
  55.      {
  56.        AVG_DUST += DUST;
  57.        ITER++;
  58.        delay(50);
  59.      }     
  60.    }
  61.    
  62.    AVG_DUST /= MAX_ITERS;
  63.    
  64.    Serial.print("D = ");
  65.    Serial.print(AVG_DUST);
  66.    Serial.println("ug/m3");    
  67.  
  68.    delay(500);
  69. }

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.

Udpstępnij dalej!

http://www.jarzebski.pl/arduino/czujniki-i-sensory/czujnik-pylu-gp2y1010au0f.html

Reklama

Komentarze Komentarze
Avatar 1
Szymon Ż Windows / Mozilla Firefox 39.0
14 lipiec 2015 - 23:52 Brak informacji

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.

Avatar 2
Korneliusz Linux Ubuntu / Mozilla Firefox 30.0
15 lipiec 2015 - 07:23 Katowice

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.

Avatar 1
Szymon Ż Windows / Mozilla Firefox 39.0
15 lipiec 2015 - 23:24 Brak informacji

Pływa ale mnie interesują tylko duże skoki stężenia pyłu żeby włączyć wyciąg. Do tego się nadaje idealnie.

Avatar 1
cwiek Linux Ubuntu / Mozilla Firefox 39.0
14 lipiec 2015 - 23:56 Poznań

wybacz, ale cos jest nie tak ze stabilnoscia tego drugiego zrodla odniesienia. na obu sygnalach masz podobne wachania probek przed filtrowaniem, co nie?

Avatar 2
Korneliusz Linux Ubuntu / Mozilla Firefox 30.0
15 lipiec 2015 - 07:26 Katowice

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ć.

Avatar 1
cwiek Linux Ubuntu / Mozilla Firefox 39.0
15 lipiec 2015 - 00:01 Poznań

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)

Avatar 2
Korneliusz Linux Ubuntu / Mozilla Firefox 30.0
15 lipiec 2015 - 07:28 Katowice

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!

Avatar 1
Szymon Ż Windows / Mozilla Firefox 39.0
16 lipiec 2015 - 22:18 Brak informacji

Testowałeś? Jakie efekty?

Avatar 2
Korneliusz Linux x86_64 / Mozilla Firefox 34.0
16 lipiec 2015 - 23:09 Bytom

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ć

Avatar 1
JAREK Windows 7 / Safari 537.36
07 sierpień 2015 - 20:30 Poznań

Na jednym z chińskich portali ten czujnik kosztuje w granicach 4 $

Avatar 1
notek Mac OS X / Safari 537.85.12
28 sierpień 2015 - 12:02 Radom

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…..

Avatar 1
Klaudiusz Windows / Mozilla Firefox 40.0
27 wrzesień 2015 - 09:33 Łódź

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.

Avatar 1
Bartosz Windows / Mozilla Firefox 43.0
27 grudzień 2015 - 18:26 Warszawa

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

Avatar 1
Bartosz Windows / Safari 537.36
28 grudzień 2015 - 10:53 Brak informacji

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ł :-(

Avatar 1
riklaunim Linux Ubuntu / Mozilla Firefox 47.0
09 październik 2016 - 22:04 Kwidzyn

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 ;)

Avatar 1
Adam Windows 7 / Mozilla Firefox 45.0
24 październik 2016 - 14:49 Brak informacji

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.

Avatar 1
Paweł Windows / Safari 537.36
05 styczeń 2017 - 09:59 Brak informacji

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

Avatar 1
Krzysiek Windows / Mozilla Firefox 51.0
30 styczeń 2017 - 11:32 Brak informacji

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

Avatar 1
gfrt54 Windows XP / Mozilla Firefox 51.0
01 luty 2017 - 09:28 Brak informacji

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 :)

Avatar 1
ms723 Mac OS X / Safari 602.4.8
17 luty 2017 - 18:39 Brak informacji

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

Avatar 1
duster Windows / Mozilla Firefox 51.0
15 marzec 2017 - 11:50 Brak informacji

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.

Avatar 2
Korneliusz Linux Ubuntu / Mozilla Firefox 52.0
24 marzec 2017 - 15:30 Bytom

Raczej nie - co Ci da odczyt ADC bez wysłanego wcześniej impulsu IR ?

Skomentuj wpis