Mój pierwszy IoT – ESP32/ESP8266

W poprzednim wpisie pokazałem jak na ESP32 można wgrać firmware z MicroPython SDK wraz z prostym przykładem użycia pinu GPIO, natomiast samo zapalanie diody nie sprawia jeszcze, że zbudowaliśmy swój IoT, ponieważ nie wysyłamy nigdzie zbieranych danych..

Najpierw pomysł

Zastanówmy się co chcielibyśmy zbierać? Załóżmy, że ma to być proste, nieduże i nie powinno zużywać dużo prądu, a jednocześnie powinno wysyłać dane i je odkładać. Zacznijmy zatem od najpopularniejszego IoT’a – mini stacja pogodowa, żeby jednak nie był to kolejny tutorial jak odczytać temperaturę, dodajmy jeszcze czujnik zmierzchowy, aby wiedzieć jakie było nasłonecznienie.

Do wykonania projektu potrzebujemy:

  • 1 x czujnik temperatury i wilgotności DHT11 lub DHT22 (drugi nieco droższy ale umożliwia pomiar temperatur ujemnych)
  • 1 x fotorezystor 20-30kΩ – 10MΩ
  • 1 x rezystor 1MΩ

Lista zakupów krótka, a całkowity koszt to około 10zł (oczywiście przy założeniu, że już posiadamy ESP8266 lub ESP32 i wybierzemy DHT11).

Zaczynamy

Teraz pomyślmy jak miałoby to działać, DHT pozwala nam odczytywać temperaturę i wilgotność odczytują odpowiednie parametry, natomiast jak odczytać nasłonecznienie? W tym celu posłużymy się fotorezystorem – działa on w ten sposób, że im więcej światła na niego pada, tym opór jest mniejszy, a tym samym większe napięcie dostajemy na końcu.

 

Posiadając tą wiedzę jesteśmy w stanie zbudować prosty obwód, do którego przyłożymy napięcie, które będzie się zmieniać w zależności od ilości światła na zewnątrz. ESP32/ESP8266 posiada interfejs ADC, czyli konwerter sygnału analogowego do cyfrowego, a działa to w ten sposób, że kontroler dostając na podanym pinie napięcie z przedziału 0 – 3,3V, przekształca na wartość z zakresu 0 – 4095 (ESP8266 na wyjściu daje zakres 0 – 1024). Jak możecie zauważyć na tej podstawie możemy wyliczyć stosunek otrzymanego napięcia do bazowego i wiemy jaki opór mamy na rezystorze a tym samym wiemy ile światła na niego pada.

 

 

Kolej na czytanie temperatury oraz wskazań czujnika wilgotności, co w przypadku ESP32 i MicroPythona zamyka się w 5 liniach kodu:

A co z danymi?

Na razie udało nam się odczytać różne wskazania, natomiast wypadałoby je gdzieś wysłać. Musimy zatem połączyć się z Internetem i wysłać je na serwer.

No właśnie, najlepiej byłoby posiadać swój serwer, do którego możemy wysłać dowolne dane do późniejszej analizy i projekcji. Natomiast jeżeli serwera nie mamy to na początek wystarczy usługa io.adafruit.com. W darmowym planie możemy stworzyć do pięciu feedów – agregatorów danych. Ładniejszym rozwiązaniem jest ubidots.com, w moim odczuciu ładniejszy, bo w ostatecznie robią to samo, czyli można na przykład wyklikać ładne dashboardy z których jesteśmy w stanie odczytywać informacje z IoT’ów. Zakładamy zatem konto na adafruit i tworzymy trzy feedy temperature, humidity i light.

Aby wysłać coś w świat konieczne jest podłączenie się do naszego routera:

Funkcją sleep wymuszamy oczekiwanie modułu tak długo z wukonywaniem dalszego kodu, dopóki całe połączenie się nie nawiąże. A skoro już mamy połączenie na świat, to aby mieć możliwość rzucenia requestu potrzebna nam będzie zewnętrzna biblioteka urequests do pobrania stąd.

Mając praktycznie gotowy kod pozostaje go jedynie ubrać w nieskończoną pętlę i ustawić jakiś interwał czasowy.

Powyższe rozwiązanie jest jak najbardziej prawidłowe, natomiast nie jest optymalne z punktu widzenia poboru prądu, ponieważ w ten sposób moduł jest cały czas włączony i jedynie co 30 s, odczyta dane z sensorów i wyśle je na serwer. Lepszym rozwiązaniem będzie przestawianie modułu w tryb DEEP_SLEEP, czyli uśpienie jego wszystkich procesów za wyjątkiem licznika czasu, który po zadanym czasie wybudzi moduł.

Jak widać tutaj już nie musimy tworzyć pętli, ponieważ wybudzenie modułu samo uruchomi szereg operacji jakie napisaliśmy powyżej.

Podsumowując, nasz kod wyjściowy wygląda tak:

Całość zapisujemy w pliku main.py , ponieważ plik ten uruchamiany jest zawsze po starcie modułu. Kopiujemy go wraz z urequests.py  na ESP używając ampy.

Show me the numbers!

No i tyle, dane wysyłają się do adafruit, możemy tam stworzyć Dashboard prezentujący nam je w formie ładnych wykresów i wskaźników, przykładowo może on pokazywać temperaturę oraz wilgotność u mnie w mieszkaniu:

 

W następnym odcinku pokażę jak zarządzać małym wyświetlaczem OLED, aby wyświetlać informacje.