niedziela, 11 kwietnia 2021

Stacja pogody na ESP32 cz. 4. Wyświetlacz LCD & publikacja pomiarów na ThingSpeak.

Po dłuższej przerwie, ponownie wróciłem do tematu stacji pogody. Przypominam sobie o nim zwłaszcza zimą, gdy smog czyha na zewnątrz ;) Tym razem skupiam się na publikacji danych w sieci WWW, co daje łatwy dostęp do danych z poziomu dowolnej przeglądarki internetowej. Kolejna, znaczna modyfikacja, to użycia innego mikrokontrolera w postaci ESP32 i wyświetlacza LCD do prezentacji większej ilości danych. Dodałem również kolejny czujnik dwutlenku węgla i lotnych związków organicznych. Zrezygnowałem natomiast z modułów: SDHC i RTC. Całość trafiła do obudowy według własnego projektu.

Stacja pogody

Początkowo, miałem zamiar zostać przy Arduino, ale próba ogrania choćby dwóch połączeń szeregowych dla SDS011 i modułu karty SD zakończyła się fiaskiem. Poza tym potrzebowałem trzeciego interfejsu szeregowego dla modułu WIFI na  ESP8266. Po użyciu kolejnego czujnika SGP30 problematyczna stała się też prezentacja danych - już w poprzedniej wersji prezentowałem dane pomiarów na przemian. Biorąc pod uwagę powyższe problemy, wybór padł na użycie ESP32 z wbudowaną obsługą WIFI i Bluetoothem. Po tej zmianie miałem z kolei problemy z poprawnym działaniem modułu RTC oraz karty SD (OpenLog) i ostatecznie zrezygnowałem z nich na rzecz pobierania czasu z sieci jak i magazynowania danych tylko w sieci (ThingSpeak). Generalnie, mniej modułów to mniej problemów do rozwiązania ;)

Z punktu widzenia użytkownika, istotniejszą zmianą jest forma prezentowania danych. Na wyświetlaczu LCD 2,4" można zmieścić o wiele więcej informacji niż na 4 liniowym LCD. Zapis w sieci daje przyjazny dostęp do wykresów zmian mierzonych wartości w przystępnej formie. Poprzednia opcja z zapisem na karcie, zmusza do pobrania tych danych z karty i wrzucenia np. do jakiegoś arkusza kalkulacyjnego aby tam przygotować wykres. Można też próbować "obkodować" pokazywanie na wyświetlaczu tych danych, ale to oznacza jeszcze więcej pracy. Tak więc, przyjęte podejście do "utrwalania" danych jest najprostsze dla mnie, pomimo tego, że działa tylko, gdy stacja posiada dostęp do sieci WWW.

Elementy stacji

Schemat połączeń
Tytułem uzupełnienia powyższego schematu, standardowo piny RX i TX w ESP32 łączy się odpowiednio z pinami TX i RX w SDS011. Stacja jest zasilana napięciem 5V, wymaganym przez SDS011 (choć piny RX, TX pracują już przy napięciu 3,3V). Pozostałe moduły pracują z napięciem 3,3V, które dostarcza użyty konwerter DC. 

Funkcjonalność

  • pomiar siedmiu parametrów powietrza: temperatury, wilgotności względnej, ciśnienia, poziomu pyłów zawieszonych (PM2.5, PM10), dwutlenku węgla i lotnych związków organicznych. Prezentowana (wyświetlacz) i logowana (dane do sieci) jest mediana z 5 kolejnych pomiarów.
  • informacje na ekranie:
    • mediany pomiarów
    • wartości wybiegające poza normy sygnalizowane dodatkowo kolorem tekstu (żółtym i czerwonym w zależności od wielkości różnicy od przyjętej normy)
    • strzałki przed wartościami informujące o kierunku wzrostu wartości (rośnie czy maleje)
    • sygnalizacja błędu pomiaru "E"(rror)  (błąd wartości zwracanej przez czujnik) oraz dodatkowe ikonki sygnalizujące (nie)poprawną pracę komponentów stacji:
      • WIFI - połączenie z siecią
      • TIME - udane pobranie czasu z sieci WWW
      • SDS - praca czujnika SDS011
      • BME - praca czujnika BME280
      • SGP - praca czujnika SGP30
  • aktualny czas (godzina i minuta)
  • ikonka (słońce, chmury, itp) informująca o aktualnej pogodzie (bardzo przybliżona prognoza na podstawie bieżącego ciśnienia). Ikonki przekonwertowałem używając aplikacji ImageConverter565.exe (2) do postaci tablic zapisanych w kodzie (przykład TFT_Flash_Bitmap)

Na pierwszym zdjęciu widoczna jest część z opisanej funkcjonalności. Zbyt wysoka (umownie) temperatura 26,1 stopnia jest w kolorze czerwonym. Z kolei wilgotność 37% jest niższa od komfortowej (znowu umowna wartość) czyli 40%. Ciśnienie atmosferyczne i inne pomiary są w porządku, stąd kolor zielony. Generalnie bez wczytywania się w liczby, po samym kolorze z większej odległości od stacji widać, że coś jest nie tak ;) Przed wartościami są strzałki informujące o kierunku zmian danej wartości: skierowana w górę - wzrost, w dół - spadek, brak strzałki - brak zmian.

Uruchomienie

Tworzenie stacji zajęło mi znacznie więcej czasu niż wcześniejsze wersje, z kilku powodów. Tym razem użyłem zupełnie nowego kontrolera  i wyświetlacza, których wcześniej nie stosowałem. Druga rzecz, to "dopieszczenie" kodu, aby stacja była możliwie jak najbardziej funkcjonalna - najwięcej czasu poświęciłem obsłudze wyświetlacza. Trzecia trudność, to nauka i zaprojektowanie obudowy, tym razem we FreeCAD-zie. Wcześniej używałem przy paru projektach Tinkercad'a, ale to raczej rozwiązanie dla początkujących i dla dzieci ;) Zaprojektowaną obudowę wydrukowałem następnie na drukarce 3D. Sam druk zajął jakieś 10 godzin i do tego z nienajlepszą wybraną jakością druku, ale efekt jest całkiem przyzwoity.

Elementy obudowy

Moduły (poza LCD) połączyłem razem za pomocą zaprojektowanej i wydrukowanej plastikowej płytki. Na dole jest duży SDS011, wyżej na płytce przykręcone pozostałe moduły: czujników, ESP32 i konwerter DC. Ekran LCD poza mocowaniem na bardzo krótkie wkręty, dodatkowo zabezpieczyłem klejem na gorąco.

Połączone moduły

Z przodu obudowy jak i z tyłu, dodałem kratki wentylacyjne dla czujnika SDS011. Z przodu jest wlot powietrza, z tyłu - wylot. Zrezygnowałem z jakichkolwiek wyłączników i sterowania.

Stacja po zmontowaniu

Kod standardowo zamieszczam na bitbukecie (branch part4_serial). Do ustawienia są wartości zmiennych/stałych apiKey, wifiSsid, wifiPassword, czyli odpowiednio klucz API ThingSpeak, id i hasło WIFI do lokalnego routera. Kodu specjalnie nie będę komentował, starałem się żeby był czytelny ;)  Pewna nowość to ikonki pogody (pobrane gdzieś z netu) i sposób ich dołączania do kodu - dane ikon zapisane w tablicach. Dodatkowe dane, informujące o pracy stacji, trafiają na terminal szeregowy po ustawieniu flagi DEBUG na 1.

Wyniki pomiarów na ThingSpeak

Udoskonalenia

Pierwsza i konieczna rzecz do poprawy to zawyżona wartość temperatury. Jak widać po pierwszym zdjęciu, a zwłaszcza po danych z ThingSpeak, czujnik temperatury zatrzymał się po włączeniu na temperaturze 29 stopni. Z myślą o wentylacji, na etapie projektu, przewidziałem na tylnej i bocznych ściankach całkiem duże (jeśli chodzi o powierzchnię) otwory wentylacyjne. Okazuje się jednak, że to wciąż za mało. Obecnie czujniki są z grubsza w środku obudowy pomiędzy płytką zasilacza i ESP32. Zacznę od przeprojektowania płytki montażowej z modułami tak, aby czujniki znalazły się tuż przy otworach wentylacyjnych bocznej ścianki. Drugie podejście, to nawiercenie otworów na górnej ściance - może nie będzie za pięknie, ale za to szybko - czas drukowania samych boków trwał 8,5 godziny i wolałbym już tego nie powtarzać ;)

Druga rzecz, to wykorzystanie bluetootha w ESP32. Myślę tu o jakieś apce na androida, która poza samym pokazywaniem aktualnych wyników pomiarów, dawałaby możliwość konfiguracji stacji, np. ustawiania progów wartości dla każdej z mierzonych wielkości (ok/zielony, ostrzeżenie/żółty, alarm/czerwony). Obecnie aby je zmienić, trzeba niestety odkręcać tylną ściankę i poprzez złącze mikro USB, programować od nowa ESP32 z nowymi wartościami.

Update (5.02.2023)

Po kilku przeróbkach projektu obudowy i płytki montażowej, udało mi się zbić temperaturę o kilka stopni. Dodałem otwory wentylacyjne na górnej ściance oraz przerzuciłem czujniki na jeden bok wewnętrznej płytki montażowej, aby odsunąć je z dala od "grzejnika" w postaci ESP. Dodałem też ściankę oddzielającą czujniki od ESP i zasilacza. Pozostałą "nadwyżkę" temperatury zredukowałem już na poziomie kodu.

Źródła:

  1. TFT_eSPI - biblioteka obsługująca wyświetlacz ze sterownikiem ILI9341
  2.  ImageConverter565.exe - konwerter ikon BMP do postaci tablic w C

Brak komentarzy:

Prześlij komentarz