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

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

Komentarze (0)

Zaloguj się aby komentować