Własna stacja pogodowa ESP8266/ESP32 + OLED

W ostatnim wpisie stworzyliśmy podstawowy IoT zbierający dane z modułu DHT22 – jest to prosty moduł umożliwiający czytanie temperatury oraz wilgotności powietrza. Tym razem postanowiłem nieco rozbudować pierwotny projekt, aby był w stanie czytać więcej informacji.

To co chciałbym osiągnąć to informacje o natężeniu światła (w lux’ach), temperaturze powietrza, wilgotności, ciśnienie oraz to czy pada.

Do tego celu potrzebujemy oczywiście mikrokontroler oraz kilka mniejszych modułów:

  • BMP280 (temperatura + ciśnienie, niestety kupując moduł pomyliłem go z BME280, który dodatkowo posiada jeszcze możliwość pomiaru wilgotności)
  • DHT11/DHT22 (temperatura + wilgotność, jako uzupełnienie BMP280, bo trzeba sobie jakoś radzić 🙂 )
  • BH1750 (czujnik natężenia światła)
  • YL-83 (zamiennie FC-37 – czujnik deszczu)
  • OLED – tutaj mamy kilka opcji do wyboru, najważniejsze to to na jakim sterowniku są oparte i tu do wyboru są SSD1306 oraz SH1106

Zaczynamy

Jak juz wszystko skompletujemy to możemy przystąpić do podłączenia elementów do kontrolera. Jako mikrokontroler posłuży mi D1 mini Pro, głównie dlatego, że posiadam do niego wyświetlacz OLED jako shield oraz płytkę prototypową, natomiast  mamy pełną dowolność, najważniejsze aby zachować połączenia, ewentualnie przemapować piny we własnym kodzie.

Ogromnym plusem wykorzystywanych modułów jest kompatybilność z szyną danych I2C, dzięki czemu do jednej pary pinów możemy podpiąć kilka urządzeń i odwoływać się do nich po określonym adresie! Dzięki temu oszczędzamy cenne piny GPIO w kontrolerze, które przydać się mogą do innych urządzeń.

Nie ma co rozpisywać się za wiele, pora pokazać jak wszystko podłączyć, a jest to banalnie proste. Moduły komunikujące się po I2C łączymy „szeregowo” do dwóch pinów (w moim przypadku D1 i D2), czyli BMP280, BH1750 oraz OLED należą do tej grupy. Następnie wyprowadzenie data z DHT11 wpinamy do pinu D0, a wyjście analogowe z czujnika deszczu podłączamy do wejścia A0 na kontrolerze. I to wszystko! No dobra, jeszcze każde urządzenie potrzebuje prądu to poprawnego działania.

Schemat wygląda następująco:

 

Temperatura i ciśnienie

Zacznijmy od pomiaru temperatury i ciśnienia. o ile pierwsze możemy sprawdzić na dwa sposoby, bo zarówno poprzez DHT11/22 jak BMP280, to ciśnienie zapewni nam jedynie druga opcja, zatem najlepiej jeżeli od razu dwie wartości odczytamy z BMP280 (dodatkowo ten moduł szybciej reaguje na zmianę temperatury).

Zakładam że wszystko już podłączyliśmy jak na powyższym schemacie, musimy jedynie podłączyć się poprzez szynę I2C do modułu i odczytać to co nam serwuje. Do tego celu przyda się bibloteka do obslugi BME280, a przykładowe użycie wygląda następująco:

Zanim jednak wykonamy powyższy kod, warto zaraz po zainicjowaniu i2c sprawdzić czy widzimy podłączone moduły, w tym celu wykonujemy bezpośrednio z konsoli polecenie scan, na obiekcie i2c:

Na powyższym przykładzie widzimy, że dostępne są 3 urządzenia o adresach 35, 60, 118. Adresy te są w wartościach dziesiętnych, natomiast musimy je przeliczyć na wartości szesnastkowe, co najłatwiej zrobić wpisując w tej samej konsoli hex(decimal) , np.:

 

Natężenie światła

Ostatnio sprawdzałem natężenie światła przy użyciu zwykłego fotorezystora. O ile sama idea była dobra, bo działało, o tyle tamto rozwiązanie miało jeden znaczący problem. Kalibracja, potrafiłem stwierdzić, czy jest ciemno, czy jasno, natomiast była to jakaś orientacyjna wartość. Bardziej wymiernym rozwiązaniem jest otrzymywanie informacji o natężeniu światła w LUX’ach, ponieważ w zależności od skali możemy dokładnie stwierdzić co to oznacza. W tym konkretnym przypadku sięgamy po moduł BH1750, który potrafi dokładnie odczytać „wartość światła” i przedstawić już w spodziewanej jednostce.

Podłączenie jest analogiczne do poprzedniego, natomiast moduł mamy na innym adresie, a dokładniej 0x23, więc nie ma tu konfliktu 🙂

Zakładając, że obiekt i2c zdefiniowaliśmy w kodzie powyżej, tu pozostaje nam już tylko zainicjowanie BH1750, korzystamy z gotowej implementacji i nasz wyjściowy kawałek kodu wygląda następująco:

Istnieje możliwość zmiany dokładności czujnika poprzez ustawienie odpowiedniego parametru w wywołaniu metody luminance() , szczegóły na stronie twórcy biblioteki 😀

 

Wilgotność powietrza

W tym przypadku nowości nie ma, poprzednio opisywane, teraz nic się nie zmieniło – no może poza zmianą czujnika, wybrałem ty razem tańszą opcję DTH11:

 

Pada? Nie pada? Jak bardzo?

Ostatnia rzecz jaką chcemy wiedzieć to czy są aktualnie jakieś opady deszczu. Jak wiadomo woda przewodzi prąd i na tym opiera się kolejne urządzenie do badania opadów. Działa na zasadzie rezystencji, czyli im więcej wody, tym opór jest mniejszy, bo przewodzenie lepsze i odwrotnie, im wody mniej tym opór większy. Wystarczy że podepniemy się pod pin A0, który umożliwia czytanie napięcia wejściowego z zakresu 0 – 1V i możemy sprawdzić jak mocne opady nas dotknęły 🙂

Wystarczy teraz wymyślić skalę, która będzie nam coś mówiła, albo po prostu podejść zero-jedynkowo i informować, że jeżeli wartość mamy bliską 1024, to nie pada, w przeciwnym wypadku pada.

Pokaż mi to szybko!

I tu dochodzimy do wyświetlania informacji. O ile poprzednio wysyłaliśmy dane na serwer, bo nie mieliśmy innej opcji, to teraz możemy dane bezpośrednio wyświetlić na małym ekranie OLED. Jak wspominałem wcześniej – na potrzeby tego wpisu użyłem OLED Wemos D1 Shield, natomiast jest on dość mały – 64×48 pikseli niestety nie jest w stanie pomieścić zbyt wiele informacji, do tego jeszcze standardowa czcionka w micropython’ie jest dość szeroka (kiedyś opisze jak można ją zastąpić czymś innym).

Jak wspominałem na wstępie, wyświetlacze dostępne na rynku z reguły pracują na dwóch sterownikach, które troszeczkę różnią się działaniem i dlatego ważne jest doinstalowanie odpowiedniej biblioteki. Najpopularniejsze są SSD1306 i ta biblioteka dostępna jest w micropythonie (natomiast trzeba ją dodać ręcznie podczas tworzenia firmware. Drugi sterownik to SH1106, najczęściej spotykany w wyświetlaczach 1.3″ (przynajmniej ja zaobserwowałem taką zależność). Ten drugi sterownik można pobrać z mojego github‚a.

Aby zainicjować wyświetlacz musimy znać jego adres (tak jak i w poprzednich przypadkach), a standardowo jest to 0x3c.

Mając uchwyt do wyświetlacza, możemy na nim rysować proste kształty lub pisać tekst:

Aby wyświetlić teraz wszystkie informacje na ekranie, wystarczy złożyć to co już mamy w jedną całość i wgrać na kontroler:

I w ten sposób mamy stację pogodową, która co sekundę sprawdza wszystkie parametry i pokazuje na wyświetlaczu OLED 🙂

Oczywiście nic nie stoi na przeszkodzie, aby korzystając z poprzedniego wpisu wysyłać te dane również na serwer aby mieć do nich dostęp zewsząd. Daje to więcej możliwości, a w moim przypadku na pewno zostanie w ten sposób to zaimplementowane, ponieważ w planach mam zbudowanie sprytnego lustra, które dane zebrane przez jeden kontroler będzie wyświetlało u siebie 🙂