Jest to mój pierwszy projekt oparty o popularny mikrokontroler ESP8266. Urządzenie będzie w przyszłości częścią inteligentnego domu i zostało zaprojektowane tak, aby umożliwiało łatwą integracje oraz dowolne urządzenie na świecie mogło się z nim komunikować. Rozwiązań technicznych dot. IoT nie będę tu opisywał, gdyż jest to tylko wpis poświęcony temu konkretnemu modułowi. Omówię tutaj aspekty techniczne, oprogramowanie, oraz API jakie wystawia urządzenie na świat.
Problem
Łazienka w moim domu, umieszczona jest na samej górze. Dach mam płaski, wiec jak się domyślacie wentylacja grawitacyjna praktycznie nie działa. Najprostszym rozwiązaniem było by zamontować wiatrak i przełącznik. Ale nie chciało by mi się pamiętać zawszę aby go wyłączać i włączać, po za tym dorobienie elektroniki sterującej jest banalne, wiec takie rozwiązanie wybrałem. Teoretycznie na rynku są już wiatraki które włączają się gdy wilgotność osiągnie żądany procent, ale ja miałem jeszcze inny problem. Jak otwierałem okno, aby się wywietrzyło to już zapominałem go zamknąć, o ile latem to nawet lepiej, tyle zimą potrafiło być cała noc otwarte i temperatura rano była tak niska ze nie dało się wytrzymać. Już nie wspomnę o zmarnowanych pieniądzach za ogrzewanie… Dlatego zdecydowałem się na zrobienie własnego sterownika podłączonego do sieci.
Planowanie
Pomysł miałem taki. Wiatrak ma dwa tryby. Manualny oraz automatyczny. W tym drugim przypadku działa tak, że jeżeli wartość odczytana z higrometru przekroczy zadany próg (ustawianie oczywiście zdalnie, oraz zapisywane w pamięci nieulotnej) to wiatrak się załącza. Jeżeli spadnie to wyłącza. W trybie manualnym, my zdalnie sterujemy nim i włączamy oraz wyłączamy kiedy chcemy z poziomu strony internetowej. Jeśli chodzi o rozwiązanie problemu ze słaba wentylacją to tyle. Problem drugi, dotyczący zapominania zamknąć okna jest rozwiązany już w aplikacji zewnętrznej, natomiast z mikrokontrolera sterującego wentylatorem pobierane są dane przez REST API dot. temperatury oraz wilgotności w pomieszczeniu. To co będę robił z danymi, czy je zapisywał, tworzył wykresy, wyświetlał gdzieś na dashboardzie albo jak w przypadku moim, sprawdzał czy temperatura nie spadła za nisko, jest już kwestią czysto programowalną i nie wchodzi w zakres tego urządzenia 🙂
Prace
Najpierw musiałem wybrać uC na którym oprę moje rozwiązanie. Jak dowiedzieliście się ze wstępu, padło na ostatnio popularny i bardzo tani ESP8266-01. Parametrami bije na głowę nie jedną Atmege, a dodatkowo ma wbudowane Wi-Fi, co tylko mi ułatwi pracę, no i można programować go z użyciem biblioteki Arduino co mnie mega ucieszyło.
Potrzebowałem tylko dwa piny GPIO, jeden na sczytywanie danych z czujnika DHT-22, a drugi na sterowanie wentylatorem. Uc dysponuje 4 pinami więcej mam nawet zapas.
Część elektroniczna
Zacząłem oczywiście od zmontowania prototypu na płytce stykowej. Układ banalnie prosty jak widać na schemacie.
Jest kilka szczegółów na które trzeba zwrócić uwagę w trakcie projektowania układu. Np. piny GPIO0 i GPIO2 nie mogą być użyte jak chcemy, bo przy uruchomieniu płytki może się okazać, że nasz program nie działa. Dlatego trzeba zastosować rezystory podciągające, które zapewnią stan wysoki na tych pinach przy uruchamianiu mikrokontrolera.
Kiedy wszystko działała bez zarzutu to można zabrać się za schemat PCB i całość polutować.
Zdjęcia zlutowanego układu:
Zasilanie jakie potrzebowałem do płytki to 5V. Wziąłem pierwszy lepszy zasilacz impulsowy (taki do telefonu) wyjąłem układ z obudowy i dolutowałem niezbędne przewody, aby podpiąć się do płytki i sieci.
Zastanawiałem się nad zasilaniem 12V, ale uznałem, że układ zużywa zbyt mało prądu, aby był sens stosowania tak wysokiego napięcia. Dodatkowo stabilizator bardziej by się grzał przy wyższym napięciu wejściowym. No i oczywiście zasilacze 12V są większych gabarytów niż 5V , więc by był problem z montażem w obudowie.
Część programowalna
Kod jest dość prosty. Logiki sterowania dużo nie ma, bo tylko sprawdzana jest wilgotność i porównywana z parametrem zapisanym w pamięci. Tryb pracy oraz próg załączania wentylatora jest zapisywany do EEPROM, po to, żeby po zresetowaniu (np. przy zaniku prądu) urządzenie wróciło do stanu poprzedniego. Wartości te ustawimy poprzez zapytanie POST na adres REST API mikrokontrolera. Wartość konfiguracyjne możem odczytać wykonując zapytanie typu GET na ten sam endpoint. Są jeszcze dwa adresu url pozwalające odczytać wartości wilgotności i temperatury w czasie rzeczywistym oraz endpoint sterujący pracą wiatraka i pobierający informacje czy jest włączony, czy wyłączony.
Obudowa
Całość zamknąłem w pierwszej lepszej odbudowie, którą znalazłem. Urządzenie będzie ukryte w suficie podwieszanym i jedyną rzeczą na zewnątrz będzie czujnik DHT-22, dlatego zaprojektowałem dla niego smukła i kryjąca obudowę, dostępną do pobrania tutaj.
Urządzenia końcowe
Wiatraki, jakie wybrałem (bo będą 2 sztuki) to zwykłe, średniej półki modele. Tutaj nie kierowałem się niczym innym jak wygląd zewnętrzny oraz głośność pracy. Łazienka nie jest duża wiec o wydajność się nie martwię.
Aktualizacja #1
Z nową wersją został zmieniony pin GPIO0 na GPIO3 (RX) do podłączenia DHT-22. Dodana została dioda prostownicza na cewce kondensatora w celu wyeliminowania szpilek przy jego załączaniu. Został również po stronie 230V dodany gasik RC, aby wyeliminować przypadki, kiedy przy pracującym wentylatorze (silnik) powstawały szumy na zasilaniu i mikrokontroler się resetował. Fizycznie to koniec zmian, reszta kryje się w oprogramowaniu. Serwer synchroniczny został zastąpiony asynchronicznym, również spora część bibliotek została zastąpiona moimi. REST API zostało dostosowane do najnowszych wymagań m.in. dodany został endpoint properties, gdzie zwracane są wszystkie parametry.
Podsumowanie
Projekt czeka na montaż w łazience, ale najpierw trzeba zrobić tam mały remont, chociaż by po to, aby pociągnąć zasilanie do wiatraka i układu, a nie obędzie się bez cięcia w suficie. Kiedy już uda mi się całość osadzić na miejscu to z pewnością zaktualizuje ten wpis o to jak wygląda to w akcji 😀
Również muszę zaprogramować odpowiednie wykresy oraz miejsca na dashboardzie, aby wyświetlać dane live, ale to już leży poza odpowiedzialnością tego projektu 🙂
Koszt całości (chodzi mi o sam sterownik, a nie wiatraki) to groszowe sprawy. Samo ESP8266 to 3 zł, zasilacz, ciężko mi powiedzieć, bo mam ich sporo w szufladzie, ale sądzę, że w granicach 15 zł kupimy jakiś dobry. No i dajmy 10 zł na podzespoły elektroniczne (przekaźnik, płytka, rezystory, kondensatory itp..). W sumie daje nam to zaokrąglając ok. 30 zł. Mnie wyniosło max. 5 zł, bo wszystkie elementy miałem już na stanie (w sporym zapasie). Porównując to do cen, jakie są na rynku podobnych rozwiązań, jest to bardzo mało. Z tym że musimy brać pod uwagę to, że w cenę innych rozwiązań jest wliczona praca poświęcona na oprogramowanie. Swojego czasu pracy nad programem nie liczyłem.
Jest to mój pierwszy inteligentny sterownik, więc w przyszłości pewnie sporo jeszcze się zmieni, ale sądzę ze 99% w ramach oprogramowania (aktualizacje, itp..). Mimo to, po testach jestem z niego bardzo zadowolony, działa sprawnie i bezbłędnie, więc nic tylko korzystać 😀
Źródła i linki:
- Link do repozytorium na GitLab: https://gitlab.com/iot-opensource/iot-devices/-/tree/master/projects/hygrostat-and-thermostat
- Dokumentacja API: https://gitlab.com/iot-opensource/iot-devices/-/blob/master/projects/hygrostat-and-thermostat/swagger.yaml