Wreszcie dotarły do mnie wszystkie elementy układanki i zacząłem składać czujki w zgrabną całość. Jeśli jeszcze raz ktoś mi powie, że rezystory o rozmiarach 0,6 x 0,3mm są fajne do ręcznego lutowania, to mu przylutuję…
Czujnik temperatury
Jako podstawy czujki użyłem płytki prototypowej do której przymocowałem wszystkie elementy — Arduino Pro Mini oraz nRF24l01 za pomocą goldpinów które później skróciłem aby całość mogła dość nisko wejść w obudowę. W pobliżu pinu piątego umiejscowiłem DS18b20 oraz rezystor SMD 0603 4k7 podciągający linię sygnałową do stanu wysokiego. Pod modułem radiowym umiejscowiłem dzielnik napięcia na dwóch rezystorach (47k i 15k) który służy do pomiaru stanu naładowania akumulatora, a moduł ładowania akumulatora przymocowałem klejem cyjanoakrylowym (“kropelka”). Akumulator oraz sama płytka zostały na końcu zamocowane do obudowy klejem na gorąco z uwagi na ograniczoną przestrzeń i możliwości montażowe. Kod używa bibliotek RF24 oraz RF24Network do komunikacji z modułem radiowym, a także OneWire i DallasTemperature do obsługi DS18b20. W przypadku liczby czujników przekraczającej 5 urządzeń warto byłoby dodać bibliotekę RF24Mesh w celu automatyzacji konfiguracji bardziej złożonej sieci.
Stacja bazowa
Stacja bazowa została zgodnie z planem oparta o Raspberry Pi Zero W oraz nRF24l01. Raspberry pomimo ograniczonych zasobów sprawnie operuje jako serwer PostgreSQL w którym logowane są dane, natomiast nie zdecydowałem się instalować na nim samej Grafany, w obawie o dostępną ilość pamięci RAM.
Samo oprogramowanie zbierające dane zostało napisane w C++ z użyciem tych samych bibliotek które wykorzystywane są w czujnikach, oraz libpqxx w celu komunikacji z bazą danych. Całość pracuje pod Raspbianem, choć chętnie wymieniłbym go na FreeBSD lub Alpine Linux, to pierwszy nie wspiera wbudowanego chipsetu Wi-Fi tworząc cały projekt bezużytecznym, z drugim zaś mam problemy z kompatybilnością ze sprzętem.
Moduł radiowy został przylutowany do sprzętowego interfejsu SPI i jest na tyle mały, że bez problemu mieści się w standardowej obudowie dla RPi Zero.
Wnioski
Na tym modelu układu radiowego zasięg w domu ograniczył się do 15 metrów, choć warto mieć na uwadze strop pomiędzy piętrami który znacznie pogarsza jakość wszelkiej komunikacji radiowej. Prawdopodobnie układy ze złączem na typową antenę 2,4GHz posiadałyby lepsze parametry, ale także znacznie wpłynęły na koszt całości. Porzucenie pomysłu z użyciem Wi-Fi uważam za dobrą decyzję, nawet kosztem zasięgu.
Z rzeczy które zrobiłbym inaczej wymienię brak układu który pozwalałby na odcięcie zasilania od całości w przypadku niskiego poziomu naładowania akumulatora, a także użycie dzielnika napięcia o większej rezystancji, co zmniejszyłoby pobór prądu. Zarządzanie kablami na płytce prototypowej też nie powala, a zamiast przewodów z taśmy (takiej jak używana do montażu starych dysków na PATA) użyłbym przewodów ze skrętki UTP — lepiej zapamiętują kształt i posiadają więcej kolorów niż szary.
Niemniej, jestem zadowolony z wyników swojej pracy, a szacowany czas działania czujnika na jednym ładowaniu wynosi około 20 dni przy założeniu, że aktywna komunikacja radiowa jest prowadzona co 5 minut.
Na powyższym zrzucie przedstawiony jest pierwszy, testowy czujnik. Częstotliwość komunikacji została zwiększona do 30 sekund, co znacznie wpływa na żywotność akumulatora. Ponadto pierwsze próbki zostały przechwycone z podłączoną ładowarką, co widocznie przekłamuje widoczny stan naładowania, a także prawdopodobnie wpłynęło na odczyty temperatury.
Aktualizacja (13.04.2019)
Po poprawkach w kodzie, z których najważniejszymi były dodanie usypiania zarówno dla mikrokontrolera, jak i radia, a także zmniejszeniu częstotliwości pomiarów do 5 minut czas działania na jednym ładowaniu zwiększył się do niecałych 3 miesięcy, nawet pomimo zwiększonego ograniczenia rozładowania akumulatora. Zmiana ograniczenia wpłynie pozytywnie na żywotność samego ogniwa.