Stacja pogodowa – optymalizacja

Stacja pogodowa

Witam wszystkich. Od mojego ostatniego wpisu upłynęło trochę czasu, jednak był on poświęcony na rozwinięcie projektu stacji pogodowych. Generalnie mój projekt działa dobrze począwszy od pomiaru poprzez przesłanie danych do serwera, jednak ma dwa minusy:

  • zależność od podłączenia do prądu i duże zużycie energii poprzez moduły ESP8266
  • nie do końca dokładne pomiary poprzez czujniki DHT11 i DHT22

Te dwa problemy spowodowały, że zacząłem się zastanawiać jak przerobić projekt (bez rewolucji) tak by sprawić aby wyniki były dokładniejsze i przede wszystkim móc przestawić się na zasilanie z baterii.

Dokładność pomiaru dość łatwo udało się rozwiązać. Zmieniłem czujnik DHT11 na BME280 i odczyty temperatury jak i wilgotności zdecydowanie poprawiły się. Dodatkowo dostałem możliwość odczytu ciśnienia. Niestety jest to czujnik zdecydowanie droższy niż DHT11, ale po krótkim czasie używania obu na raz stwierdzam, że warto skorzystać z BME280.

Co do pierwszego problemu związanego ze zbyt dużym użyciem prądu to problem udało się rozwiązać w następujący sposób:

  • jako bazę układu wybrałem Atmege328
  • zmiana transmisji WiFi na transmisję radiową

Dlaczego takie zmiany?

Atmega328

Wybór czystego mikrokontrolera powoduje, że nie zawiera on dodatkowych zbędnych komponentów, które konsumują prąd. Dzięki użyciu biblioteki LowPower można wprowadzać mikrokontroler w stan głębokiego uśpienia, gdzie zużywa on bardzo niewielki prąd. Niestety nie jest to idealne rozwiązanie, gdyż maksymalny czas uśpienia wynosi 8 sekund lub forever to momentu wybudzenia zewnętrznym sygnałem. Pomyślałem, że ten drugi tryb z zewnętrznym wybudzeniem, będzie dla mnie idealny (chciałem robić pomiary co 10 minut). Do zewnętrzenego wybudzenia postawnowiłem użyć modułu RTC DS3231, który dysponuje mechanizmem alarmu.

Zbudowałem taki zestaw i było super, niestety jak się okazuje, zegar czasu rzeczywistego mimo wbudowanej baterii nadal konsumował prąd – niewiele, ale jednak na tyle dużo, że mowa było o miliamperach a nie mikroamperach. Postanowiłem zatem zmienić koncepcję i wykorzystać inna opcję. Skorzystałem z mechanizmu usypiania na 8 sekund, wybudzenia, stwierdzenia czy należy zrobić pomiar czy nie, a następnie ponownego uśpienia na 8 sekund. To mało eleganckie rozwiązanie pod kątem programistycznym, okazało się bardzo dobre pod kątem zużycia prądu. W niezbyt precyzyjnych warunkach laboratoryjnych, mój podstawowy układ z samą Atmega328 i usypianiem na 8 sekund, pokazał odczyty zużycia prądu na poziomie 4 mikroamperów, a w trakcie wybudzenia i ponownego uśpienia nieco więcej, ale przez ułamki sekundy. Tak więc to rozwiązanie stało się bazą do mojego projektu.

Czujnik temperatury

Kolejnym krokiem był wybór czujnika temperatury. Tak jak wspomniałem wcześniej, zdecydowałem się na przesiadkę z DHT11 na BME280. Niestety na zewnątrz mam zamontowane DHT22, a poza tym nie chciałem się zamykać tylko na jeden typ czujnika. Poza tym chciałem zrobić to na tyle uniwersalnie, by każdy, kto weźmie mój kod do ręki, mógł sobie go z łatwością zmodyfikować pod inne typy czujników. W związku z tym stworzyłem swój interfejs i implementację klasy, która potrafi użyć odpowiedniej biblioteki i w jednolity sposób zapewnia pobranie temperatury, wilgotności i ciśnienia (to ostatnie dla DHT zwraca null). Myślę, że nikt w razie potrzeb nie będzie miał problemów z dodaniem do tej klasy dodatkowych bibliotek obsługujących inne czujniki.

Musze tu nadmienić, że biblioteka jest przygotowana na obsługę jednego lub dwóch czujników w obrębie jednej stacji pogodowej, ale nie stoi nic na przeszkodzie aby było ich więcej.

Transmisja radiowa

Kolejnym elementem całej układanki jest transmisja radiowa. Tu miałem problem co wybrać. Ostatecznie rozwiązanie padło na moduł CC1101. Nie jest to może najtańszy moduł, ale wydaje się, że także nie najdroższy, jednak charakteryzuje się bardzo niskim poborem prądu zarówno przy transmitowaniu i odbieraniu danych, jak i w stanie uśpienia (bo jak się okazuje ta funkcjonalność pozwoliła obniżyć pobór prądu znacząco).

Wiadomo, że przy transmisji radiowej każdy może podsłuchać tą transmisję, toteż w celu jej zaszyfrowania, dorobiłem mechanizm, który pozwala użytkownikowi stworzyć swoją własną funkcję szyfrująca i deszyfrującą, tak by ukryć treść wiadomości.

Stacja pogodowa – klient

Powyżej opisany projekt, ja nazywam klientem. Dlaczego? Myślę, że wielu z Was czytając moje poprzednie wpisy wie, że odczytane dane przechowuję w bazie danych na serwerze, a zatem potrzebuję jeszcze czegoś co zamieni mi transmisję RF na transmisję sieciową po WiFi. W końcu cała pozostała część projektu działająca przez MQTT i integrująca się z Home Assistant jest fajna i warto ją zostawić. Stąd potrzeba stworzenia czegoś takiego jak Bridge.

Nim jednak przejdziemy do Bridge chciałbym tylko nadmienić, że każda stacja pogodowa (klient) posiada swoje unikalne ID, jak i informację z którego czujnika wysyła dane (0 – pierwszy, 1 – drugi). A złożona na płytce stykowej wygląda tak jak na poniższym zdjęciu.

Stacja pogodowa - transmisja RF
Stacja pogodowa z dwoma czujnikami: DHT11 i BME280 oraz transmiterem RF CC1101

Bridge

Czym jest Bridge? Hmm… To nic innego jak Nodemcu v3 z modułem CC1101 ustawionym jako receiver, zasilane z USB. Jego zadaniem jest przyjąć dane z nadajników (czujniki mam w każdym pokoju i na zewnątrz) i zamienić na wiadomość do brokera MQTT w znanym formacie z poprzednich moich artykułów, reszta zadzieje się samoczynnie.

Oczywiście w chwili obecnej komunikacja Client <-> Bridge jest dość prostym rozwiązaniem. Klient szyfruje, wysyła wiadomość i o niej zapomina. Bridge z kolei deszyfruje wiadomość i przesyła do brokera MQTT (zapisuje także lokalnie w pamięci flash, ale nie jest to jeszcze w żaden sposób synchronizowane) i także zapomina o wiadomości.

Zapis ostatnich „X” pomiarów zapisuje się na Flash’u w Bridge. Zastanawiałem się czy można jakoś usprawnić komunikację między Kientem a Bridge’m, tak by potwierdzić odebranie wiadomości, niestety wszystko to komplikuje projekt, który z założenia ma być prosty i energooszczędny, zatem prawdopodobnie nic w tej sprawie nie będę robił. Potencjalna utrata danych nie stanowi tu wielkiego problemu, poza tym na serwerze istnieje mechanizm, który sprawdza czy w podanym przedziale czasu nie ma stacji pogodowej z której nie spłynąłby wynik i w razie stwierdzenia takiej sytuacji wysyła stosownego maila (jaka stacja i od kiedy brak danych).

Podsumowanie

Każdego Klienta zasilam z pojedynczego ogniwa 18650 o pojemności 8800mAh (niektóre 4.2V a inne 3.7V). Z wyliczeń arytmetycznych wynika, że ogniwo powinno starczyć na klika lat przy pomiarach co 5 min. Jak będzie w rzeczywistości – zobaczymy. Jeśli ogniwa są ok i gdyby nawet arytmetyka zadziałała pesymistycznie i okazało by się, że zamiast lat ma tylko 1 rok, to i tak gra warta świeczki. Obecnie pracuję jednak nad poprawkami w kodzie i opisem jego instalacji, tak by móc się nim podzielić z Wami, ale o tym w następnym artykule.

Stacja pogodowa – optymalizacja
Przewiń na górę