How to eliminate ESP8266 WIFI drop-outs
Just when it seemed like the ESP8266 was operating rock-solid, indeed running continuously for days now without resetting, or worse, fatally crashing, a sign that something was wrong appeared…
Out of the corner of my eye, a flash of light seemed to originate from the up ’till now reliably running ESP8266 based circuit. As my gaze turned directly towards the module, the blue LED started flashing. Not just once, but several times with a silent couple of seconds between illuminations…
“Uh-Ohh”, I thought, “looks like the ESP8266 is once again in a reset loop!” First thing to check was the ESP8266 web server response to a http GET request. The server did respond with a JSON string, just like it was programmed to do. And much to my surprise, the status (seconds running since last reset), indicated the module had been continuously running for days.
So why the flashing blue LED?
I noticed that sending a http GET request around the time the flashing occurs required considerable time (up to 10 seconds) before the ESP8266 returned a JSON response string. This could only mean one thing…
A WIFI Connectivity Check and Recover is Essential
The application firmware had detected a loss in WIFI connectivity and was attempting to reconnect. I had added a WIFI check to the top of the Arduino IDE loop() function. It never seemed to detect a loss of WIFI. That is, until now…
While the following code was developed using the Arduino IDE, the same check should be included for the SDK or NodeMCU code as well.
//connect wifi if not connected if (WiFi.status() != WL_CONNECTED) { delay(1); startWIFI(); return; }
So the setup() function initially establishes the WIFI conection with a call to startWIFI(). The WIFI status is subsequently checked each iteration of the loop() to maintain the connection.
Fortunately, I had included some status messages in the startWIFI() function sent out the serial port just in case some troubleshooting was needed. This came in handy to confirm the root cause of the flashing blue LED.
void startWIFI(void) { //set IP if not correct IPAddress ip = WiFi.localIP(); if( ip!= ipadd) { WiFi.config(ipadd, ipgat, ipsub); //dsa added 12.04.2015 Serial.println(); delay(10); Serial.print("ESP8266 IP:"); delay(10); Serial.println(ip); delay(10); Serial.print("Fixed IP:"); delay(10); Serial.println(ipadd); delay(10); Serial.print("IP now set to: "); delay(10); Serial.println(WiFi.localIP()); delay(10); } // Connect to WiFi network Serial.println(); delay(10); Serial.println(); delay(10); Serial.print("Connecting to "); delay(10); Serial.println(ssid); delay(10); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { Serial.print("."); delay(500); } Serial.println(""); Serial.println("WiFi connected"); // Start the server server.begin(); Serial.println("Server started"); // Print the IP address Serial.print("ESP8266 IP: "); Serial.println(WiFi.localIP()); // Print the server port Serial.print("ESP8266 WebServer Port: "); Serial.println(SVRPORT); delay(300); }
As I mentioned, the my ESP8266 web server returns status, along with sensor readings in a JSON string upon receiving http GET request. This data is logged to a mySQL database, once every hour. A CRON php script pulls the ESP8266 data and saves it to the database.
The next step
In order to assess how frequent WIFI connectivity is lost and restarted, I am going to add a static counter to my startWIFI() function. This will identify the number of times the WifFi connection was lost and reestablished since the last reset. That value will be recorded to mySQL along with the other values. It will be interesting to see how often this occurs. Once a day? Several times per hour? We shall see…
If you have had any issues maintaining WIFI connectivity, or your server stops responding to request, consider this as a solution.
I hope you find this information useful…
Update: July 5, 2015
The ESP8266 supporting my weather sensor webserver did reset 23 days ago. I took that opportunity to add a static counter to the startWIFI() function. A ThingSpeak channel has also been established to share the live results publicly. As of this update, the Wifi connectivity was lost 537 times.
Recovery was successful every time as no ESP resets have occurred yet.
This empirical data shows the Wifi connectivity is lost on average 23 times per day.