3

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\esp8266\2.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\esp8266\2.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\esp8266\2.7.4\cores\esp8266/HardwareSerial.h line 165 0x40207512: HTTPClient::connected() at C:\Users\XXXX\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.7.4\libraries\ESP8266HTTPClient\src\ESP8266HTTPClient.cpp line 475 0x40202d24: HTTPClient::disconnect(bool) at C:\Users\XXXX\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.7.4\libraries\ESP8266HTTPClient\src\ESP8266HTTPClient.cpp line 434 0x40203ac8: HTTPClient::end() at C:\Users\XXXX\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.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\esp8266\2.7.4\cores\esp8266\core_esp8266_main.cpp line 125 0x40205628: loop_wrapper() at C:\Users\XXXX\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.7.4\cores\esp8266\core_esp8266_main.cpp line 197

Thanks for any advice

Sahasrar
  • 161
  • 1
  • 8

1 Answers1

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.

Sahasrar
  • 161
  • 1
  • 8
  • 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 Oct 11 '20 at 17:20
  • Sorry, i don't understand. Could you be more simlier? – Sahasrar Oct 12 '20 at 07: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 Oct 12 '20 at 13:59
  • https://github.com/esp8266/Arduino/issues/7613#issuecomment-700782051 – Juraj Oct 13 '20 at 19:42