ich habe ein Problem, dass nach einer Weile das Wemos ESP8266 nicht mehr auf eine Anfrage reagiert. Ich bin absoluter Neuling hier im Forum und hoffe, dass ich meine Anfrage richtig platziere.
Es wird zyklisch alle 10 Sekunden das Wemos angesprochen und über WLAN die Werte eines über serielle Schnittstelle angeschlossenen Gerätes gelesen. Nun habe ich ein Watchdog implementiert, um einen Reset durchzuführen, wenn das Auslesen nach 60s nicht erfolgt. Das funktioniert auch soweit, jedoch möchte ich wissen, ob in meinem Code ein Fehler ist, dass das Wemos nicht mehr antwortet. (ganz nebenbei wird auch der hostname des Wemos nicht angezeigt, vielleicht hat da auch jemand eine Idee.
Danke für die Hilfe.
Code:
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
#include <SoftwareSerial.h>
// ******************************************** Definitions *****************************************
#define LVTRX D6
#define LVTTX D7
#define PControl D2
SoftwareSerial LVTserial(LVTRX,LVTTX); // RX | TX
#define PTransmit 1
#define PReceive 0
#define IPxx 7 // ******* definition for IP-Address ******************
IPAddress ip(192, 168, 101, IPxx); // ************** fix IP-Adress ***********************
IPAddress gateway(192, 168, 101, 1);
IPAddress subnet(255, 255, 255, 0);
ESP8266WebServer server(80); // *************** TCP/IP Port Browser ****************
char HOSTNAME[15];
const char* ssid = "MyNetwork";
const char* password = "1234";
char P_buffer[15];
char P_val[10];
char P_wlan[10];
char P_old[10];
const int led = 13;
unsigned long old_time;
unsigned long new_time;
unsigned long lwdTime = 0;
// ********************************** calculate elapsed time ****************************************
unsigned long elapsed_time(unsigned long start_time_ms)
{
return millis() - start_time_ms;
}
// ********************************** root handle ***************************************************
void handleRoot() {
char sendstring[48];
lwdTime = millis(); // feed loop watchdog (restart timeout timer)
ESP.wdtFeed();
sprintf(sendstring, "%s", P_wlan);
server.send(200, "text/plain", sendstring);
Serial.print("o"); // PRINT o DATA SUCCESSFUL READ
strcpy(P_wlan, "999.8"); // test value after send, should be overwritten because data had been sent !!!
}
// ********************************** handle exception **********************************************
void handleNotFound(){
digitalWrite(led, 1);
String message = "File Not Found\n\n";
message += "URI: ";
message += server.uri();
message += "\nMethod: ";
message += (server.method() == HTTP_GET)?"GET":"POST";
message += "\nArguments: ";
message += server.args();
message += "\n";
for (uint8_t i=0; i<server.args(); i++){
message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
}
server.send(404, "text/plain", message);
digitalWrite(led, 0);
}
// ********************************** setup *********************************************************
void setup(void){
ESP.wdtDisable();
pinMode(led, OUTPUT);
digitalWrite(led, 0);
pinMode(LVTTX, OUTPUT);
pinMode(LVTRX, INPUT);
pinMode(PControl, OUTPUT); // CS RS485
digitalWrite(PControl, 1);
Serial.begin(115200);
Serial.print("Startup");
// ///////////// Init WiFi /////////////////////
WifiStart();
// /////////////////////////////////////////////
// init serial measurement
LVTserial.begin(9600); // init LVT - Baudrate
digitalWrite(PControl, PTransmit);
LVTserial.write( "#00\r" );
digitalWrite(PControl, PReceive);
}
void WifiStart()
{
char ipnum[3];
itoa(IPxx, ipnum, 10); // IPxx is converted to string into ipnum-buffer
strcpy (HOSTNAME, "power");
strcat (HOSTNAME, ipnum);
wifi_station_set_hostname(HOSTNAME);
WiFi.hostname(HOSTNAME); // why is there no hostname ???
WiFi.mode(WIFI_AP_STA);
IPAddress dns(192, 168, 101, 1);
WiFi.config(ip, dns, gateway, subnet);
WiFi.begin(ssid, password);
Serial.println("WAIT FOR CONNECTION");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
if (MDNS.begin(HOSTNAME)) {
Serial.println("MDNS responder started");
}
wifi_station_set_hostname(HOSTNAME); // why is there no hostname ???
strcpy(P_wlan, "999.8"); // init value !!!
server.onNotFound(handleNotFound);
server.begin();
Serial.println("HTTP server started");
old_time = millis();
lwdTime = millis();
}
// ********************************************** RESET *******************************************
void (*Reset_A)(void) = 0;
// ********************************************** main loop ******************************************
void loop(void){
new_time = millis();
int RD_INTERVAL = 2000;
unsigned long LWD_RST = 60*1000; // for reboot watchdog timeout in ms
char holdbuf[10];
String P_string;
// initiate read of a new value when time is elapsed /////
if ((new_time - old_time) > RD_INTERVAL){
old_time = new_time;
strcpy(P_old,P_wlan); // save correct value
strcpy(P_val, "");
Serial.print("."); // *** for test
digitalWrite(PControl, PTransmit);
LVTserial.write( "#00\r" );
digitalWrite(PControl, PReceive);
}
if ( LVTserial.available() ) { // test if serial data arrived
while ( LVTserial.available()){
Serial.print("*"); // PRINT * SERIAL READ OF LVT RESPONSE WITH DATA
P_string = LVTserial.readString();
}
int str_len = P_string.length() + 1; // store value in buffer and print out
P_string.toCharArray(holdbuf,str_len); // copy p_string into P_wlan buffer
strncpy(P_wlan, &holdbuf[3],5);
Serial.print(P_wlan); // print value
}
server.handleClient(); // wifi handle
// watchdog if more than LWD_RST-Time elapsed without wireless reading of value ///////////////////
if (elapsed_time(lwdTime) > LWD_RST)
{
// restart by watchdog
Serial.print("WDT");
delay(300);
lwdTime = millis(); // feed loop watchdog (restart timeout timer)
Reset_A(); // ESP.restart();
}
}