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
