Chat freely about anything...

User avatar
By Pyrorider
#85319 I got a NodeMCU ESP8266 12F (I paid a 12e but idk) and tried to upload some code for my SDM120M meter to it, the upload finally worked, but (i deactivated the software wdt) the hardware wdt keeps resetting the ESP after around 8 to 12 seconds (I measured it). I post the code under this text, there are tons of ESP.wdtFeed() in it but it isnt working.
The error I get in the console: ets Jan 8 2013,rst cause:4, boot mode:(3,2)
Followed by standart load xyz stuff and some cryptic characters.

Code: Select all//sdm live page example by reaper7

#define READSDMEVERY  2000                                                      //read sdm every 2000ms
#define NBREG   5                                                               //number of sdm registers to read
#define USE_STATIC_IP

/*  WEMOS D1 Mini
                     ______________________________
                    |   L T L T L T L T L T L T    |
                    |                              |
                 RST|                             1|TX HSer
                  A0|                             3|RX HSer
                  D0|16                           5|D1
                  D5|14                           4|D2
                  D6|12                    10kPUP_0|D3
RX SSer/HSer swap D7|13                LED_10kPUP_2|D4
TX SSer/HSer swap D8|15                            |GND
                 3V3|__                            |5V
                       |                           |
                       |___________________________|
*/

#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <ESP8266mDNS.h>
#include <ArduinoOTA.h>

#include <ESPAsyncTCP.h>                                                        //https://github.com/me-no-dev/ESPAsyncTCP
#include <ESPAsyncWebServer.h>                                                  //https://github.com/me-no-dev/ESPAsyncWebServer

#include <SDM.h>                                                                //https://github.com/reaper7/SDM_Energy_Meter

#include "index_page.h"

#if !defined ( USE_HARDWARESERIAL )
  #error "This example works with Hardware Serial on esp8266, please uncomment #define USE_HARDWARESERIAL in SDM_Config_User.h"
#endif
//------------------------------------------------------------------------------
AsyncWebServer server(80);

SDM sdm(Serial, 2400, 7, SERIAL_8N1, false);                            //HARDWARE SERIAL

//------------------------------------------------------------------------------
String devicename = "PWRMETER";

#if defined ( USE_STATIC_IP )
IPAddress ip(192, 168, 178, 150);
IPAddress gateway(192, 168, 178, 1);
IPAddress subnet(255, 255, 255, 0);
#endif

const char* wifi_ssid = "WLan-Kabel";
const char* wifi_password = "xxxxxxxx";

String lastresetreason = "";

unsigned long readtime;
//------------------------------------------------------------------------------
typedef volatile struct {
  volatile float regvalarr;
  const uint16_t regarr;
} sdm_struct;

volatile sdm_struct sdmarr[NBREG] = {
  {0.00, SDM120C_VOLTAGE},                                                      //V
  {0.00, SDM120C_CURRENT},                                                      //A
  {0.00, SDM120C_POWER},                                                        //W
  {0.00, SDM120C_POWER_FACTOR},                                                 //PF
  {0.00, SDM120C_FREQUENCY},                                                    //Hz
};
//------------------------------------------------------------------------------
void xmlrequest(AsyncWebServerRequest *request) {
  String XML = F("<?xml version='1.0'?><xml>");
  for (int i = 0; i < NBREG; i++) {
    XML += "<response" + (String)i + ">";
    XML += String(sdmarr[i].regvalarr,2);
    XML += "</response" + (String)i + ">";
    ESP.wdtFeed();
  }
  ESP.wdtFeed();
  XML += F("<freeh>");
  XML += String(ESP.getFreeHeap());
  XML += F("</freeh>");
  XML += F("<rst>");
  XML += lastresetreason;
  XML += F("</rst>");
  XML += F("</xml>");
  ESP.wdtFeed();
  request->send(200, "text/xml", XML);
}
//------------------------------------------------------------------------------
void indexrequest(AsyncWebServerRequest *request) {
  request->send_P(200, "text/html", index_page);
  ESP.wdtFeed();
}
//------------------------------------------------------------------------------
void ledOn() {
  digitalWrite(LED_BUILTIN, LOW);
}
//------------------------------------------------------------------------------
void ledOff() {
  digitalWrite(LED_BUILTIN, HIGH);
}
//------------------------------------------------------------------------------
void ledSwap() {
  digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
}
//------------------------------------------------------------------------------
void otaInit() {
  ArduinoOTA.setHostname(devicename.c_str());
  ESP.wdtFeed();
  ArduinoOTA.onStart([]() {
    ledOn();
  });
  ESP.wdtFeed();
  ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
    ledSwap();
  });
  ESP.wdtFeed();
  ArduinoOTA.onEnd([]() {
    ledOff();
  });
  ESP.wdtFeed();
  ArduinoOTA.onError([](ota_error_t error) {
    ledOff();
  });
  ESP.wdtFeed();
  ArduinoOTA.begin();
  ESP.wdtFeed();
}
//------------------------------------------------------------------------------
void serverInit() {
  server.on("/", HTTP_GET, indexrequest);
  ESP.wdtFeed();
  server.on("/xml", HTTP_PUT, xmlrequest);
  ESP.wdtFeed();
  server.onNotFound([](AsyncWebServerRequest *request){
    request->send(404);
    ESP.wdtFeed();
  });
  server.begin();
  ESP.wdtFeed();
}
//------------------------------------------------------------------------------
static void wifiInit() {
  WiFi.persistent(false); // Do not write new connections to FLASH
  ESP.wdtFeed();
  WiFi.mode(WIFI_STA);
#if defined ( USE_STATIC_IP )
  WiFi.config(ip, gateway, subnet);                                             // Set fixed IP Address
#endif
  ESP.wdtFeed();
  WiFi.begin(wifi_ssid, wifi_password);
  ESP.wdtFeed();
  while( WiFi.status() != WL_CONNECTED ) {                                      //  Wait for WiFi connection
    ledSwap();
    ESP.wdtFeed();
    delay(100);
  }
}
//------------------------------------------------------------------------------
void sdmRead() {
  float tmpval = NAN;

  for (uint8_t i = 0; i < NBREG; i++) {
    tmpval = sdm.readVal(sdmarr[i].regarr);
    ESP.wdtFeed();
    if (isnan(tmpval))
      sdmarr[i].regvalarr = 0.00;
    else
      sdmarr[i].regvalarr = tmpval;

    ESP.wdtFeed();
  }
}
//------------------------------------------------------------------------------
void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  ledOn();
  ESP.wdtFeed();
  lastresetreason = ESP.getResetReason();
  ESP.wdtFeed();
  otaInit();
  ESP.wdtFeed();
  serverInit();
  ESP.wdtFeed();
  sdm.begin();
  ESP.wdtFeed();
  readtime = millis();
  ESP.wdtFeed();
  ledOff();
}
//------------------------------------------------------------------------------
void loop() {
  ArduinoOTA.handle();
  ESP.wdtFeed();
  if (millis() - readtime >= READSDMEVERY) {
    ESP.wdtFeed();
    sdmRead();
    readtime = millis();
  }
  ESP.wdtFeed();
}