Index ¦ Archives ¦ Atom

Moje przygody z esp32.

Dlaczego?

Za namową i za przykładem mądrych ludzi (dzięki Łukasz) przypatrzyłem się esp32. W skrócie jest to taki sprytny układ który leży na pograniczu układów logicznych a procesorów numerycznych. Układ logiczny trzeba zaprojektować, potem zrealizować. Procesor jest drogi, ale za to uniwersalny. Esp32 jest dokładnie na pograniczu obu światów: - kosztuje 30 zł - czyli stosunkowo tanio jak coś co potrafi coś zrobić i jeszcze połączyć się z wifi - daje się programować za pomocą narzędzi programistycznych

Termometr na Wifi

Tak i ja zakupiłem za parę złotych, sobie esp32. I wymyśliłem sobię oczywiście termometr. Dlaczego oczywiście? To taki insider joke IT. Co robi doświadczony i wykształcony informatyk w wolnym czasie? Programuje termometr na wifi :D

Moja wariacja miała jedyne smaczki: - ma to działać na zewnątrz - w miarę odporne na warunki fizyczne - ma radzić sobie w miarę z zasilaniem, czyli ma sobie poradzić sam i dopuszczalne są przerwy w odczytach (powiedzmy że w zimie)

I tak około rok temu zaczęła się epopeja.

Bo okazało się że to wszystko nie jest takie proste jakby się wydawało.

Hardware

Zacząłem od hardware: - Baterię wziąłem z uszkodzonego powerbanka greencell 20000mAh - Panel solarny: WaveShare Solar Panel (6V 5W) - Waveshare Solar Power Management - Sensor Temperatury DS18B20 - ESP32 - Puszka plastikowa zewnętrzna ze sklepu budowlanego.

Bez większej filozofii udało się to wszystko połączyć "do kupy" sprzętowo. Może nie elegancko - dlatego zdjęciem się podzielę ;-).

Software

Software to jednak inna bajka.

Spróbuję opowiedzieć to w wersjach które funkcjonowały - ich wady i zalety i nieoczekiwane problemy.

Po stronie serwera jest malinka. Bardzo prosty PHP po stronie serwera to zapisywał na dysk. A munin sobie to rysuje.

Podpięcie ESP32 do kompa to dosyć skomplikowana procedura - jak nie do końca rozumiałem na początku o co w tym chodzi to trochę na to spędziłem czasu. Później okazało się to już proste niczym podpięcie pendrive.

Wersja 0 - POC

Generalnie, to było kopiuj wklej dwóch szkiców (takie nazewnictwo na programy na ESP32). Szkic źródłowy 1 - klient wifi+html. Wpisujemy credentiale do wifi (tylko 2.4 GHz). Wpisujemy URL (ja korzystałem z metody GET) URL typu: termometr.php?temperatura=WARTOŚĆ Szkic źródłowy 2 - sensor Tu kawalątek kodu który inicjuje i pobiera wartości.

Voila - temperatura zapisana!

Jako POC i prototyp - był zatrważający szybki do zrobienia. Parę h na hardware + software.

Zachwycony że hardware+software zadziałał - zostawiłem to samemu sobie aby rysowało w muninie temperaturę! I rysowało.

WTEM! Przestało.

Och, bateria się skończyła. Tak rzeczywiście skończyła się bo panel był w pokoju który był w stronę północną! Więc to było spodziewane naruszenie warunku samowystarczalności z początku tekstu. Zastanowiło mnie jedynie tempo - bo to jakoś tydzień wytrzymało. Zapisałem w głowie: w wersji 1 trzeba poczytać o zużyciu prądu.

Bo kto by tam czytał cokolwiek przed robieniem czegokolwiek #pdk.

W wersji zero pojawił się też drugi problem, którego nie rozumiałem, ale również zbagatelizowałem. Co jakiś czas ESP32 pomimo posiadania naładowanej baterii przestawał wysyłać. Zrzucałem to na karb rozładowującej się baterii.

Wersja 1

W wersji 1 postanowiłem wydłużyć czas życia na baterii.

Dodając tym samym warstwę ignorancji na temat programowania i bagatelizowania błędów. Ale o tym za chwilę.

Najpierw założenia co do wersji 1. "Musimy zmniejszyć zużycie prądu".

Szybkie googlowanie - pokazało że ESP32 ma kilka poziomów uśpienia. Mi spodobał się jeden z nich - esp_deep_sleep.

W tym trybie działa (o ile dobrze zrozumiałem) jakiś niski koprocesor który ma tylko kilka trybów (wzbudzenie z czasu, wzbudzenie ze zdarzenia prądowego). Ja wykorzystałem tryb timera. Kazałem (na razie testowo) zasnąć na 1 minutę.

Założyłem że to powinno wydłużyć znacznie pracę na baterii. Nie liczyłem twardo na papierze, ale tydzień powinien się wydłużyć. Po cichu oczywiście w swojej ignorancji zakładałem że razem z tym mikrym panelem PV wytrzyma samowystarczalnie.

Och jak się pomyliłem...

Wersja 1 rzeczywiście usypiała na minutę. I wysyłała aktualną temperature. Wystawiona na światło wytrzymywała dłużej.

Niestety problem z wersji 0 się nasilił. W nieokreślonych momentach - pomimo naładowania baterii - informacje o temperaturze przestały się wysyłać.

W ramach debugu dodałem parametr bootcount (który przeżywał deep_sleep) - którym pomyślałem że spróbuję znaleźć czy może jakiś licznik się przekręca, lub istnieje jakaś regularność.

Nic to nie dało.

W kolejnym (ślepym) debugu, pomyślałem że to problem z zasięgiem. Miałem jakąś tam niewybitną bramkę, którą po prostu wymieniłem na mniej niewybitną. Też nie pomogło.

Niestety moje umiejętności (i chęci) debugu nie sięgały zbyt głeboko. Tu wychodzi minus ESP32 - nie da się prosto go debugować tak jak komputera w którym można zostawić sprytne pułapki. Tutaj program jest prosty (bo nie ma za dużo pamięci), a Serial.println piszę po kablu tylko podpiętego do komputera. Nie miałem ochoty podpinać komputera na tygodnie. To do diaska miał być prosty termometr, a nie stacja kosmiczna zapisująca do czarnej skrzynki (komputera).

Wnioski które zapisałem do wersji 2: - To nie bramka mi rozłącza. - Ignorancja i mnożenie błędów może być moim problemem.

Wersja 2

Ślepy strzał nr 1. (okazało się że nie tak bardzo ślepy) to deep sleep. Okazuje się, że bramki czasem nie budzą się ze głebokiego snu. Tak po prostu :) Dodatkowo, okazało się że że w swojej ignorancji - nie gasiłem wifi przed snem. I to też powodowało nie budzenie go ze snu.

Ślepy strzał nr 2 (też nie tak ślepy) to wifi. Po pierwsze doczytałem że wifi jest kosztowne prądowo, więc przy okazji oszczędziłem trochę prądu: - zapisuje poprzedni odczyt w zmienną która przeżywa deep_sleep i porównuję z aktualnym odczytem po obudzeniu. W przypadku braku zmian - idę spać dalej (nie wysyłam).

Druga sprawa którą zrzucam na jakąś formę obrony mojego dostawcy internetu - to braki odpowiedzi DHCP. Internet gdzieś to podpowiedział. Prawdopodobnie jakaś forma obrony - bo co minutę coś prosiło w kółko o adres z DHCP. Żadne normalne urządzenie tak nie robi (po to jest czas wypożyczenia adresu). Nie wyjaśniałem to z moim dostawcą, ani nie debugowałem. Po prostu wpisałem ręcznie parametry, omijając DHCP.

Wersja ta, z tymi poprawkami aktualnie rysuje ładnie temperaturę, oraz bateria trzyma już dosyć długo. Leży sobie na ogródku z Panelem Fotowoltaicznym w stronę południa.

Mamy środek zimy - ale i tak nieźle się trzyma bateriowo i stabilnością. Bootcount mowi: 3743 co pomnożone przez 10 minut (taki jest interwał snu) daje około 25 dni bez przerwy.

Wersja n ?

Czy pracuje nad kolejną wersją? Nie. Nie aktywnie.

Chętnie zbierał bym napięcie (czy jest ładowanie, ile ma bateria). Może zbierał bym jeszcze inne parametry pogodowe.

Ale póki co spróbujemy pobadać stabilność.

Wnioski na przyszłość

  1. Ignorancja i założenia zawsze źle się kończą.
  2. Eksperymenty są dobre.
  3. Czasem trzeba strzelać na ślepo, lub na intuicje - bo to daje efekty.
  4. Małe systemy są spoko.
  5. Chętnie poszukam systemów zasilanych i ethernetowych - ale też rozsądnych cenowo.

© Piotr Lemiesz. Built using Pelican. Theme by Giulio Fidente on github.