Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
TespolTespol
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Czujnik pogodowy z pomiarem zapylenia i transmisją WiFi

tos18 03 Mar 2018 03:20 10146 40
  • Czujnik pogodowy z pomiarem zapylenia i transmisją WiFi
    Nie jest to nic odkrywczego - wręcz idea takiego wykorzystania elektrodowego gadżetu (D1 mini) nasuwa się od razu.
    Więc zaczynajmy:

    Założeniem było wykonanie czujnika zapylenia i przy okazji innych parametrów atmosferycznych. Czujnik miał być umieszczony na balkonie i zostać połączony jak najmniejszą ilością kabli.
    To, co przedstawiam poniżej jest trzecią wersją czujnika, a zarazem pierwszą, która doczekała się obudowy.

    Wersja pierwsza bazowała na czujniku Sharp GP2Y1010AU0F i termometrze MCP9808.
    W wersji drugiej zapragnąłem odczytu wilgotności, więc MCP został zastąpiony przez DHT22.
    Obydwie miały podstawową wadę - czujnik zapylenia, który brał wszystko jak leci i nie był kalibrowany.

    Powstała więc wersja 3, w której rolę czujnika zapylenia pełnić zaczął PMS3003. Producent twierdzi, że jest on fabrycznie kalibrowany. Posiada zestaw rejestrów z gotowymi wynikami pomiarów. Zapylenie rozbite jest na frakcje PM1, PM2,5 oraz PM10. Do rejestrów dostęp daje interfejs RS232 z logiką 3,3V. Za pomiar temperatury i innych parametrów odpowiada tym razem moduł oparty na BME280.

    Obecna wersja mierzy (wylicza na podstawie pomiarów):
    -zapylenie frakcja PM1 [µg/m³]
    -zapylenie frakcja PM2,5 [µg/m³]
    -zapylenie frakcja PM10 [µg/m³]
    -temperaturę [°C]
    -temperaturę punktu rosy [°C]
    -wilgotność względną [%]
    -wilgotność bezwzględną [%][g/m³]
    -ciśnienie atmosferyczne [hPa]
    -ciśnienie atmosferyczne w odniesieniu do poziomu morza[hPa]
    -poziom sygnału Wi-Fi

    Czyli to, co potrafi ESP8266 wraz z BME280 i PMS3003.

    Sposób połączenia elementów nie jest niczym odkrywczym, a podyktowany jest użyciem sprzętowych interfejsów RS232 i I2C. Takie podłączenie ma jedną wadę - jeżeli podłączony jest czujnik zapylenia, nie da się wgrać programu do modułu. Wystarczy odłączyć moduł przez wyjęcie wtyczki na czas ładowania programu.
    Jeśli kogoś ta niedogodność będzie mocno uwierać, to można zainicjować drugi port szeregowy i na niego przełączyć komunikację z czujnikiem zapylenia.
    Czujnik pogodowy z pomiarem zapylenia i transmisją WiFi

    Elementy czujnika zmontowano na prostej płytce.
    Umieszczono tam również dodatkowe pola lutownicze dla przyszłej rozbudowy.
    Czujnik pogodowy z pomiarem zapylenia i transmisją WiFi

    Po zlutowaniu powstał zwarty moduł. Moduł ten przed zamontowaniem czujników pokryłem powtórnie kalafonią - zobaczymy, jak będzie chroniła ścieżki przed wilgocią.
    Czujnik pogodowy z pomiarem zapylenia i transmisją WiFi

    Czujnik pogodowy z pomiarem zapylenia i transmisją WiFi

    Który został przymocowany do podstawy będącym w zestawie z obudową rzepem:
    Czujnik pogodowy z pomiarem zapylenia i transmisją WiFi

    Całość zamknięto w obudowie radiacyjnej.
    Czujnik pogodowy z pomiarem zapylenia i transmisją WiFi

    Obudowa jest dość droga, ale ma w zestawie uchwyty. Alternatywą była zabawa z podstawkami od doniczek.

    Cały klocek zasilany jest z ładowarki 5V i bierze około 130mA.

    Tyle o sprzęcie. Czas na program.
    Choć może to zbyt duże słowo - powstał bowiem w Arduino Ide i w całości bazuje na gotowych bibliotekach.
    Program realizuje odczyt danych z czujników i wystawia je w postaci prostej strony HTML
    Czujnik pogodowy z pomiarem zapylenia i transmisją WiFi
    oraz paczki JSON.
    Code: json
    Log in, to see the code

    JSON jest używany przez serwerek, który wystawia normalną stronę WWW z danymi oraz zrealizowany na drugim module D1 mini zegarek, który na bieżąco wyświetla dane o zapyleniu.
    Przed wgraniem programu należy w listingu wpisać nazwę domowej sieci Wi-Fi oraz hasło dostępu. Wypada też wpisać wysokość nad poziomem morza, na której zainstalowano czujnik (np. z GPS).
    W routerze warto ustawić rezerwację adresu IP, by czujnik otrzymywał zawsze ten sam adres.
    Można też zmienić tryb pracy na WIFI_AP, wówczas czujnik sam stanie się punktem dostępowym i będzie się można do niego podłączyć przez Wi-Fi jak do każdego innego AP.

    Code: c
    Log in, to see the code




    Koszty:
    PMS3003 - 100zł,
    BME280 moduł - 25zł,
    obudowa - 60zł,
    D1 mini - z elektrody.

    Co dalej?
    -może pomiar ilości opadów deszczu.
    -może zasilanie z baterii słonecznej
    -być może dopieszczenie strony HTML bo na razie pełni rolę diagnostyczną.
    A może nic, bo to, co jest, działa i to całkiem nieźle, zważywszy że miesiąc przeleżało na balkonie bez obudowy w postaci pająka. Opis powstał, bo stwierdziłem, że należy się temu tworowi obudowa.

    Dzięki czujności kol Azbi
    Zmieniono jednostkę dla wilgotności absolutnej w opisie i listingu

    Strona prezentująca dane z czujnika
    http://tos18.ddns.net/php/air.php

    Powstała kolejna wersja programu dla wemosa
    zmiany to głównie wygląd strony wbudowanej oraz wstęp do sygnalizacji awarii czujników.
    Code: c
    Log in, to see the code


    a efekt zmian wygląda tak:

    Czujnik pogodowy z pomiarem zapylenia i transmisją WiFi

    Jest też drobna zmiana w paczce json a mianowicie zmienna stan przyjmuje następujące wartości:
    0-wszystko ok
    1-problem z czujnikiem PMS
    2-problem z czujnikiem BME280
    3-problem z obydwoma czujnikami.

    Tak oto po roku pracy szkic doczekał się jeszcze jednej poprawki
    Code: c
    Log in, to see the code


    A to za sprawą kolegi @Erbit który zauważył niepoprawny nagłówek dla json
    Za co serdecznie dziękuję.

    Jednocześnie okazało się że czujnik zapylenia wymaga okresowego czyszczenia. Myślę że raz na pół roku wystarczy. U mnie błędy pojawiły się po około roku ciągłej pracy bez usypiania.
    Po rozebraniu i wyczyszczeniu suchym pędzelkiem czarnych płaszczyzn działa poprawnie.

    Cool! Ranking DIY
    Can you write similar article? Send message to me and you will get SD card 64GB.
    About Author
    tos18
    Level 39  
    Offline 
    Has specialization in: maszyny gerber lectra, automatyka
    tos18 wrote 4005 posts with rating 571, helped 623 times. Live in city Jarosław. Been with us since 2004 year.
  • TespolTespol
  • TespolTespol
  • #4
    Robstar
    Level 17  
    Możesz podać namiary na obudowę ?
    Ogólnie ok,
    jeszcze dodałbym program na androida,
    Jak często są odpytywane czujniki ?

    Zastanawiam mnie dokładność czujnika PMS po dłuższym czasie, czy masz kontrolę nad pracą wentylatora, też powinien być monitorowany bo jak to bywa z wentylatorami lubia padać.
  • #5
    tos18
    Level 39  
    obudowa - alledrogo użytkownik emd_systemy
    Program na androida - wystarczy dowolna przeglądarka www. Można dopisać do strony automatyczne odświeżanie.
    Czujniki są pytane co około sekundę.
    Wentylator pracuje cały czas.
    Można zmodyfikować program by odczyt był powiedzmy co 10minut. Wówczas czujnik można usypiać. Ważne by wybudzić go na 30sekund przed dokonaniem pomiaru.
    Nie widzę żadnej funkcji monitorującej stan wentylatora
  • #6
    Azbi
    Level 8  
    Super ta obudowa :) . Jakiś czas temu sam budowałem coś podobnego, tylko wykorzystałem inne komponenty. Co nie zmienia faktu, że projekt ciekawy.
    Mam jeszcze pytanie do autora. Od kiedy wilgotność absolutną wyraża się w [%] ?
    Z tego co wiem to wilgotność absolutna wyrażana jest w [g/m³].
  • #7
    tos18
    Level 39  
    Azbi wrote:
    Mam jeszcze pytanie do autora. Od kiedy wilgotność absolutną wyraża się w [%] ?
    Z tego co wiem to wilgotność absolutna wyrażana jest w [g/m³].


    Słuszna uwaga.
    Napisałem z rozpędu.
  • #9
    sotb
    Level 11  
    Czy istnieje jakaś gotowa płytka do połączenia tych modułów? Ze złączem lan na przykład lub oddzielny moduł lan i oddzielnie płytka? Jestem bardziej programistą niż elektronikiem, niestety :/. Widzę tam kondensator, więc wolałbym coś gotowego niż samemu grzebać z lutowaniem :)
    No i pytanie co z napięciem, bo ten czujnik pyłu powinien chodzić na 3,3 v.
  • #10
    tos18
    Level 39  
    sotb wrote:
    Czy istnieje jakaś gotowa płytka do połączenia tych modułów?

    Obawiam się że nie. Pozostaje płytka uniwersalna i lutowanie.
    Jeśli chodzi o coś z kartą LAN to może raspberry pi - programuje się to w pythonie.
    sotb wrote:
    No i pytanie co z napięciem, bo ten czujnik pyłu powinien chodzić na 3,3 v.

    Nie doczytał kolega PMS ma być zasilany napięciem 5V. Natomiast komunikacja odbywa się na napięciach 3,3V
    https://download.kamami.pl/p563980-PMS3003%20series%20data%20manual_English_V2.5.pdf
  • #11
    sotb
    Level 11  
    Już zdążyłem trochę poczytać i znalazłem arduino uno + Moduł Sieciowy LAN Ethernet W5100 Gniazdo Micro SD + Plantower PMS3003 - laserowy czujnik pyłu + BME280
    Słusznie, nie doczytałem, ale bardzo się staram :)
    Jednak czujnik BME280 pracuje na zasilaniu 3,3v.
  • #13
    sotb
    Level 11  
    No to jak to się dzieje, że nic się dotąd nie upaliło? Czy napięcie można ustawić programując sam moduł?
  • #15
    tos18
    Level 39  
    sotb wrote:
    No to jak to się dzieje, że nic się dotąd nie upaliło? Czy napięcie można ustawić programując sam moduł?

    Ale co się miało upalić ?
    PMS potrzebuje 5V i dostaje 5V z zasilacza. BME potrzebuje 3,3V i dostaje ze stabilizatora wbudowanego w wemosa. Logika wemosa chodzi na 3,3V więc jest zgodna zarówno z PMS który ma logikę 3,3V jak i z BME który ma zasilanie i logikę 3,3V - całość ładnie się zazębia i uzupełnia

    xury wrote:
    a mógł pojść na łatwiznę i wszystkie czujniki podpiąć zrobić na ESPeasy.

    Właśnie cała zabawa polegała na tym by soft był własny bo to moje początki z arduino. Na atmegi i attiny pisałem w avr studio z winavr. I tak dużo na skróty poszedłem bo biblioteki gotowe.
  • #16
    sotb
    Level 11  
    Dwa tygodnie i też już podłączyłem czujniki. Na razie na stole.
    Na stronie sklepu kamami jest filmik, gdzie że czujnik początkowo podaje wartości w granicach 7 jednostek. Tymczasem u mnie już od początku pomiar daje wynik 38 i 46. Te wartości się utrzymują cały czas. Mam wrażenie, że coś tu jest znacznie zawyżone. Oczywiście, test pędzelkiem podnosi te wartości. Ciekaw jestem Jak było u Ciebie w teście pokojowym.
    Gdzie ostatecznie masz postawione www, bo widzę php, a parser to dość pamięciożerna sprawa?
  • #17
    tos18
    Level 39  
    Dane nie wyglądają na zawyżone.
    Podaj które frakcje dają takie odczyty (pm1,pm2,5,pm10) ?

    www jest w czujniku. Przerzucam na zewnątrz poprzez php.
    Po uruchomieniu strona czujnika jest dostępna przez http://ip.czuj.ni.ka
    dane json są http://ip.czuj.ni.ka/json
    Natomiast ja dane ze swojego czujnika wyrzucam na zewnątrz przez prosty skrypt php i stąd:
    strona czujnika http://tos18.ddns.net/php/air.sens.php
    json z czujnika http://tos18.ddns.net/php/air.js.php
    strona używająca danych http://tos18.ddns.net/php/air.arch.php stoi na serwerze, bierze dane z json i ładnie wyświetla. Rysuje wykresy i archiwizuje dane.
  • #18
    Robstar
    Level 17  
    Widzę że stosujesz do odświeżania strony standardowe i mało praktyczne wizualnie skoro i tak wysyłasz dane na serwer, lepszym rozwiązaniem jest ajax:
    w głównej dajesz:
    Code: html
    Log in, to see the code

    w body:
    Code: html
    Log in, to see the code



    w pliku temp_zewnętrzna.php dajesz:

    Code: php
    Log in, to see the code
    [/code]

    odświeżają się tylko same wartości
  • #21
    sotb
    Level 11  
    Za wcześnie się cieszyłem. Ostatecznie przy dziesięciominutowej próbie na płytce D1 R2 WIFI ESP8266 czujnik BME280 pokazał kilka razy wyniki w postaci "nan", albo nawet 123 stopnie na minusie. To uniemożliwia uśrednienie. Później BME280 wcale nie został wykryty. Za to czujnik PMS3003 zbierał dane cały czas co 5 sekund. PM2,5 - 38, a PM10 - 46. W pokoju, w którym powietrze w zasadzie "stoi". Wzoruję się na tym filmiku ze strony kamami, gdzie pokazuje znacznie niższe wartości.
    Ta płytka ma tylko jeden serial TX/RX i przez to dane przestawały schodzić po pół minuty. Musiałem SoftwareSerial na D2 i D3 dać (https://robotdyn.com/pub/media/0G-00005444==WIFI-D1R2-ESP8266/DOCS/PINOUT==0G-00005444==WIFI-D1R2-ESP8266.pdf). Być może przez to jakiś konflikt występował z BME280, a może napięcie na linii 3,3 było zbyt niestabilne. Nie wiem jeszcze.
    Po tej próbie wróciłem do klona Arduino Mega 2560 i tutaj czujnik pokazuje nieco mniejsze wartości - 34/40. Jutro jeszcze podłączę BME280 do tej płytki. Kod będę musiał pewnie poprawić, bo już mi sugerowano aby nie używać delay() tylko milis(). Odradzano mi też pętle for i while, zatem będę musiał się zastanowić jak to rozwiązać, bo temp, ciśnienie i wilgotność mogę uśrednić zanim je wyślę do bazy mysql na serwerze. Gorzej z danymi z PMS, bo tutaj mogą występować krótkie, kilkuminutowe, duże skoki i uśrednianie co 5 minut byłoby błędem. Nie wiem przez to czy mój dostawca hostingu nie będzie miał obiekcji jeśli nagle będę przesyłał co pół minuty, przez lata niewielkie dane, będąc wciąż podłączony do bazy :)
    Do ajaxa to i ja się przymierzam, bo to w takim przypadku wydaje się wręcz konieczne.
  • #23
    sotb
    Level 11  
    Użyłem tego, który jest na stronie kamami. Zmodyfikowałem dodając obsługę BME280, wifi i bezpośredniego dostępu do mysql.
  • #24
    tos18
    Level 39  
    Z PMS zauważyłem ciekawą przypadłość, a mianowicie
    Jeżeli czytałem go bez przerwy wszystko było ok natomiast jeśli wymyśliłem sobie odczyt co kilka sekund to po kilkunastu odczytach czujnik jakby szedł spać tzn przestawał podawać aktualne wartości odpowiadając cały czas tymi samymi wartościami z jednego z pierwszych pomiarów.

    Rozwiązanie jest w drugim z moich programów.

    Co do uśredniania wyników proponuję zbierać wyniki w tablicy powiedzmy 20 elementów następnie odrzucić dwie najbardziej skrajne wartości(najwyższą i najniższą) a z pozostałych 18 wyliczyć średnią
  • #25
    sotb
    Level 11  
    Miałem podobnie na D1R2 ESP8266. Podpiąłem tylko PMS3003 i uruchomiłem tylko program do obsługi PMS. Czujnik przez 30 sekund podawał wynik, a później leciał ostatni zapamiętany wynik. Dopiero jak go przepiąłem na inne piny i zadałem SoftwareSerial to działał jak należy.
    Może go odpytywać dalej cały czas, a do tablicy dodawać co któryś wynik?
  • #27
    sotb
    Level 11  
    Przetestowałem program z Kamami i program z githuba. Wnioski mam takie, że oba programy podają rozbieżne wartości przy czym program z githuba (https://github.com/sensor-web/arduino-station/blob/master/sensor/plantower-pms3003/plantower-pms3003.ino) dodatkowo co kilkanaście pomiarów wywala komunikat, że nie może pobrać nagłówka z danymi. dane z pomiarów to odpowiednio 51/80/90. Nie inkludowano w nim żadnych dodatkowych bibliotek.
    Program z kamami zbiera dane bez przerw, a wynik PM2,5 - 53, PM10 - 66. Nie mogę na razie stwierdzić gdzie leży pomyłka.
    Próbowałem też dziś skompilować Twój drugi program z pierwszego postu i kompilator wywalił mi komunikat:
    Code: c
    Log in, to see the code
  • #28
    tos18
    Level 39  
    Z tego co widzę to jest zmiana w bibliotece pms.h - ja używam starszej wersji 1.0.0 gdzie zapis
    Code: c
    Log in, to see the code

    jest poprawny.

    W wersji 1.1.0 pms.read nie ma drugiego parametru (timeout) więc opcje są dwie
    1)instalacja biblioteki w wersji 1.0.0
    2)zmiana zapisu w wskazanej linii na
    Code: c
    Log in, to see the code

    więc problematyczna linia bedzie wyglądać tak:
    Code: c
    Log in, to see the code
  • #29
    sotb
    Level 11  
    W końcu na płytce D1 mini pro udało mi się połączyć program i czujniki tak, żeby to działało. Skorzystałem ostatecznie z innego skryptu do pobierania danych z czujnika PMS. Ustawiłem pobieranie danych co 15 sekund. Dodałem skrypt wysyłający dane bezpośrednio do bazy mysql, bez pośrednictwa PHP. Co minutę lecą uśrednione dane z pyłu, a co około 15 do 20 minut lecą uśrednione dane z BME280. Dodałem obsługę błędu nieuzyskania połączenia z serwerem mysql. Spróbuję poprawić sposób ponawiania połączenia WiFi jeśli nie zostanie ustanowione za pierwszym razem. Program za każdym razem po wgraniu do pamięci i nieudanej próbie łączenia do WIFI zawiesza się zamiast wykonać soft_restart.
    Zastanawiałem się jak rozwiązałeś przekazywanie i magazynowanie danych na serwerze mysql, bo nie znam i nie próbowałem zagłębiać się w tajniki przekazywania danych przy pomocy json.
    Moja strona leży tu: http://www.alberts-l.com.pl/add2.php. Na razie to tylko pomiary w domu i pracy, bo ciągle coś koryguję w skrypcie.
    Ajax odświeża co dziesięć sekund dane aktualne, a wykresy co minutę. Nie trzeba przez odświeżać całej strony.
  • #30
    tos18
    Level 39  
    Danych jest tak mało że nie używam serwera bazy danych tylko prostego skryptu zapisującego dane w pliku tekstowym. Skrypt jest wywoływany przez dcron.
    Pochwal się swoim skryptem na D1