Bimo
Bimo

Reputation: 1

User exception (panic/abort/assert) Nodemcu

Nodemcu runs normally, a few seconds later an error appears so it always asks to restart. Even though the numbers appear on the website and serial print, the restart occurs after the text appears, then it slows down for a few seconds and the restart occurs?

Here is the error code that has been decoded

0x4020af5c: operator new (unsigned int) at /home/gonit/.arduino15/packages/esp8266 /hardware/esp8266/3.1.2/cores/esp8266/abi.cpp line 44

8x40208604: AsyncWebServer::on (char const*, unsigned char, std::function) at

/home/gonit/Arduino/libraries/ESPAsyncWebServer/src/WebServer.cpp line 149

0x40214208: std::_Function_handler >::_M_manager(std::_Any_data &, const std::_Any_data &, std::_Manager_operation) at /home/gonit/.arduino15/packages /esp8266/tools/xtensa-lx106-elf-gcc/3.1.0-gcc10.3-e5f9fec/xtensa-1x106-elf/include /c++/10.3.0/bits/std_function.h line 268

8x402011f8: std:: Function_handler >::_M_invoke(const std::_Any_data &, AsyncWebServerRequest *&&) at /home/gonit/.arduino15/packages/esp8266/tools/xtensa- 1x106-elf-gcc/3.1.0-gcc10.3-e5f9fec/xtensa-1x106-elf/include/c++/18.3.0 /bits/std_function.h line 289

0x4020a38d: String::operator= (char const*) at /home/gonit/. arduino15/packages /esp8266/hardware/esp8266/3.1.2/cores/esp8266/WString.cpp line 319

8x482027b2: Loop() at /home/gonit/.arduino15/packages/esp8266/tools/xtensa-lx106- elf-gcc/3.1.0-gcc10.3-e5f9fec/xtensa-lx106-elf/include/c++/10.3.0 /bits/std_function.h line 303

0x402142d4: std:: Function_handler >::_M_manager(std::_Any_data &, const std::_Any_data &, std::_Manager_operation) at /home/gonit/.arduino15/packages /esp8266/tools/xtensa-lx106-elf-gcc/3.1.0-gcc10.3-e5f9fec/xtensa-lx106-elf/include /c++/10.3.0/bits/std_function.h line 268

0x402011a0: std::_Function_handler >::_M_invoke(const std::_Any_data &, AsyncWebServerRequest *&&) at /home/gonit/.arduino15/packages/esp8266/tools/xtensa- 1x106-elf-gcc/3.1.0-gcc10.3-e5f9fec/xtensa-lx106-elf/include/c++/10.3.0 /bits/std_function.h line 289

8x40202a77: ESP8266WiFiAPClass::softAPConfig(IPAddress, IPAddress, IPAddress) at /home/gonit/.arduino15/packages/esp8266/hardware/esp8266/3.1.2/libraries /ESP8266WiFi/src/ESP8266WiFiAP.cpp line 259

8x4820b2f8: Loop_wrapper() at /home/gonit/.arduino15/packages/esp8266/hardware /esp8266/3.1.2/cores/esp8266/core_esp8266_main.cpp line 258

Code

// Import required libraries
#include <Arduino.h>
#ifdef ESP32
#include <WiFi.h>
#include <AsyncTCP.h>
#elif defined(ESP8266)
#include <ESP8266WiFi.h>
#include <ESPAsyncTCP.h>
#endif
#include <ESPAsyncWebServer.h>
#include <FS.h>
#include <ArduinoJson.h>

String temp = "";
String pressure = "";
int range;
String rain = "";
float lux;
String light = "";

/* Put your SSID & Password */
const char* ssid = "Weather Station";  // Enter SSID here
const char* password = "12345678";  //Enter Password here

/* Put IP Address details */
IPAddress local_ip (192,168,1,1);
IPAddress gateway(192,168,1,1);
IPAddress subnet(255,255,255,0);

// Create AsyncWebServer object on port 80
AsyncWebServer server(80);

String processor(const String& var){
  //Serial.println(var);
  if(var == "TEMP"){
    return temp;
  }
  else if(var == "PRESSURE"){
    return pressure;
  }
  else if(var == "RAIN"){
    return rain;
  }
    else if(var == "LIGHT"){
    return light;
  }
  return String();
}

void setup() {
  // Initialize Serial port
  Serial.begin(9600);
  while (!Serial) continue;

  if(SPIFFS.begin()==true) {
    Serial.println("SPIFFS initialised OK");
  }

  WiFi.softAP(ssid, password);
  WiFi.softAPConfig(local_ip, gateway, subnet);
  delay(100);
}

void loop() {
  const size_t capacity = JSON_OBJECT_SIZE(128);
  DynamicJsonDocument doc(capacity);
  
  DeserializationError error = deserializeJson(doc, Serial);
  if (error) {
    Serial.print(F("deserializeJson() failed: "));
    Serial.println(error.c_str());
    return;
  }
  
  //serializeJson(doc, Serial);

  Serial.print("SUHU UDARA:  ");
  temp = String(doc["temperature"]);
  Serial.print(temp);
  Serial.println(" *C");
  
  Serial.print("TEKANAN UDARA:  ");
  pressure = String(doc["pressure"]);
  Serial.print(pressure);
  Serial.println(" hPa");

  Serial.print("CURAH HUJAN:  ");
  range = doc["range"];
    switch (range){
    case 0:
      rain = "HUJAN";
    break;
    case 1:
      rain = "PERINGATAN HUJAN";
    break;
    case 2:
      rain = "TIDAK HUJAN";
    break;
  }
  Serial.println(rain);

  Serial.print("KECERAHAN:  ");
  lux = doc["lux"];
    if(lux < 100){
    light = "GELAP";
  }
  else if(lux > 100){
    light = "TERANG";
  }
  Serial.println(light);
  Serial.println("-----------------------------------------");

  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send(SPIFFS, "/index.html", "text/html");
  });

  server.on("/assets/css/foundation.css", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send(SPIFFS, "/assets/css/foundation.css", "text/css");
  });

  server.on("/assets/js/vendor.js", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send(SPIFFS, "/assets/js/vendor.js", "text/js");
  });

  server.on("/assets/js/foundation.js", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send(SPIFFS, "/assets/js/foundation.js", "text/js");
  });
  
  server.on("/temp", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/plain", temp.c_str());
  });
  server.on("/pressure", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/plain", pressure.c_str());
  });
  server.on("/rain", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/plain", rain.c_str());
  });
  server.on("/light", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/plain", light.c_str());
  });

  server.begin();
  //end
}

Upvotes: 0

Views: 515

Answers (1)

KIIV
KIIV

Reputation: 3739

As it's exception in the new that probably means you've run out of the memory.

You probably cannot use server.on() in the loop like this. Do that once in setup and use some callable functions that'll access the values. Maybe even check for atomics or mutexes to not do it in the middle of update

EDIT:

something like this might work (if it was working ever before):

void setup() {
  // Initialize Serial port
  Serial.begin(9600);
  while (!Serial) continue;

  if(SPIFFS.begin()==true) {
    Serial.println("SPIFFS initialised OK");
  }

  WiFi.softAP(ssid, password);
  WiFi.softAPConfig(local_ip, gateway, subnet);
  delay(100);

  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send(SPIFFS, "/index.html", "text/html");
  });

  server.on("/assets/css/foundation.css", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send(SPIFFS, "/assets/css/foundation.css", "text/css");
  });

  server.on("/assets/js/vendor.js", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send(SPIFFS, "/assets/js/vendor.js", "text/js");
  });

  server.on("/assets/js/foundation.js", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send(SPIFFS, "/assets/js/foundation.js", "text/js");
  });
  
  // you might need mutex or something inside following callbacks:
  server.on("/temp", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/plain", temp.c_str());
  });
  server.on("/pressure", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/plain", pressure.c_str());
  });
  server.on("/rain", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/plain", rain.c_str());
  });
  server.on("/light", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/plain", light.c_str());
  });

  server.begin();

}

void loop() {
  const size_t capacity = JSON_OBJECT_SIZE(128);
  DynamicJsonDocument doc(capacity);
  
  DeserializationError error = deserializeJson(doc, Serial);
  if (error) {
    Serial.print(F("deserializeJson() failed: "));
    Serial.println(error.c_str());
    return;
  }
  
  //serializeJson(doc, Serial);

  Serial.print("SUHU UDARA:  ");
  temp = String(doc["temperature"]);
  Serial.print(temp);
  Serial.println(" *C");
  
  Serial.print("TEKANAN UDARA:  ");
  pressure = String(doc["pressure"]);
  Serial.print(pressure);
  Serial.println(" hPa");

  Serial.print("CURAH HUJAN:  ");
  range = doc["range"];
    switch (range){
    case 0:
      rain = "HUJAN";
    break;
    case 1:
      rain = "PERINGATAN HUJAN";
    break;
    case 2:
      rain = "TIDAK HUJAN";
    break;
  }
  Serial.println(rain);

  Serial.print("KECERAHAN:  ");
  lux = doc["lux"];
    if(lux < 100){
    light = "GELAP";
  }
  else if(lux > 100){
    light = "TERANG";
  }
  Serial.println(light);
  Serial.println("-----------------------------------------");


  //end
}

Upvotes: 0

Related Questions