I have a simple code where ESP8266 is asking MySQL database about actual state of LED (whether 1 or 0) and when DB has 1 ESP8266 turns LED on... But my problem is after 65-66 seconds of server running is still resetting... The program does what it is supposed to do, but after 65-66 seconds resets and trying to reconnecting to wifi
---- EDIT -----
After some experiments with code I have found, it doesn't matter the running time but, number of loop cycles... Every time no matter on delay or processing speed, it crash after 48 cycles....
.ino code
// Load Wi-Fi library
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266HTTPClient.h>
// Replace with your network credentials
const char* ssid = "XXXX";
const char* password = "XXXX";
const char* host = "http://www.XXXX.XX/arduino_PHP/post_data.php";
// Set web server port number to 80
WiFiServer server(80);
HTTPClient http;
// Variable to store the HTTP request
String header;
// Auxiliar variables to store the current output state
String output5State = "off";
String output4State = "off";
// Assign output variables to GPIO pins
const int output5 = 5;
const int output4 = 4;
byte green, red= 0;
void setup() {
Serial.begin(115200);
// Initialize the output variables as outputs
WiFi.mode(WIFI_OFF); //Prevents reconnection issue (taking too long to connect)
WiFi.mode(WIFI_STA); //This line hides the viewing of ESP as wifi hotspot
delay(1000);
pinMode(output5, OUTPUT);
pinMode(output4, OUTPUT);
// Set outputs to LOW
digitalWrite(output5, LOW);
digitalWrite(output4, LOW);
// Connect to Wi-Fi network with SSID and password
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
// Print local IP address and start web server
Serial.println("");
Serial.println("WiFi connected.");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
server.begin();
}
void loop(){
delay(500);
DB_state("Green",green);
DB_state("Red",red);
delay(500);
}
void DB_state(String component,int state){
String postData =("component=" + String(component) + "&state=" + String(state));
Serial.println(postData);
http.begin("http://www.XXXX.XX/arduino_PHP/DB_state.php");
http.addHeader("Content-Type", "application/x-www-form-urlencoded");
http.POST(postData); //Send the request
String payload = http.getString(); //Get the response payload
Serial.println(payload);
http.end(); //Close connection
state_LED(payload,component);
}
void state_LED(String str, String led){
int x;
if (led== "Green") {
x = 4;}
else if (led== "Red") {
x = 5;}
if (str == "State: 1") {
digitalWrite(x, HIGH);}
else if (str == "State: 0") {
digitalWrite(x, LOW);}
}
ESP8266 Stack debug
Exception 28: LoadProhibited: A load referenced a page mapped with an attribute that does not permit loads
PC: 0x4020744a: ClientContext::state() const at C:\Users\XXXX\AppData\Local\Arduino15\packages\esp8266\hardware\esp82662円.7.4\libraries\ESP8266WiFi\src/include/ClientContext.h line 364
EXCVADDR: 0x00000184
Decoding stack results
0x40203f10: HardwareSerial::write(unsigned char const*, unsigned int) at C:\Users\XXXX\AppData\Local\Arduino15\packages\esp8266\hardware\esp82662円.7.4\cores\esp8266/HardwareSerial.h line 164
0x40203f1c: HardwareSerial::write(unsigned char const*, unsigned int) at C:\Users\XXXX\AppData\Local\Arduino15\packages\esp8266\hardware\esp82662円.7.4\cores\esp8266/HardwareSerial.h line 165
0x40207512: HTTPClient::connected() at C:\Users\XXXX\AppData\Local\Arduino15\packages\esp8266\hardware\esp82662円.7.4\libraries\ESP8266HTTPClient\src\ESP8266HTTPClient.cpp line 475
0x40202d24: HTTPClient::disconnect(bool) at C:\Users\XXXX\AppData\Local\Arduino15\packages\esp8266\hardware\esp82662円.7.4\libraries\ESP8266HTTPClient\src\ESP8266HTTPClient.cpp line 434
0x40203ac8: HTTPClient::end() at C:\Users\XXXX\AppData\Local\Arduino15\packages\esp8266\hardware\esp82662円.7.4\libraries\ESP8266HTTPClient\src\ESP8266HTTPClient.cpp line 425
0x402012ba: DB_State(String, int) at C:\Users\XXXX\Documents\Arduino\ESP8266_php_DB_control/ESP8266_php_DB_control.ino line 87
0x40201334: loop() at C:\Users\XXXX\Documents\Arduino\ESP8266_php_DB_control/ESP8266_php_DB_control.ino line 73
0x40100175: esp_schedule() at C:\Users\XXXX\AppData\Local\Arduino15\packages\esp8266\hardware\esp82662円.7.4\cores\esp8266\core_esp8266_main.cpp line 125
0x40205628: loop_wrapper() at C:\Users\XXXX\AppData\Local\Arduino15\packages\esp8266\hardware\esp82662円.7.4\cores\esp8266\core_esp8266_main.cpp line 197
Thanks for any advice
1 Answer 1
I don't know how, but finally I have found working solution... I have add HTTPClient http;
at top of function and it works...
void DB_state(String component,int state){
HTTPClient http; // THIS IS ADDED
String postData =("component=" + String(component) + "&state=" + String(state));
Serial.println(postData);
http.begin("http://www.XXXX.XX/arduino_PHP/DB_state.php");
http.addHeader("Content-Type", "application/x-www-form-urlencoded");
http.POST(postData); //Send the request
String payload = http.getString(); //Get the response payload
Serial.println(payload);
http.end(); //Close connection
state_LED(payload,component);
}
Can anyone explain me how it's possible? Because I don't fully understand this procedure.
-
You now construct and destruct the
HTTPClient
object in that scope each time, as C++ specifies. Presumably the global one leaks some sort of resource, but I can only speculate on that front.nanofarad– nanofarad2020年10月11日 17:20:46 +00:00Commented Oct 11, 2020 at 17:20 -
Sorry, i don't understand. Could you be more simlier?Sahasrar– Sahasrar2020年10月12日 07:35:09 +00:00Commented Oct 12, 2020 at 7:35
-
I can't break this down any further in the space provided to me by a comment. I suggest taking a tutorial on C++ that covers objects, constructors, destructors, and such, which will provide this info in a far cleaner way. But basically, instead of having one HTTPClient for the lifetime of the program, you create a new HTTPClient and clean it up after each request -- This makes sense intuitively, but I don't know the internals of HTTPClient enough to know why it happens to eventually crash if you reuse the same instance over and over again.nanofarad– nanofarad2020年10月12日 13:59:45 +00:00Commented Oct 12, 2020 at 13:59
-
github.com/esp8266/Arduino/issues/7613#issuecomment-7007820512020年10月13日 19:42:20 +00:00Commented Oct 13, 2020 at 19:42
WiFiServer
andHTTPClient
, use your web search skills on the detailed error message of "exception 28", and so on. Check your findings and assumptions with test programs; for example, callhttp.POST()
twice inDB_state()
and count the numbers of loops.