[W BUDOWIE]Terruino - DIY sterownik do terrarium/akwarium z integracją Home Assistant, lub własnej strony WWW.

hejto.pl

Cześć,


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:


  1. Sterowanie funkcjami odpowiedzialnymi za dobre samopoczucie, nagrzewanie metahalogenem, załączanie wentylacji mechanicznej

  2. Dostęp do danych przez wyświetlacz LCD i stronę WWW(przypis: lub Home Assistant)

  3. 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.

hejto.pl

Komentarze (0)

Zaloguj się aby komentować