Wpis z mikrobloga

WPIS 2 - Połączenie z siecią przez WiFi i problemy z protokołem HTTP

#terruino - tag do blokowania/obserwowania

#elektronika #arduino #terrarium #terrarystyka #diy #esp8266 #agamabrodata

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 o tutaj
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.

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.

Screen kodu i COM3 - 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 - porównanie

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 timenow = 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.

W spojlerze mały log i TODO

ButtHurtAlert - WPIS 2 - Połączenie z siecią przez WiFi i problemy z protokołem HTTP
...

źródło: comment_Ys27japsZIPSpqAvCyJPaFnT0vsWzezE.jpg

Pobierz
  • 10
Dodam tylko że kompletnie nie rozumiem tej biblioteki arduino json, prawdopodobnie w poniedziałek zacznę kod sieciowy pisać na nowo i szukać rozwiązania jak wysyłać te dane.
via Wykop Mobilny (Android)
  • 0
@ButtHurtAlert: będziesz pobierał dane historyczne JSONem? Dużo będziesz miał tych danych?
Ja też próbowałem wykorzystać tę bibliotekę, ale zrezygnowałem, bo nic mi nie upraszczała sprawy (tylko wysyłam dane, nie odbieram) i ostecznie składam sam stringa. Przy odbiorze jednak trzeba parsować, więc to rozwiązanie odpada..

Ta biblioteka ma trochę obostrzeń. Mam wątpliwości czy obiekt DynamicJsonDocument oraz HttpClient można tak wykorzystywać w pętli, ale niestety nie jestem zbyt zaawansowanym użytkownikiem. Próbowałeś testować coś
@KokiX: Dzięki wielkie za odpowiedź.
1. danych historycznych nie będę pobierał, wszystko ma lecieć na bieżąco na serwer i tam do bazy danych.
docelowo będą to odczyty temperatury i wilgotności z dwóch czujników, dodatkowo dwa razy boolean(załączenie/wyłączenie wiatraka). Zwrotnie chciałbym wysyłać również booleana razy dwa.

2. Sam już się zastanawiam nad składaniem samemu stringa, dużo tego nie ma. Jednak zastanawia mnie problem odbioru danych. Cały czas próbuje przykładów z biblioteki i
@ButtHurtAlert: u mnie wygląda to tak jak na obrazku poniżej. Musiałem umieścić stringa w nawiasach klamrowych, bo inaczej funkcja w JavaScripcie nie parsowała JSONa. Znaki "\" również są tam z powodu dostosowania do JS.

wysyłanie danych w Arduino wygląda u mnie tak:

void handleJSON(){
json_online();
serwer.send(200, "application/json", json);
}

w setup:

(){

serwer.on("/readJSON", handleJSON);
serwer.begin();
}

a odbiór na stronie, w postaci skryptu tak wygląda:

function getJSONdata(){
$.getJSON("readJSON", function(data) { //
KokiX - @ButtHurtAlert: u mnie wygląda to tak jak na obrazku poniżej. Musiałem umieśc...

źródło: comment_PhAMWT0DOZC8R1fkO1J3ucOet2SdmRcb.jpg

Pobierz
@KokiX wpadłem na nią przez przypadek, czytałem jak ten problem z json rozwiązać i ktoś napisał na samym dole w komentarzach ze równie dobrze można z tej biblioteki skorzystać.
Ona jest super bo podajesz ino użytkownika i hasło, gdzie co chcesz wprowadzić i resztę robi za ciebie.