Dear Arduino Community,
I am working on a Info Station showing me some weather data, displaying outside temperature and so on. In the last weeks I tried to add the measurement of temperature and humidity in some cellar rooms. I am using for this three Nano 33 IoT, too, running a server which provides the measurement data, It works so far, but only for some hours. Then the Server Boards seem to hang up, because I can not read the data anymore, not with my main station arduino, nor with a pc.
So You can imagine, what my question is
Has someone of You an idea, where the problem could be?
Please find attached the code for the three server boards and the main board:
Server:
#include <WiFiNINA.h>
#include "WLAN_Daten.h"
#include "Adafruit_Si7021.h"
bool enableHeater = false;
uint8_t loopCnt = 0;
Adafruit_Si7021 sensor = Adafruit_Si7021();
///////////////////////////////
//globale Variablen Deklaration
///////////////////////////////
static char ssid_intra[] = SECRET_SSID_Intra; // your network SSID (name)
static char pass_intra[] = SECRET_PASS_Intra; // your network password (use for WPA, or use as key for WEP)
static char ssid_inter[] = SECRET_SSID_Inter;
static char pass_inter[] = SECRET_PASS_Inter;
static char ssid_ap[] = SECRET_SSID_AP;
static char pass_ap[] = SECRET_PASS_AP;
static IPAddress IP_Arduino (192, 168, 2, 44); //IP des Arduino
static IPAddress IP_Gateway (192, 168, 2, 1); //IP des Gateway
static IPAddress dns (192, 168, 2, 1);
static IPAddress Subnet (255, 255, 255, 0); //Subnet
int status = WL_IDLE_STATUS;//Status Variable für Netzwerkverbindung
//WiFiClient client;//WIFI Client initialisieren
WiFiServer server(80);
bool kein_Fehler = true;
bool debug = false;
void verbinde_Netzwerk(char WL_SSID[], char PASS[], IPAddress IP, IPAddress GATEWAY, IPAddress SUBNET) {
while (status != WL_CONNECTED) {
WiFi.config(IP_Arduino, dns, IP_Gateway, Subnet); //, GATEWAY, SUBNET);
status = WiFi.begin(WL_SSID, PASS);
delay(100);
}
}
void print_debug(bool hatdebug, String Text) {
if (hatdebug) {
Serial.println(Text);
}
}
void setup() {
debug = false;
if (debug) {
Serial.begin(9600);
}
sensor.begin();
delay(2000);
verbinde_Netzwerk(ssid_ap, pass_ap, IP_Arduino, IP_Gateway, Subnet);
print_debug(debug, "nach netzwerk verbinden inter");
server.begin();
if (debug) {
printWifiStatus();
}
}
void loop(void) {
verbinde_Netzwerk(ssid_ap, pass_ap, IP_Arduino, IP_Gateway, Subnet);
WiFiClient client = server.available();
if (client) {
print_debug(debug, "new client");
// an HTTP request ends with a blank line
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
// if you've gotten to the end of the line (received a newline
// character) and the line is blank, the HTTP request has ended,
// so you can send a reply
if (c == '\n' && currentLineIsBlank) {
// send a standard HTTP response header
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close"); // the connection will be closed after completion of the response
client.println();
client.println("<!DOCTYPE HTML>");
client.println("<html>");
client.print("Luftfeuchtigkeit: ");
client.print(sensor.readHumidity(), 0);
client.print("% ");
client.print("Temperatur: ");
client.print(sensor.readTemperature(), 0);
client.print(" Grad");
client.println("</html>");
break;
}
if (c == '\n') {
// you're starting a new line
currentLineIsBlank = true;
} else if (c != '\r') {
// you've gotten a character on the current line
currentLineIsBlank = false;
}
}
}
// give the web browser time to receive the data
delay(1);
// close the connection:
client.stop();
print_debug(debug, "client disconnected");
}
}
void printWifiStatus() {
// print the SSID of the network you're attached to:
print_debug(debug, "SSID: ");
print_debug(debug, WiFi.SSID());
// print your board's IP address:
IPAddress ip = WiFi.localIP();
print_debug(debug, "IP Address: ");
print_debug(debug, IpAddress2String(ip));
// print the received signal strength:
long rssi = WiFi.RSSI();
print_debug(debug, "signal strength (RSSI):");
print_debug(debug, String(rssi));
print_debug(debug, " dBm");
}
String IpAddress2String(const IPAddress& ipAddress)
{
return String(ipAddress[0]) + String(".") +\
String(ipAddress[1]) + String(".") +\
String(ipAddress[2]) + String(".") +\
String(ipAddress[3]) ;
}
and here the code of the main station:
#include <WiFiNINA.h>
#include "WLAN_Daten.h"
#include "Wetter_Funktionen.h"
#include <ArduinoJson.h>
#include <epd.h>
#include <TimeLib.h>
#include "ArduinoLowPower.h"
//Changelog
//2_0:Feuchtigkeitssensor hinzu
//1_9: Warnmeldungen von Heizung hinzugefügt
//1_8: DWD hinugefügt, Programmstruktur grundlegend überarbeitet
//1_7: Koordinaten korrigiert
//1_6: v_Wind für Tageswetter und aktuelles Wetter hinzu
// Globake Variablen auf tatsächlich benötige Anzahl gekürzt
//1_5: aktuelle Windrichtugn von currtent date lesen statt hourly
//Info:https://www.dwd.de/DWD/warnungen/warnapp/json/warnings.json
///////////////////////////////
//globale Variablen Deklaration
///////////////////////////////
static char ssid_intra[] = SECRET_SSID_Intra; // your network SSID (name)
static char pass_intra[] = SECRET_PASS_Intra; // your network password (use for WPA, or use as key for WEP)
static char ssid_inter[] = SECRET_SSID_Inter;
static char pass_inter[] = SECRET_PASS_Inter;
static IPAddress IP_Heizung (192, 168, 2, 11); // IP der Heizung
static IPAddress IP_Arduino (192, 168, 2, 41); //IP des Arduino
static IPAddress IP_Sensor0 (192, 168, 2, 42); //IP des Tempsensor 0
static IPAddress IP_Sensor1 (192, 168, 2, 43); //IP des Tempsensor 1
static IPAddress IP_Sensor2 (192, 168, 2, 44); //IP des Tempsensor 2
static IPAddress IP_Gateway (192, 168, 2, 1); //IP des Gateway
static IPAddress dns (192, 168, 2, 1);
static IPAddress Subnet (255, 255, 255, 0); //Subnet
int status = WL_IDLE_STATUS;//Status Variable für Netzwerkverbindung
WiFiClient client;//WIFI Client initialisieren
bool kein_Fehler = true;
bool debug = false;
bool hat_ssh = true;
bool kein_ssh = false;
int json_groesse = 4500;
int timer_nacht = 25200000;//Wartezeit Nacht 7h = 420min=25200s=25200000ms
int timer_kurz = 3300000;//Wartezeit für Aktualisierung 55min= 3300s=3300000ms
long dir_wind_aktuell; //aktuelle Windrichtung in Grad
String v_wind_aktuell; //aktuelle Windgeschwindigkeit
String AussenTemp;//Variable für Außentemperatur
String Sensor0;//Variable für Kellersensoren
String Sensor1;//Variable für Kellersensoren
String Sensor2;//Variable für Kellersensoren
Tageswetter_type Tageswetter[3];
Stundenwetter_type Stundenwetter[8];
DynamicJsonDocument doc(JSON_OBJECT_SIZE(3) + JSON_ARRAY_SIZE(2) + json_groesse);//JSON Variable für HTTP Request von OWM
DynamicJsonDocument doc_dwd(JSON_OBJECT_SIZE(3) + JSON_ARRAY_SIZE(2) + json_groesse);//JSON Variable für HTTP Request von DWD
StaticJsonDocument<300> filter_owm;
StaticJsonDocument<600> filter_dwd;
char server_owm[] = "api.openweathermap.org";//OWM Serveradresse
String datarequest_owm = "/data/2.5/onecall?lat=48.9&lon=11.65&units=metric&lang=de&exclude=minutely&appid=1b225e68bc84051aeafe343cde48cfc3";
int http_port_owm = 80;
String methode_owm = "GET";
char server_dwd[] = "api.brightsky.dev";//DWD Serveradresse
String datarequest_dwd = "/weather?tz=Europe/Berlin&lat=48.944&lon=11.569&date=";
int http_port_dwd = 443;
String methode_dwd = "GET";
void setup() {
debug = false;
if (debug) {
Serial.begin(9600);
}
delay(2000);
/////////////////////////////
//initialisieren des Displays
/////////////////////////////
Display_initialisieren();
define_Filter_owm();
define_Filter_dwd();
if (debug) {
Serial.println("Größe des OWM Filter ist:");
Serial.println(filter_owm.memoryUsage());
Serial.println("Größe des DWD Filter ist:");
Serial.println(filter_dwd.memoryUsage());
}
}
void loop(void) {
epd_wakeup();
delay(1000);
epd_clear();
/////////////////////////////////////////////////////////////////////////////////////
//Temperatur_aktualisieren, alles was Intranet braucht, muss hier aktualisiert werden
/////////////////////////////////////////////////////////////////////////////////////
verbinde_Netzwerk(ssid_intra, pass_intra, IP_Arduino, IP_Gateway, Subnet);
hole_Temperatur(IP_Heizung);
String fehlertext = hole_Fehler(IP_Heizung);
delay(100);
//Kellersensoren abfragen
Sensor1 = hole_Feuchtigkeit(IP_Sensor1);
delay(200);
Sensor2 = hole_Feuchtigkeit(IP_Sensor2);
delay(200);
Sensor0 = hole_Feuchtigkeit(IP_Sensor0);
delay(200);
trenne_Netzwerk();
if (debug) {
Serial.println("nach intra");
}
/////////////////////////////////////////////////////////////////////////////////
//Wetter_aktualisieren, alles was Internet braucht, muss hier aktualisiert werden
/////////////////////////////////////////////////////////////////////////////////
verbinde_Netzwerk(ssid_inter, pass_inter, IP_Arduino, IP_Gateway, Subnet);
if (debug) {
Serial.println("nach netzwerk verbinden inter");
}
//Tageswetter von owm holen und befüllen
doc = hole_Wetter(server_owm, datarequest_owm, http_port_owm, methode_owm, filter_owm, kein_ssh );
if (debug) {
Serial.println("nach owm holen");
Serial.println("Größe des OWM jsons ist:");
Serial.println(doc.memoryUsage());
}
befuelleTageswetter(doc);
//Zeitstempel für den aktuellen Tag zur Datumsberechnung
unsigned long t = doc["daily"][0]["dt"];
String Datum_heute = String(year(t)) + "-" + String(month(t)) + "-" + String(day(t));
t = t + 86400;
String Datum_morgen = String(year(t)) + "-" + String(month(t)) + "-" + String(day(t));
//Zeitstempel für die aktuelle Stunde zur Stundenberechnung
t = doc["hourly"][0]["dt"].as<unsigned long>() + doc["timezone_offset"].as<unsigned long>();
//Unterscheidung, ob nach 16Uhr, weil dann auch Daten des folgenden Tages nötig werden
if (hour(t) > 16) {
//t=17
int EndStundeHeute = 24 - hour(t);
int StartStunde_morgen = 24 - hour(t);
doc_dwd = hole_Wetter(server_dwd, datarequest_dwd + Datum_heute, http_port_dwd, methode_dwd, filter_dwd, hat_ssh );
befuelleStundenwetter_dwd(doc_dwd, t, 0, EndStundeHeute);
doc_dwd = hole_Wetter(server_dwd, datarequest_dwd + Datum_morgen, http_port_dwd, methode_dwd, filter_dwd, hat_ssh );
befuelleStundenwetter_dwd(doc_dwd, t, StartStunde_morgen, 8);
}
else {
//wetter nur von heute
int AnzahlStunden = 8;
int StartStunde = 0;
doc_dwd = hole_Wetter(server_dwd, datarequest_dwd + Datum_heute, http_port_dwd, methode_dwd, filter_dwd, hat_ssh );
befuelleStundenwetter_dwd(doc_dwd, t, StartStunde, AnzahlStunden);
if (debug) {
Serial.println("nach befüllen stundenwetter dwd");
}
}
////////////////////////////////
//Trennen der Internetverbindung
////////////////////////////////
trenne_Netzwerk();
if (kein_Fehler) {
zeichne_Stundenwetter();
zeichne_Tageswetter();
zeichne_Aussentemp();
zeichne_Gitter();
//Unterscheidung, ob Fehler von Heizung vorliegt, oder nicht
if (strcmp(fehlertext.c_str(), "--") == 0) {
//kein Fehler von Heizung, nichts zu tun
if (debug) {
Serial.println("kein Heizungsfehler");
}
}
else {
//Fehler da, Zeile mit Fehler schreiben
if (debug) {
Serial.println("Fehlertext:");
Serial.println(fehlertext);
}
epd_disp_string(fehlertext.c_str(), 0, 100);
}
epd_update();
WiFi.end();
delay(1000);
epd_enter_stopmode();
delay(100);
if (strcmp(Stundenwetter[0].Stunde.c_str(), "21:00 Uhr") == 0) {
if (debug) {
Serial.println("timer:");
Serial.println(timer_nacht);
Serial.println(timer_kurz);
}
LowPower.sleep(timer_nacht);
}
//delay(timer_kurz);
LowPower.sleep(timer_kurz);
}
if (!kein_Fehler) {
epd_disp_string("Versuche es in 30s nochmal", 0, 100);
epd_update();
delay(30000);
kein_Fehler = true;
}
}
void Display_initialisieren() {
epd_init();
epd_wakeup();
epd_set_memory(MEM_NAND);
epd_set_en_font(ASCII32);
byte message[] = {0xA5, 0x00, 0x0A, 0x07, 0x01, 0xCC, 0x33, 0xC3, 0x3C, 0xA9};
Serial1.write(message, sizeof(message));
}
void befuelleTageswetter(DynamicJsonDocument doc_temp) {
for (int n = 0; n < 3; n++) {
Tageswetter[n].Tag = Wochentag(doc_temp["daily"][n + 1 ]["dt"]);
Tageswetter[n].Temp = String(int(roundf(doc_temp["daily"][n + 1]["temp"]["min"].as<float>()))) + "/" + String(int(roundf(doc_temp["daily"][n + 1 ]["temp"]["max"].as<float>()))) + " Grad" ;
Tageswetter[n].Icon = id2icon(doc_temp["daily"][n + 1]["weather"][0]["icon"].as<String>(), doc_temp["daily"][n + 1]["weather"][0]["id"]); //+".BMP";
Tageswetter[n].Windspeed = String(int(roundf(3.6 * doc_temp["daily"][n + 1]["wind_speed"].as<float>()))) + " km/h";
}
dir_wind_aktuell = doc_temp["current"]["wind_deg"];
v_wind_aktuell = String(int(roundf(3.6 * doc_temp["current"]["wind_speed"].as<float>()))) + " km/h";
}
void befuelleStundenwetter(DynamicJsonDocument doc_temp) {
//Zeit_offset = doc_temp["daily"]["timezone_offset"];
for (int n = 0; n < 8; n++) {
Stundenwetter[n].Stunde = Stunde(doc_temp["hourly"][n]["dt"]);
Stundenwetter[n].Temp = String(int(roundf(doc_temp["hourly"][n]["temp"].as<float>()))) + " Grad";
Stundenwetter[n].Windspeed = String(int(roundf(3.6 * doc_temp["hourly"][n]["wind_speed"].as<float>()))) + "/" + String(int(roundf(3.6 * doc_temp["hourly"][n]["wind_gust"].as<float>()))) + " km/h";
Stundenwetter[n].Icon = id2icon(doc_temp["hourly"][n]["weather"][0]["icon"].as<String>(), doc_temp["hourly"][n]["weather"][0]["id"]);
}
}
void befuelleStundenwetter_dwd(DynamicJsonDocument doc_temp, unsigned long timestamp, int Start_Stunde, int Anzahl_Stunden) {
for (int n = Start_Stunde; n < Anzahl_Stunden; n++) {
Stundenwetter[n].Stunde = doc_temp["weather"][(n + hour(timestamp)) % 24 ]["timestamp"].as<String>().substring(11, 16) + " Uhr";
Stundenwetter[n].Temp = String(int(roundf(doc_temp["weather"][(n + hour(timestamp)) % 24 ]["temperature"].as<float>()))) + " Grad";
Stundenwetter[n].Windspeed = String(int(roundf(doc_temp["weather"][(n + hour(timestamp)) % 24]["wind_speed"].as<float>()))) + "/" + String(int(roundf(doc_temp["weather"][(n + hour(timestamp)) % 24]["wind_gust_speed"].as<float>()))) + " km/h";
Stundenwetter[n].Icon = id2icon_dwd(doc_temp["weather"][(n + hour(timestamp)) % 24]["icon"].as<String>());
Stundenwetter[n].Regenmenge = doc_temp["weather"][(n + hour(timestamp)) % 24]["precipitation"].as<float>();
}
}
String hole_Fehler(IPAddress IP) {
String Ausgabe = "--";
if (client.connect(IP, 8080)) {
client.println("GET /user/errors");
client.println("Host: " + String(IP));
client.println("Connection: close");
client.println();
Ausgabe = client.readString(); //lies response in String
if (Ausgabe.indexOf("error msg=") == -1) { //kein error msg gefunden
Ausgabe = "--";
return Ausgabe;
}
else {
int pos_value = Ausgabe.indexOf("error msg="); //berechne Position von "Value="
int pos_Anf_Zeichen = Ausgabe.substring(pos_value + 11).indexOf("\""); //berechne Position von ersten " im Teilstring
return Ausgabe.substring(pos_value + 11, pos_value + 11 + pos_Anf_Zeichen);
}
}
else {
return Ausgabe;
}
}
String hole_Feuchtigkeit(IPAddress IP) {
String Ausgabe = "--";
if (client.connect(IP, 80)) {
client.println("GET ");
client.println("Host: " + String(IP));
client.println("Connection: close");
client.println();
delay(100);
Ausgabe = client.readString(); //lies response in String
delay(100);
//Luftfeuchtigkeit: 58% Temperatur: 23 Grad
if (debug) {
Serial.println("ganze Antowort Arduino");
Serial.println(Ausgabe);
}
int ende_luft = Ausgabe.indexOf(" Grad") + 1;
int start_luft = ende_luft - 3;
int ende_temp = Ausgabe.indexOf("%") + 1;
int start_temp = ende_temp - 3;
Ausgabe = Ausgabe.substring(start_luft, ende_luft) + "C " + Ausgabe.substring(start_temp, ende_temp);
return Ausgabe;
}
else {
return Ausgabe;
}
}
void hole_Temperatur(IPAddress IP) {
String Ausgabe;
if (client.connect(IP, 8080)) {
client.println("GET /user/var/40/10241/0/0/12197");
client.println("Host: " + String(IP));
client.println("Connection: close");
client.println();
Ausgabe = client.readString(); //lies response in String
int pos_value = Ausgabe.indexOf("Value="); //berechne Position von "Value="
int pos_Anf_Zeichen = Ausgabe.substring(pos_value + 7).indexOf("\""); //berechne Position von ersten " im Teilstring
AussenTemp = Ausgabe.substring(pos_value + 7, pos_value + 7 + pos_Anf_Zeichen) + " Grad";
}
else {
AussenTemp = "--";
}
}
void verbinde_Netzwerk(char WL_SSID[], char PASS[], IPAddress IP, IPAddress GATEWAY, IPAddress SUBNET) {
while (status != WL_CONNECTED) {
WiFi.config(IP_Arduino, dns, IP_Gateway, Subnet); //, GATEWAY, SUBNET);
status = WiFi.begin(WL_SSID, PASS);
delay(100);
}
}
void trenne_Netzwerk() {
client.stop();
WiFi.disconnect();
status = WL_IDLE_STATUS;
delay(500);
}
void zeichne_Stundenwetter() {
//Felder 1-8 aktualisieren
for (int m = 0; m < 8; m++) {
int z = 0;
if (m < 4) {
epd_disp_string(Stundenwetter[m].Stunde.c_str(), 40 + m * 200, 135);
epd_disp_string(Stundenwetter[m].Temp.c_str(), 40 + m * 200, 167);
epd_disp_bitmap(Stundenwetter[m].Icon.c_str(), m * 200, 0);
epd_disp_string(Stundenwetter[m].Windspeed.c_str(), 0 + m * 200, 0);
if (Stundenwetter[m].Regenmenge > 0) {
epd_disp_string((String(Stundenwetter[m].Regenmenge).substring(0, String(Stundenwetter[m].Regenmenge).lastIndexOf('.') + 2) + " mm").c_str(), 0 + m * 200, 103);
}
}
if (m > 3) {
z = m - 4;
epd_disp_string(Stundenwetter[m].Stunde.c_str(), 40 + z * 200, 335);
epd_disp_string(Stundenwetter[m].Temp.c_str(), 40 + z * 200, 367);
epd_disp_bitmap(Stundenwetter[m].Icon.c_str(), z * 200, 200);
epd_disp_string(Stundenwetter[m].Windspeed.c_str(), 0 + z * 200, 200);
if (Stundenwetter[m].Regenmenge > 0) {
epd_disp_string((String(Stundenwetter[m].Regenmenge).substring(0, String(Stundenwetter[m].Regenmenge).lastIndexOf('.') + 2) + " mm").c_str(), 0 + z * 200, 303);
}
}
}
}
void zeichne_Tageswetter() {
//Felder 9-11 aktualisieren
for (int j = 0; j < 3; j++) {
epd_disp_string(Tageswetter[j].Tag.c_str(), 40 + (j ) * 200, 535);
epd_disp_string(Tageswetter[j].Temp.c_str(), 40 + (j ) * 200, 567);
epd_disp_bitmap(Tageswetter[j].Icon.c_str(), (j ) * 200, 400);
epd_disp_string(Tageswetter[j].Windspeed.c_str(), 0 + j * 200, 400);
}
}
void zeichne_Aussentemp() {
int Abstand_Wand = 5;
//Windgeschwindigkeit drucken
epd_disp_string(v_wind_aktuell.c_str(), 3 * 200 + Abstand_Wand, 400);
//Windrichtung drucken
epd_disp_string(grad2icon(dir_wind_aktuell).c_str(), 3 * 200 + Abstand_Wand, 432);
//Außentemp drucken
epd_disp_string(AussenTemp.c_str(), 3 * 200 + Abstand_Wand, 464);
if (debug) {
Serial.println("Tempsensoren:");
Serial.println(Sensor0);
Serial.println(Sensor1);
Serial.println(Sensor2);
}
//Sensor1
epd_disp_string(("V:" + Sensor0).c_str(), 3 * 200 + Abstand_Wand, 502);
//Sensor2
epd_disp_string(("L:" + Sensor1).c_str(), 3 * 200 + Abstand_Wand, 535);
//Sensor3
epd_disp_string(("W:" + Sensor2).c_str(), 3 * 200 + Abstand_Wand, 567);
}
void define_Filter_owm() {
filter_owm["timezone_offset"] = true;
filter_owm["current"]["wind_deg"] = true;
filter_owm["current"]["wind_speed"] = true;
filter_owm["hourly"][0]["dt"] = true;
filter_owm["daily"][0]["dt"] = true;
filter_owm["daily"][0]["wind_speed"] = true;
filter_owm["daily"][0]["temp"]["min"] = true;
filter_owm["daily"][0]["temp"]["max"] = true;
filter_owm["daily"][0]["weather"][0]["icon"] = true;
filter_owm["daily"][0]["weather"][0]["id"] = true;
filter_owm["daily"]["timezone_offset"] = true;
}
void define_Filter_dwd() {
int i = 0;
for (i; i < 24; i++) {
filter_dwd["weather"][i]["temperature"] = true;
filter_dwd["weather"][i]["wind_speed"] = true;
//filter_dwd["weather"][i]["cloud_cover"] = true;precipitation
filter_dwd["weather"][i]["precipitation"] = true;
filter_dwd["weather"][i]["wind_gust_speed"] = true;
filter_dwd["weather"][i]["wind_gust_speed"] = true;
filter_dwd["weather"][i]["icon"] = true;
filter_dwd["weather"][i]["timestamp"] = true;
}
}
DynamicJsonDocument hole_Wetter(char server[], String request, int port, String methode, StaticJsonDocument<400> filter, bool modus_ssh ) {
bool client_connected;
if (modus_ssh) {
client_connected = client.connectSSL(server, port);
}
else {
client_connected = client.connect(server, port);
}
DynamicJsonDocument doc_temp(JSON_OBJECT_SIZE(3) + JSON_ARRAY_SIZE(2) + json_groesse);
if (client_connected) {
// Make a HTTP request:
/////////ONE CALL/////////////
client.println(methode + " " + request + " HTTP/1.0");//oder 1.0
if (debug) {
Serial.println("anfrage an server");
Serial.println(server + methode + " " + request + " HTTP/1.0");
}
client.println("Host: " + String(server));
client.println("Connection: close");
client.println(); // end HTTP request header
} else {
epd_clear();
epd_disp_string("FEHLER", 0, 10);
epd_disp_string("Konnte Server nicht verbinden", 0, 50);
kein_Fehler = false;
}
char endOfHeaders[] = "\r\n\r\n";
if (!client.find(endOfHeaders)) {
epd_clear();
epd_disp_string("FEHLER", 0, 10);
epd_disp_string("Antwort vom Server fehlerhaft", 0, 50);
epd_disp_string(request.c_str(), 0, 200);
kein_Fehler = false;
return doc_temp;
}
// Parse JSON object
DeserializationError error = deserializeJson( doc_temp, client, DeserializationOption::Filter(filter));
if (error) {
epd_clear();
epd_disp_string("FEHLER", 0, 10);
epd_disp_string("deserializeJson() failed: ", 0, 50);
epd_disp_string(error.c_str(), 0, 90);
kein_Fehler = false;
return doc_temp;
}
delay(1000);
if (debug) {
String line = "";
while (client.connected()) {
line = client.readStringUntil('\n');
Serial.println(line);
}
}
return doc_temp;
}
I have put some functions in an own lib "Wetterfunktionen.h" please finde the code here:
#include <epd.h>
typedef struct
{
String Tag;
String Temp;
String Icon;
String Windspeed;
} Tageswetter_type;
typedef struct
{
String Stunde;
String Temp;
String Icon;
String Windspeed;
float Regenmenge;
} Stundenwetter_type;
String Testfunktion() {
return "Teststring";
}
String grad2icon(long grad) {
if (grad >= 0 && grad < 23) {
return "N";
}
if (grad > 22 && grad < 68) {
return "NO";
}
if (grad > 67 && grad < 113) {
return "O";
}
if (grad > 112 && grad < 158) {
return "SO";
}
if (grad > 157 && grad < 203) {
return "S";
}
if (grad > 202 && grad < 248) {
return "SW";
}
if (grad > 247 && grad < 293) {
return "W";
}
if (grad > 292 && grad < 338) {
return "NW";
}
if (grad > 337 && grad < 361) {
return "N";
}
return "13.BMP";
}
String id2icon(String icon, int ID) {
String TagesZeit = "";
TagesZeit = icon.charAt(2);
switch (ID) {
case 200: return "1.BMP"; break;
case 201: return "1.BMP"; break;
case 202: return "2.BMP"; break;
case 210: return "1.BMP"; break;
case 211: return "1.BMP"; break;
case 212: return "2.BMP"; break;
case 221: return "1.BMP"; break;
case 230: return "1.BMP"; break;
case 231: return "1.BMP"; break;
case 232: return "1.BMP"; break;
case 300: return "3.BMP"; break;
case 301: return "3.BMP"; break;
case 302: return "3.BMP"; break;
case 310: return "3.BMP"; break;
case 311: return "3.BMP"; break;
case 312: return "3.BMP"; break;
case 313: return "4" + TagesZeit + ".BMP"; break;
case 314: return "4" + TagesZeit + ".BMP"; break;
case 321: return "4" + TagesZeit + ".BMP"; break;
case 500: return "3.BMP"; break;
case 501: return "6.BMP"; break;
case 502: return "6.BMP"; break;
case 503: return "7.BMP"; break;
case 504: return "7.BMP"; break;
case 511: return "8.BMP"; break;
case 520: return "4" + TagesZeit + ".BMP"; break;
case 521: return "4" + TagesZeit + ".BMP"; break;
case 522: return "4" + TagesZeit + ".BMP"; break;
case 531: return "4" + TagesZeit + ".BMP"; break;
case 600: return "9.BMP"; break;
case 601: return "9.BMP"; break;
case 602: return "10.BMP"; break;
case 611: return "11.BMP"; break;
case 612: return "11.BMP"; break;
case 613: return "11.BMP"; break;
case 615: return "11.BMP"; break;
case 616: return "11.BMP"; break;
case 620: return "9.BMP"; break;
case 621: return "9.BMP"; break;
case 622: return "10.BMP"; break;
case 701: return "12.BMP"; break;
case 721: return "12.BMP"; break;
case 741: return "12.BMP"; break;
case 771: return "14.BMP"; break;
case 800: return "15" + TagesZeit + ".BMP"; break;
case 801: return "15" + TagesZeit + ".BMP"; break;
case 802: return "16" + TagesZeit + ".BMP"; break;
case 803: return "16" + TagesZeit + ".BMP"; break;
case 804: return "18.BMP"; break;
default: return "13.BMP"; break;
}
}
String id2icon_dwd(String icon) {
//bool kein_icon;
if (icon.equals("clear-day")) {
return "15D.BMP";
}
if (icon.equals("clear-night")) {
return "15N.BMP";
}
if (icon.equals("partly-cloudy-day")) {
return "16D.BMP";
}
if (icon.equals("partly-cloudy-night")) {
return "16N.BMP";
}
if (icon.equals("cloudy")) {
return "17.BMP";
}
if (icon.equals("fog")) {
return "12.BMP";
}
if (icon.equals("wind")) {
return "14.BMP";
}
if (icon.equals("sleet")) {
return "3.BMP";
}
if (icon.equals("rain")) {
return "6.BMP";
}
if (icon.equals("snow")) {
return "9.BMP";
}
if (icon.equals("hail")) {
return "10.BMP";
}
if (icon.equals("thunderstorm")) {
return "1.BMP";
}
return "13.BMP";
}
String Wochentag(unsigned long t) {
switch ((((t + 7200) / 86400) + 4) % 7) {
case 0: return "Sonntag"; break;
case 1: return "Montag"; break;
case 2: return "Dienstag"; break;
case 3: return "Mittwoch"; break;
case 4: return "Donnerstag"; break;
case 5: return "Freitag"; break;
case 6: return "Samstag"; break;
default: return "Wochentag"; break;
}
}
String Stunde(unsigned long t) {
return String((((t + 7200) / 3600) ) % 24) += ":00 Uhr";
}
void zeichne_Gitter() {
//wagerecht
epd_draw_line(0, 0, 799, 0);
epd_draw_line(0, 135, 799, 135);
epd_draw_line(0, 167, 799, 167);
epd_draw_line(0, 199, 799, 199);
epd_draw_line(0, 335, 799, 335);
epd_draw_line(0, 367, 799, 367);
epd_draw_line(0, 399, 799, 399);
epd_draw_line(0, 535, 799, 535);
epd_draw_line(0, 567, 799, 567);
epd_draw_line(0, 599, 799, 599);
//Senkrecht
epd_draw_line(0, 0, 0, 599);
epd_draw_line(199, 0, 199, 599);
epd_draw_line(399, 0, 399, 599);
epd_draw_line(599, 0, 599, 599);
epd_draw_line(799, 0, 799, 599);
//kleine Teilstriche wagerecht
epd_draw_line(599, 431, 799, 431 );
epd_draw_line(599, 463 , 799, 463);
epd_draw_line(599, 495 , 799, 495);
epd_draw_line(599, 499 , 799, 499);
epd_draw_line(599, 503 , 799, 503);
}
I think most of this code does not matter, I thing the issue should have to do with the server code or the reading function in the main station code called "hole_Feuchtigkeit":
String hole_Feuchtigkeit(IPAddress IP) {
String Ausgabe = "--";
if (client.connect(IP, 80)) {
client.println("GET ");
client.println("Host: " + String(IP));
client.println("Connection: close");
client.println();
delay(100);
Ausgabe = client.readString(); //lies response in String
delay(100);
//Luftfeuchtigkeit: 58% Temperatur: 23 Grad
if (debug) {
Serial.println("ganze Antowort Arduino");
Serial.println(Ausgabe);
}
int ende_luft = Ausgabe.indexOf(" Grad") + 1;
int start_luft = ende_luft - 3;
int ende_temp = Ausgabe.indexOf("%") + 1;
int start_temp = ende_temp - 3;
Ausgabe = Ausgabe.substring(start_luft, ende_luft) + "C " + Ausgabe.substring(start_temp, ende_temp);
return Ausgabe;
}
else {
return Ausgabe;
}
}
Interesting is, that I get "C " as output, so it seems, that I can connect to the server, because in the other case I would get "--" as output, but I do not get the values anymore...
Thanks in advance for any tip,
Lukas