[W BUDOWIE]Terruino - DIY sterownik do terrarium/akwarium z integracją Home Assistant, lub własnej strony WWW.
hejto.plCześć,
W 2019 roku na wykopie zacząłem budowę własnego sterownika do terrarium, niestety ze względów osobistych ślamazarnie mi to szło i projekt jest tak w 80% skończony ale nadal muszę go "dopieścić". W międzyczasie zrezygnowałem z pewnych rozwiązań, inne wdrożyłem. No i serwis wykop też zaczął powoli upadać więc postanowiłem ewakuować swoje "dziecko", część rzeczy przeredaguje ale to nie jest książka żebym musiał o tym wspominać
DO RZECZY:
Wpis 1. - 04.10.2019
Sam pomysł mi wpadł po tym jak postanowiłem mieć zwierzątko, najlepiej takie co można wziąć na ręce i nie będzie sypał sierścią, wybór padł na agame bo mi się najbardziej spodobała. Poczytałem o wymogach, o tym że musi mieć odpowiednią wilgotność i temperaturę, że nasłonecznienie i dogrzewanie gra dużą rolę. Wpierw poszukałem czy są jakieś gotowe rozwiązania na allegro/aliexpress - nic poza wyłącznikiem czasowym lub temperaturowym nie znalazłem.
Po ojcu mam trochę smykałkę do elektroniki, więc poczułem się zobowiązany rozwiązać to po swojemu. Poszperałem więc w internecie i znalazłem kilka gotowych rozwiązań które postanowiłem połączyć i wcielić w życie, mniej lub bardziej udanie. Dla ciekawskich projekty: Link 1 Link 2 Link 3 głównie się, opieram na dwóch pierwszych linkach.
Główne założenia jakie wysunąłem:
-
Sterowanie funkcjami odpowiedzialnymi za dobre samopoczucie, nagrzewanie metahalogenem, załączanie wentylacji mechanicznej
-
Dostęp do danych przez wyświetlacz LCD i stronę WWW(przypis: lub Home Assistant)
-
Budowa jak najbardziej modułowa i bezpieczna(wprowadzę pętle bezpieczeństwa wyłączającą wszystko powyżej 50*C w terrarium - bimetal)
Na aliexpress zamówiłem nad wyrost parę klonów arduino, trochę kabelków, płytek, 3 termometry/higrometry dht22, niepotrzebnie moduł zegara bateryjnego, wyświetlacz LCD 1,8 cala i chyba to tyle, za całość dałem 30 dolarow(150pln, 2019r), a zamówienie dotarło w moje ręce w ciągu 2 tygodni.
Wczoraj rozpakowalem, położyłem wszystko na ziemi i jedyna myśl w głowie - no dobra co dalej. Jako pierwszy wpadł w moje ręce Webmos D1 oparty na ESP8266, ma wbudowany moduł wifi i fajne wyprowadzenia pinów więc idealnie się nada do tych celów.
Podłączyłem Webmos do kompa, poszperałem dokumentację techniczna LCD, 3h spędziłem na łączeniu, dobieraniu pinów, walczeniem z bibliotekami. W końcu udało się - wyświetlacz zaczął przechodzić wgrany w bibliotekę test.
Zachęcony tym wszystkim zacząłem działać dalej, podłączyłem termometry, z tym poszło nieco łatwiej, tylko 1,5h bo okazało się że muszę mieć inną bibliotekę gdyż zwykła arduino już nie wspiera ESP8266. Termometry zaczęły podawać dane, co odczytałem z magistrali. Trochę musiałem pokombinować żeby je opóźnić bo się rozszalały i spamowały, ale w końcu się udało.
Dwie najważniejsze na ten dzień rzeczy zostały osiągnięte - LCD zaczęło wyświetlać testy oraz czujniki temperaturę.
Jako że z programowania wiedziałem ino tyle że istnieje, to podziałałem trybem który mi najbardziej pasuje - inżynierią wsteczną(chociaż inżynieria to słowo na wyrost). Skopiowałem kod z projektu nr 1(link wcześniej) i po jakichś 2h kompilator nie wyrzucił ani jednego błędu, za to pokazał na ekranie piękne informacje dotyczące temperatury i wilgotności z dwóch termometów.
Zmęczony jedyne co postanowiłem zrobić to zmienić grafikę, bo ta w oryginalnym projekcie mi nie pasowała, chwilę mi to zajęło bo szukałem programu żeby odwzorowywac na kompie a potem dopiero przekładać to na ciężkie dosyć instrukcje sterownika wyświetlacza, ale w końcu poszło.
Głównym moim problemem na te chwile jest brak znajomości komend i logiki chodzącej za arduino, dlatego takie przepisywanie kodu wiele mnie uczy, polecam.
Do wpisu jest dołączone zdjęcie z finalnego na dzień wczorajszy wyświetlacza ! Tak wiem trochę literki są krzywo, dziś poprawie
Na dzień dzisiejszy po pracy ogarnę podłączenie przekaźnikow do sterowania ogrzewaniem/wentylatorami, popróbuje ustawić wifi i serwer www, ale zapewne mi się nie uda ze względu na czas(przypis: hehe 2023, 3 lata minęły a przekaźniki nadal leżą w szafie, wifi i serwer www co prawda wykonałem ale kompletnie w inny sposób).
Wprowadzono: 1. Wyświetlanie danych na LCD 2. Odczyt z higrometru/termometru
Na przyszłość zamierzam wprowadzic:
1. Przekaźniki do wentylatorów oraz ogrzewania i oswietlenia
2.Polaczenie wifi i wyświetlanie danych na stronie
3. Pobieranie czasu i daty z serwera, załączanie funkcji zależnie od pory dnia ustalonej po geolokalizacji(wschod/zachod słońca)
4.sterowanie przez www ogrzewaniem i innymi funkcjami
5. Łagodne oświetlenie RGB - w nocy szarawo błękitne, rano bardziej czerwone w południe żółte etc, symulacja dnia w małym świecie.

Wpis 2. 10.10.2019
Od ostatniego wpisu minęło pięć dni, w tym czasie zrobiłem mega postępy jak na początkującego, trochę włosów z głowy także wyrwałem jak coś nie chciało działać a siedziałem do 4 w nocy po pracy ( ͡° ͜ʖ ͡°)
Zacząłem od prostego - połączenia z WiFi co nie było trudne, kilka linijek, na podstawie przykładu z biblioteki bazowej można było to zrobić w ciągu kilku minut. WiFi zaczęło smigać co można zauwazyć po ekranie LCD na zdjęciu poniżej:

Następnie używając biblioteki NTPClient zacząłem ściągać czas z serwera GUS, wszystko pięknie ale niestety ta biblioteka nie wspiera pobierania daty, trzeba by liczyć od czasu epoch co jest dosyć utrudnione, udało mi się wyliczyć rok i zapytałem się na wypoku, jeden mirek dał mi podpowiedź i z czasem(hehe) ją wykorzystam, na te chwile postanowiłem iść dalej.(przypis: ostatecznie zmieniłem biblioteke na normalniejszą, elegancko hula czas.)
Główne problemy - JSON i HTTP Post
Mamy już połączenie z netem, mamy ściąganie czasu(chociaz daty nie), czas dopełnić swego i zacząć wysyłać dane na serwer WWW . Od razu mówię że udało się połowicznie.
Korzystając z tego wspaniałego poradnika udało mi się wysłać dane na serwer, co prawda tylko testowe wyniki, ale zawsze coś - skrypt zadziałał.
Zasada działania logicznie jest prosta jak drut - łączenie po WiFi -> łączenie z serwerem WWW -> komunikacja dwustronna z użyciem klucza API -> wysyłka danych na stronę z kodem PHP odbierającym HTTP Post -> Włożenie przez kod danych do bazy danych -> Wyświetlenie danych na stronie tak to wygląda na stronie .
Jednakże, z punktu widzenia "programisty" nowicjusza co to czasem wygląda jak małpa wpuszczona do kokpitu samolotu - napierdziela przyciski byle jak, może się uda, problem okazał się wielki. Z poradnikiem działało, wysyłać własny kod - tu jest problem.
Poprzednie sprawy wykonałem w ciągu 2 dni po 4h mniej więcej, z tym siedzę już 3dni i nie mam pomysłu, niby działa, a jednak nie do końca.
Używam biblioteki ArduinoJSON do transformacji odczytów na bardziej przyjazny stronom format - json, serializuje te dane i "wysyłam" po HTTP do strony. Wysyłam w cudzysłowiu bo tak na prawde nie wiem co się z tym dzieje i niby HTTP zwraca kod 200 - OK, ale jednak jak je odczytać przez serwer - nie mam pojęcia. Nie wiem również czemu Wireshark nie łapie mi tej transmisji mimo że ustawie wysyłke danych na swój PC.

jak widać wszystko działa, Json jest bardzo ładnie w linii przetwarzany, dane są aktualne, ale jak to dalej wysłać - nie wiem.
Jest tu może jakiś spec od Wiresharka? To by mi bardzo pomogło, teraz jestem w limbo i nie wiem jakie dane są przesyłane, a tak bym miał jedno z głowy i wiedząc czym pluje arduino, mógłbym przejść do budowy własnego skryptu odczytującego JSON.
Z takich ciekawostek to przez przypadek czytając githuba wpadłem na rozwiązanie problemu z LCD - dane po odświeżeniu były "nadpisywane", więc prosta pętla to załatwiała. Jednakże można to zrobić prościej, dodając parametr z kolorem tła, do komendy tft.print - 
I przestałem używać funkcji delay(); w pętli, chcę aby dane były wyświetlane na bieżąco, zamiast delay można użyć po prostu millis(); wystarczy na samym początku ustawić int periodsec = 10000 ; - ilość opóźnienia
unsigned long time_now = 0; - czas początkowy i użyć prostego kodu przed tym co chcemy opóźnić_
_if (millis() >= time_now + periodsec) { //załącza program co dany czas, zastępuje delay bo używa ms od włączenia arduino_
_time_now = millis();_
Podsumowując - jestem tak blisko a tak daleko ukończenia projektu. Gdy się uda uzyskać poprawną komunikację z serwerem to pójdzie już z górki, zostaną tylko zmiany kosmetyczne jak dodanie dodatkowych opcji w stylu załączanie wiatraka, ale to prosta konfiguracja kodu.
Wpis 3. 20.10.2019
Hej, ostatni wpis był 10 dni temu, związane to było z postępującymi pracami nad terruino i brakiem czasu na pisanie dziennika pokładowego.
Zacznę od podziękowań dla mirka @Kokix który chciał pomóc i w sumie to zrobił bo wpadłem dzięki niemu na rozwiązanie problemu z HTTP i klientem NTP - czasowym.
Przez ostatnie 10 dni mocno modyfikowałem terruino, zaczynając od ostatniego wpisu - udało mi się wysłać wiadomość testową po HTTP, jednak na testowej się skończyło ze względu na nikłą znajomość składni języka PHP. Postanowiłem poszukać innego rozwiązania tego problemu, ktoś gdzieś w komentarzu napisał że jest biblioteka do łączenia się od razu z bazą danych. Zadziałało, jednak z czasem się dowiedziałem że to niezbyt rozsądne wrzucać od razu wszystko do bazy bez żadnej furtki, serwer też musiał mieć otwartą bazę danych na ip z mojego zakresu.
Zacząłem działać i pojednałem się na nowo z HTTPclientem, parę godzin szukania(i kopiowania hehe) kodu i poszło, udało się napisać coś takiego po stronie arduino , oraz coś takiego po stronie serwera .
Mamy zwycięstwo, po połączeniu tych dwóch kodów razem monitor portu szeregowego zwracał kod HTTP 200 , czyli super. W bazie danych także się pojawiały informacje na temat czujników.
Wysyłanie danych o temperaturze i wilgotności mamy, te o statusie załączenia światła, wentylacji czy ogrzewania również będą proste do wykonania.
Jak coś wysyłasz, wypadałoby też coś odbierać - GET HTTP.
Znalazłem kolejny poradnik jak to uczynić i zacząłem działać, z tym poszło szybciej bo już się coraz bardziej komfortowo zacząłem czuć w PHP i te znaczki zaczęły coś sensownego znaczyć. Kod jest dosyć prosty , odpytuje po nazwie urządzenia o nastawy ze strony i zwraca info do seriala - tak tylko żeby cel odhaczyć. Na te chwilę więcej nie potrzebuję, zwłaszcza że stanąłem w rozwoju po raz kolejny.
Znalazłem także rozwiązanie z pobieraniem daty, musiałem ściągnąć nową bibliotekę i usunąć z niej parę znaków, ale w końcu zaczęło działać, mam aktualną datę i czas z serwera GUS.
Mam teraz 4 bazy danych, po dwie na nastawy temperatury i przełączników, oraz analogicznie po dwie na ich status. Arduino łączy się z nimi co 30 sekund, chyba idealny interwał. aktualnie w bazie mam 16 tys rekordów które zajmują 1.2MB więc na parę lat starczy ( ͡° ͜ʖ ͡°)
Tylko po co same bazy danych skoro mamy na nich tylko zapisywać dane i z nich nie korzystać? Bez sensu. Potrzebna będzie strona, ogólny zarys jak chce żeby to wyglądało już mam, ale pomysłu na wykonanie brak. Muszę się nauczyć javascriptu, jquery, php i innych dziwnych skrótów żeby zaczęło to wszystko działać. Próbuję coś robić ale idzie to topornie i w najbliższym czasie nie zapowiada sie na poprawę.
Dodatkowo uporządkowałem kod, ogarnąłem że rzeczy niezmienne można sobie wrzucić do osobnego pliku i tak też zrobiłem z ustawieniami wyświetlacza, oraz ogólnymi ustawieniami programu. Kod upiększyłem, dodałem komentarze i teraz jest tak piękny że chętnie bym go przytulił.

Z nudów też zrobiłem sobie zegarek bo czemu nie ( ͡° ͜ʖ ͡°)

W ramach odskoczni zapewne zacznę składać budę terrarium, ale to na przyszłe wpisy temat.
W filmie na dole macie jeszcze dodatkową małą funkcję - jak nie działa wifi lub któryś z odczytów przekracza normy, na wyświetlaczu zmienia się kolor ostrzeżenia.
https://gfycat.com/pl/amusedbleakiberianbarbel
Dzięki za czytanie, jeśli ktoś dotrwał bo pisarz ze mnie żaden. Zapraszam do komentowania, spokojnej niedzieli.
Przypis: Z tego wpisu jestem najmniej zadowolony, ostatecznie zamiast po wysyłaniu gdzieś na zewnątrz prostym POSTEM z kluczem API i odczytywaniem przez PHP - robię to w bardziej cywilizowany sposób, wykorzystując protokół MQTT i domowy serwer postawiony na terminalu.
Na tym wpisie można powiedzieć że rozwój arduino się zakończył a ja dwukrotnie zmieniałem mieszkanie, możliwe że dopiero teraz na stałe gdzieś osiądę i będę mógł po prostu normalnie przemyślec sensowność posiadania zwierzaka. Mimo tego i lekkiej depresji staram się uczyć i dłubać coś przy tym projekcie, gdy będę zadowolony, osiągnę jakiś krok milowy - wstawię wszystko na githuba z instrukcją a was powiadomie.
Pozdro,
Malix.
![[W BUDOWIE]Terruino - DIY sterownik do terrarium/akwarium z integracją Home Assistant, lub własnej strony WWW.](https://cdn.hejto.pl/uploads/posts/images/1200x900/c61b9585f8aeed091652b4639085e332.jpg)