Gdy esp8266 ucina odpowiedzi serwera
Budując układ oparty na Arduino, esp8266 oraz termometrze cyfrowym ds18b20 doszedłem do momentu gdy komunikacja esp z aplikacją webową nie działała poprawnie – drapiąc się po głowie kilka dni już wiem dlaczego!
Objawy były takie, że wysyłając z aplikacji webowej formularz, który kierowany był na adres IP esp8266 w domowej sieci WIFI natrafiałem na błąd. Mianowice wszytsko to, co było wysyłane z serwera łącznie z nagłówkami było ucinane w różnym miejscach bez ładu i składu. Jedno na 20 zapytań przeszło poprawnie, a pozostałe ucinały się po drodze uniemozliwiając odczytanie wysyłanych formularzem wartości. Prezentowany niżej kod nie działał.
void loop (){ setTemperature(); WiFiEspClient client = server.available(); // listen for incoming client if (client) { int ctr = 0; buffer[200] = ""; boolean currentLineIsBlank = true; int allowReadAllTheTime = 0; data = ""; while (client.connected()) { while (client.available()) { char c = client.read(); Serial.print(c); } } } } void setTemperature() { String temperatura = ""; sensors.requestTemperatures(); temperatura = String(float(sensors.getTempCByIndex(0))); //Serial.println(temperatura); }
Kilka dni kombinowania i szukania przyczyny dało rezultat. Okazało się że w funkcji loop jest funkcja setTemperature
, która cały czas zczytuje z ds18b20 temeraturę i przypisuje do globalnej zmiennej temperatura
i to własnie to powodowało nieustanne, ciągłe kłopoty z serwerem. Rozwiązaniem było okresowe czytanie i aktualizowanie temperatury np poprze dodanie indexu, który w loopie się inkrementuje i gdy osiągnie wartość np 1000 wywoła funkcję setTemperature
i wartość indexu znów osiągnie 0. I tak cały czas.
Pomysł jak prosty tak skuteczny, momentalnie wszelkie problemy z komunikacją z serwerem odesżły w niepamięć, a jak znów uwierzyłem w moc esp8266.
Opublikowano: 16 września, 2019 przez Pan z Pogodna