Elektroda.pl
Elektroda.pl
X
Servizza
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Czujnik pogodowy z pomiarem zapylenia i transmisją WiFi

tos18 03 Mar 2018 03:20 4722 33
  • 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.

    Kod: json
    Zaloguj się, aby zobaczyć kod

    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.

    Kod: c
    Zaloguj się, aby zobaczyć kod




    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.
    Kod: c
    Zaloguj się, aby zobaczyć kod


    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.


    Fajne! Ranking DIY
    Potrafisz napisać podobny artykuł? Wyślij do mnie a otrzymasz pendrive 32GB.
  • Servizza
  • #4 08 Mar 2018 21:01
    Robstar
    Poziom 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 08 Mar 2018 22:33
    tos18
    Poziom 37  

    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 09 Mar 2018 10:29
    Azbi
    Poziom 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 10 Mar 2018 15:36
    tos18
    Poziom 37  

    Azbi napisał:
    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.

  • Servizza
  • #9 21 Paź 2018 16:46
    sotb
    Poziom 10  

    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 21 Paź 2018 20:34
    tos18
    Poziom 37  

    sotb napisał:
    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 napisał:
    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 21 Paź 2018 22:00
    sotb
    Poziom 10  

    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 22 Paź 2018 21:51
    sotb
    Poziom 10  

    No to jak to się dzieje, że nic się dotąd nie upaliło? Czy napięcie można ustawić programując sam moduł?

  • #14 22 Paź 2018 22:03
    xury
    Poziom 39  

    Bardzo fajny projekt. Podoba mi się zwłaszcza to, że autor sam napisał sobie soft, a mógł pojść na łatwiznę i wszystkie czujniki podpiąć zrobić na ESPeasy. Ja tak właśnie sobie zrobiłem. :) No i obudowa fajna.

  • #15 23 Paź 2018 00:11
    tos18
    Poziom 37  

    sotb napisał:
    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 napisał:
    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 05 Lis 2018 22:54
    sotb
    Poziom 10  

    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 05 Lis 2018 23:13
    tos18
    Poziom 37  

    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 05 Lis 2018 23:27
    Robstar
    Poziom 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:

    Kod: html
    Zaloguj się, aby zobaczyć kod

    w body:
    Kod: html
    Zaloguj się, aby zobaczyć kod



    w pliku temp_zewnętrzna.php dajesz:

    Kod: php
    Zaloguj się, aby zobaczyć kod
    [/code]

    odświeżają się tylko same wartości

  • #19 05 Lis 2018 23:34
    tos18
    Poziom 37  

    Piszesz o stronie wbudowanej w czujnik czy tej na serwerze ?

    Do ajaxa też w końcu dojdę. Na razie ajaxem odświeżam uptime serwera na stronie głównej.

  • #21 06 Lis 2018 01:25
    sotb
    Poziom 10  

    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 06 Lis 2018 08:21
    sotb
    Poziom 10  

    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 06 Lis 2018 13:05
    tos18
    Poziom 37  

    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 06 Lis 2018 13:30
    sotb
    Poziom 10  

    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?

  • #26 06 Lis 2018 13:39
    tos18
    Poziom 37  

    Proponuję użyć tej biblioteki https://github.com/fu-hsi/pms
    Jest w niej funkcja budząca tak zaspanego PMS i nie trzeba wówczas czytać go bez przerwy.

  • #27 06 Lis 2018 20:20
    sotb
    Poziom 10  

    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:

    Kod: c
    Zaloguj się, aby zobaczyć kod

  • #28 06 Lis 2018 22:51
    tos18
    Poziom 37  

    Z tego co widzę to jest zmiana w bibliotece pms.h - ja używam starszej wersji 1.0.0 gdzie zapis

    Kod: c
    Zaloguj się, aby zobaczyć kod

    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
    Kod: c
    Zaloguj się, aby zobaczyć kod

    więc problematyczna linia bedzie wyglądać tak:
    Kod: c
    Zaloguj się, aby zobaczyć kod

  • #29 10 Lis 2018 00:28
    sotb
    Poziom 10  

    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 10 Lis 2018 05:38
    tos18
    Poziom 37  

    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