I want to show some digits in a 3x3 p10 red led pannel where the number will come from the cloud and the number keeps updating. For this I have used esp8266 based Nodemcu. I have used WiFi Manager library and DMD2 library for this and I am requesting the server every 5 seconds to get the number in response. Everything is working fine but it keeps restarting after some time and there is no fixed timing for this but it keeps restarting. It provides a message that "reset cause 4 boot mode(3,6)" wdt reset... I have tried different hardware and esp board version but nothing is working. I am currently using arduino 1.8.9 and esp8266 board version 2.5.2
please look into my code and suggest me what is wrong....
#include <Arduino.h>
#include <WiFiManager.h>
#include <math.h>
#include <WiFiClient.h>
#include <ESP8266HTTPClient.h>
#include <EEPROM.h>
#include <ESP8266WiFi.h>
WiFiManager wifiManager; int countT;
HTTPClient http; String svrHost = ""; unsigned int svrPort = 80; String svrURL = "";
//DMD #include <SPI.h> #include <DMD2.h> #include <fonts/Arial_Black_16.h> #include <fonts/Droid_Sans_36.h> #include <fonts/Droid_Sans_12.h> #include <fonts/Arial_New_56.h> //#include <fonts/Dmd13x20ClockX.h> //DMD PIN #define pin_A 16 #define pin_B 12 #define pin_sclk 0 #define pin_clk 14 #define pin_r 13 #define pin_noe 15
int respin = D2; int btnstt = 0;
int wlcmgs = 1; String ssid;
String dmdText = "0"; SPIDMD dmd(3, 3, pin_noe, pin_A, pin_B, pin_sclk); // Number of P10 panels used X, Y //DMD_TextBox box(dmd,0,0,32,5); // Set Box (dmd, x, y, Height, Width)
//const char *MESSAGE = "iTrack LIVE InWard";
void setup(){ Serial.begin(115200); EEPROM.begin(512); pinMode(respin, INPUT);
//Reset Val
String doResetWifi = "0";
doResetWifi = readESP(257,1);
if(doResetWifi == "1"){
writeESP(257,1,"0");
wifiManager.resetSettings();
}
Serial.println("\nReset Val "+doResetWifi);
//wifiManager.resetSettings();
countT = 0;
wifiManager.autoConnect("LED-1");
Serial.println("connected...yeey :)");
//Read/Write EPROM
if(wifiManager.svrURL != ""){
svrHost = wifiManager.svrHost;
svrPort = wifiManager.svrPort;
svrURL = wifiManager.svrURL;
//HOST
writeESP(0,50,svrHost);
//PORT
writeESP(51,5,String(svrPort));
//URL
writeESP(56,200,svrURL);
}else{
//HOST
svrHost = readESP(0,50);
//PORT
svrPort = readESP(51,25).toInt();
//URL
svrURL = readESP(56,200);
}
//DMD Setup
dmd.setBrightness(255); // Set brightness 0 - 255
//dmd.selectFont(Droid_Sans_36); // Font used
dmd.begin(); // Start DMD
}
void loop(){
btnstt = digitalRead(respin);
if (btnstt == 1){ flashESP(); ESP.reset(); } doRequest();
//box.print(dmdText);
if(wlcmgs==1){ dmd.selectFont(Droid_Sans_12); dmd.drawString(0,0,"Connected"); delay(5000); dmd.clearScreen(); //scrlssid(); delay(5000); wlcmgs=0; }
dmd.clearScreen(); dmd.selectFont(Arial_New_56); int padingTop = 2;
dmd.drawString(round((96 - (dmdText.length() * 24)) / 2), padingTop, dmdText);
delay(1000 * 5);
//dmd.selectFont(Arial_Black_16); //scrtxt(); }
void doRequest(){
Serial.print("[HTTP] begin: "+svrHost+" "+svrPort+" "+svrURL+"\n");
String response;
if (httpRequest(svrHost, svrPort, String("GET /") + svrURL, "", response)) {
if (response.length() != 0) {
response.trim();
dmdText = response;
Serial.println(response);
Serial.println(countT);
countT++;
}
}
}
bool httpRequest(const String svrHOST, unsigned int svrPORT, const String& method, const String& request, String& response) { WiFiClient client;
if (client.connect(svrHOST, svrPORT)) {
Serial.println("HTTP Connected");
} else {
Serial.println("failed");
return false;
}
client.print(method);
client.println(F(" HTTP/1.1"));
client.print(F("Host: "));
client.println(svrHOST);
client.println(F("Connection: close"));
if (request.length()) {
client.println(F("Content-Type: application/json"));
client.print(F("Content-Length: "));
client.println(request.length());
client.println();
client.print(request);
} else {
client.println();
}
//Serial.println("Waiting response");
int timeout = millis() + 5000;
while (client.available() == 0) {
if (timeout - millis() < 0) {
Serial.println(">>> Client Timeout !");
client.stop();
return false;
}
}
//Serial.println("Reading response");
int contentLength = -1;
while (client.available()) {
String line = client.readStringUntil('\n');
line.trim();
line.toLowerCase();
if (line.startsWith("content-length:")) {
contentLength = line.substring(line.lastIndexOf(':') + 1).toInt();
} else if (line.length() == 0) {
break;
}
}
//Serial.println("Reading response body");
response = "";
response.reserve(contentLength + 1);
while (response.length() < contentLength && client.connected()) {
while (client.available()) {
char c = client.read();
response += c;
}
}
client.stop();
return true;
}
void writeESP(int start, int len, String text){
EEPROM.begin(512);
int ind;
for(ind = 0; ind < len; ind++){
EEPROM.write(ind+start,text[ind]);
}
EEPROM.write(ind+start+text.length(),'\0');
EEPROM.commit();
EEPROM.end(); }
String readESP(int start, int len){ EEPROM.begin(512); char dataS[len]; int ind; for(ind = 0; ind < len; ind++){ if(EEPROM.read(ind+start) != '\0'){ dataS[ind] = EEPROM.read(ind+start); }else{ break; } } dataS[ind]='\0'; EEPROM.end(); return String(dataS); }
void flashESP(){ Serial.print("\nResetting ESP\n"); writeESP(257,1,"1"); ESP.reset(); delay(2000); }
/* void scrtxt(){ const char *next = MESSAGE; while(*next) { Serial.print(*next); box.print(*next); delay(200); next++; } } / / void scrlssid(){ dmd.drawString(5,0,"Connected With"); DMD_TextBox box(dmd,0,20,96,16); ssid = WiFi.SSID(); const char *ssidNext= ssid.c_str(); int len = 0; while(ssidNext && len < ssid.length()){ Serial.print(*ssidNext); box.print(*ssidNext); delay(200); ssidNext++; len++; } } */
yield()
so that the IP stack can do its work.