^
Jak zostać deweloperem HomeKit

Jak zostać deweloperem HomeKit cz. IX. Ach śpij kochanie!

Jaromir Kopp

6 marca 2019

Ten odcinek nie będzie ograniczał się tylko do zagadnień HomeKit. Może przydać się również tym, którzy chcą stworzyć akcesoria zasilane bateryjnie z użyciem popularnych i często przeze mnie przywoływanych układów ESP8266.

Być może część z Was miała do czynienia z mikroprocesorami AVR. To te znane z Arduino. Nie dość, że podczas pracy zużywają mało prądu, to jeszcze mają bardzo sympatyczne tryby uśpienia, w który zużywają prawie nic lub zero przecinek zero nic energii. Ponadto podczas uśpienia nie tracą zawartości pamięci operacyjnej SRAM. Z uśpienia można je wybudzić za pomocą zegara wewnętrznego lub przerwania wywołanego zmianą stanu na wybranych nóżkach. To bardzo ułatwia projektowanie urządzeń, które wykonują zadania co jakoś czas lub tylko po naciśnięciu przycisku.

Niestety bardzo popularne, tanie i dobre układy ESP8266 nie są idealne. Właśnie sposób obsługi trybów uśpienia może powodować sporo frustracji.

Łączność wymaga sporo energii

Pisałem o tym miesiąc temu. ESP8266 są tak popularne, ponieważ są zintegrowane z modułem Wi-Fi, który potrafi pracować jako klient sieci, ale i samodzielny Access-Point lub nawet w obu trybach jednocześnie. Potrafi też komunikować się we „własnym” standardzie ESP-NOW, z którego jak wiecie, chętnie korzystam. Jednak to wymaga sporo energii. Transmisja danych wymaga sporego zużycia prądu, a sam procesor i pamięć też potrzebują jej trochę. Producenci oczywiście przewidzieli tryby „energooszczędne” i to w liczbie aż trzech, ale użycie ich jest całkiem odmienne niż np. we wspomnianych układach AVR.

Pierwszy tryb oszczędności energii to usypianie modemu, czyli modułu Wi-Fi. Jest on aktywny „w standardzie”. Pozwala na zmniejszenie zużycia energii do około 15-20 mA, gdy nie jest prowadzona transmisja. I tu widać jak ważne jest ograniczanie czasu, kiedy Wi-Fi pracuje. Dlatego zdecydowałem się na transmisję w ESP-NOW, która jest znacznie wydajniejsza.

Sensor zasilany bateryjnie na ESP8266

Następny tryb to uśpienie procesora. Bardzo często nie mamy „nic do roboty” i program można po prostu wstrzymać. W tym trybie ESP8266 zużywa „jedyne” 0,5-1 mA, ale poza zużywaniem prądu w zasadzie nic nie robi. Zaletą test to, że po przebudzeniu wykonywanie kodu jest kontynuowane, a zawartość pamięci operacyjnej nie ulatuje. Przebudzenie może nastąpić po upływie określonego czasu lub po zmianie stanu na wejściach układu (np. wciśniecie przycisku).

Jednak takie zużycie prądu jest i tak bardzo duże w sytuacji, jeżeli chcemy, aby układ był zasilany bateryjnie. Baterie AAA wytrzymałyby ledwie miesiąc. Co zrobić, aby udało się zapewnić funkcjonowanie układu przez rok lub dłużej? Użyć większych baterii? Można, ale nie będzie to wygodne.

W tej sytuacji przychodzi z pomocą tryb głębokiego snu. Układ ESP8266 zużywa w nim jedyne 15-20 mikroamper. Niestety ten tryb jest wyjątkowo dziwny dla osób przyzwyczajonych do mikrokontolerów np. AVR. Bardziej przypomina śmierć, po której następuje reinkarnacja niż sen i przebudzenie. Po wejściu w tryb głębokiego snu główny procesor ESP8266 jest po prostu wyłączany, a zawartość pamięci z wszystkimi zmiennymi i danymi w niej zawartymi ulatuje. Z tego trybu wyrwać go może jedynie impuls podany na wejście reset. Po tym program startuje od nowa, tak samo jakby układ został normalnie włączony. Aby to nastąpiło, wyjście GPIO16 musi być podłączone właśnie do resetu. Zegar, który odlicza czas uśpienia i w tym trybie jest jedynym aktywnym elementem, potrafi tylko na wyjściu GPIO16 ustawić stan niski, co spowoduje reset i uruchomienie głównego układu. Dość kuriozalne.

Jeżeli podczas pracy z trybami głębokiego snu chcemy przechować jakieś dane do następnego cyklu, to musimy je zapisać w pamięci Flash, ale ma ona ograniczoną ilość zapisów lub w pamięci zegara. Tam mamy do dyspozycji jakieś 700 bajtów. To jedyna pamięć, która nie jest czyszczona w trybie głębokiego uśpienia.

Jak żyć, gdy sen uśmierca dane?

Najlepiej przedstawię Wam to na przykładzie mojego sensora temperatury i innych parametrów. Wykonuje on co ustalony czas, np. 2 minuty pomiar i wysyła dane do centrali za pomocą ESP-NOW.

Po włączeniu odczytuje preferencje z pamięci Flash, czyli informacje o tym, jakie sensory ma podpięte, pod jakie MAC adresy ma wysłać pomiar i na jak długo zapaść w śmiertelnie głęboki sen. Od razu stara się wyłączyć moduł Wi-Fi, aby nie pobierał zbędnie dużego prądu.

Następnie sprawdza poprawność danych i ustawia sygnał wysoki na wyjściu, które zasila podłączone sensory. Uwaga! Należy dokładnie sprawdzić jaki pobór energii mają sensory, które chcemy zasilić. Maksymalny pobór prądu na nóżce ESP8266 to jakieś 18 mA. Wystarcza to na zasilenie kilku czujników DS18B20 (temperatura), BME280 (temperatura, wilgotność, ciśnienie), BH1750 (jasność), bo zużywają one mikroampery lub pojedyncze miliampery.

Po tym zaczyna wysyłać do sensorów komendy inicjujące ich działanie i pomiar. I tu należy zapoznać się z instrukcjami do nich. Np. DS18B20, aby dokonać pomiaru w największej dokładności, potrzebuje aż 0,7 sekundy. Jak się domyślacie, teraz przyda się tryb drzemki, czyli lekkiego snu.

Pilot zasilany bateryjnie na ESP8266

Zanim procesor się zdrzemnie, to musi zatrzymać wszystkie timery oraz tryb automatycznego wyłączania modemu Wi-Fi w NULL-MODE. Dodatkowo też, ustawić funkcję, która zostanie wywołana po obudzeniu. Niestety program nie wykonuje się dalej od momentu uśpienia, a od ustawionej funkcji. Po zakończeniu bloku programu układ zapadnie w drzemkę, ale ponieważ stany na wyjściach się nie zmienią, to sensory będą mogły spokojnie dokonać pomiarów. Po określonym czasie np. 0,7 sek. układ się budzi i zaczyna wykonywać kod od wspomnianej funkcji. Odczytuje ona zmierzone dane, przygotowuje „komunikat”, inicjuje protokoły ESP-NOW, włącza modem Wi-Fi i wysyła dane pod zapamiętane w preferencjach adresy i znów zapada w śmiertelny sen.

W moim przypadku nie muszę zapamiętywać zmieniających się danych pomiędzy cyklami. Gdybym musiał, to mam do dyspozycji wspomniane ~700 bajtów pamięci zegara.

A co gdy chcemy z ESP8266 zrobić „pilota”?

To jest jeszcze bardziej skomplikowane. Większość mikrokontrolerów ma możliwość wybudzania ze snu przy zmianie stanu na wejściach. Jak wspomniałem, ESP8266 ma taką możliwość tylko w trybie lekkiego snu. Jest kilka metod obejścia problemu. Jedną z nich jest podawanie krótkiego sygnału na wejście reset, które resetuje i wybudza urządzenie. Jednak wymaga to dość skomplikowanego układu składającego się z kondensatorów, rezystorów i diod. Inny sposób to zastosowanie dodatkowego maleńkiego mikrokontrolera np. Attiny do budzenia i przekazywania informacji, który to klawisz wyrywa ze snu. Na szczęście jest trzecia droga.

Wejście „Enable”.

Czy wystarczy włączyć zasilanie dla ESP8266, aby zaczął działać? Nie. Należy jeszcze podać stan wysoki na wejście „enable – EN”. Włącza ono wewnętrzny regulator napięcia i uruchamia układ. Wyłączenie stanu wysokiego na tym wejściu działa jak odcięcie zasilania.

Teraz niemal wystarczy, że przyciski podłączymy do wejścia EN, a z drugiej strony do plusa zasilania. Wciśnięcie uruchomi układ. Niestety po puszczeniu przycisku się on zatrzymuje. Jednak jeżeli do wejścia EN podłączymy inny pin będący wyjściem, to zaraz po uruchomieniu układu, może on podać stan wysoki na to wyjście i potrzymać swoją pracę. Połączenie należy poprowadzić przez diodę, aby uniknąć interakcji „w drugą stronę”. Dodatkowo przez diody należy podłączyć przyciski do wybranych wejść, aby układ był w stanie rozpoznać który przycisk został wciśnięty. Diody zablokują przejście sygnału z wyjścia podtrzymującego zasilanie EN na wejścia dedykowane konkretnym przyciskom. Wydaje się skomplikowane, ale nie tak bardzo, a elementy są tanie i łatwe w użyciu.

Program po uruchomieniu, jeszcze przed przystąpieniem układu do kalibracji, konfiguruje piny i od razu podaje napięcie na ten, który podtrzyma zasilane EN. Zajmuje to kilkanaście milisekund – w sam raz, aby wykluczyć przypadkowe wciśnięcia. Dalej kod rozpoznaje, które wejście ma stan wysoki, czyli który przycisk został wciśnięty i stosownie od tego wykonuje określone czynności. W moim przypadku odczytuje zapamiętane w pamięci Flash komendy i adresy, pod jakie ma je wysłać za pomocą ESP-NOW. Po wysłaniu wyłącza stan wysoki na wyjściu podtrzymującym zasilanie i tym samym wyłącza całość.

Na koniec ciekawa uwaga. W większości dokumentacji podają, że minimalne napięcie zasilania, z jakim pracują moduły ESP8266 to 3 V. Tak też informuje producent. Jednak czasem trafiałem na dane techniczne, w których pisano, że granicznym napięciem jest 2,5 V. I to jest bardziej zgodne z prawdą. Moje akcesoria spokojnie pracują zasilane nawet dwoma akumulatorkami AA (w sumie 2,3-2,5 V). Jednak należy sprawdzić, czy tak niskie napięcie wystarczy do pracy sensorów. Od razu wyklucza ono popularny DHT22, jednak inne wymienione wcześniej działają nawet od 1,8 V. Zasilanie warto, jest wesprzeć pojemnym kondensatorem elektrolitycznym. Minimum 100, ale lepiej więcej uF.

Jaromir Kopp

Użytkownik komputerów Apple od 1991 roku. Dziennikarz technologiczny, programista i deweloper HomeKit. Propagator przyjaznej i dostępnej technologii. Lubi programować w Swift i czystym C. Tworzy rozwiązania FileMaker. Prowadzi zajęcia z IT i programowania dla dzieci oraz młodzieży, szkoli też seniorów. Współautor serii książek o macOS wydanych przez ProstePoradniki.pl. Projektuje, programuje oraz samodzielnie wykonuje prototypy urządzeń Smart Home. Jeździ rowerem.
Komentarze (0)
L

0 komentarzy