Mam taki czeski błąd w programie, który przechodzi przez kompilator adruino, a wywalał się dopiero na etapie platformy esp32.
Otóż dziwnym zbiegiem okoliczności kiedy w programie użyłem takiej konstrukcji funkcji:
String blabla(){
Serial.println("blabla..");
return "ok";
}
blabla();
otrzymywałem błąd i urządzenie robiło restart.
guru Meditation Error: Core 1 panic'ed (LoadProhibited). Exception was unhandled.
Core 1 register dump:
PC : 0x4012b31e PS : 0x00060433 A0 : 0x8012b450 A1 : 0x3ffb1e10
A2 : 0x00be7372 A3 : 0x00000003 A4 : 0x3ffbbd0c A5 : 0x00000003
A6 : 0x3ffbbcbc A7 : 0x00000000 A8 : 0x00be7372 A9 : 0x3ffb1de0
A10 : 0x00000001 A11 : 0x3ffb8058 A12 : 0x00000001 A13 : 0x00000001
A14 : 0x00060420 A15 : 0x00000000 SAR : 0x00000018 EXCCAUSE: 0x0000001c
EXCVADDR: 0x00be7372 LBEG : 0x4000c2e0 LEND : 0x4000c2f6 LCOUNT : 0xffffffff
Długo szukałem zanim przypadkiem odkryłem o co chodzi. Stwierdziłem, że w zasadzie skoro ta funkcja coś zwraca to powinienem swoją drogą przypisać wynik to jakieś zmiennej.
Wystarczyło dopisać kod w następujący sposób i procesor się już nie zawieszał.
String blavalue = blabla();
Ktoś mi to wyjaśni? Czy nie przypisując wyniku popełniłem błąd?
Cały kod wygląda tak:
#include <WiFi.h>
#include <WiFiClient.h>
#include <ESP32WebServer.h>
#include <ESPmDNS.h>
#define SDA1 23
#define SCL1 22
#include <Wire.h>
#include <I2C_EEPROM.h>
AT24C32<0x57> eep; // Das EEProm auf der china üblichen RTC3231
const char *ssid = "smartyAPek";
const char *password = "sdfasdfsdf";
ESP32WebServer server(80);
int app = 0;
String wynik;
struct MySetingsTab {
char struct_start[10];
char wifi_ssid[64];
char wifi_password[64];
int svrport;
int dhcp;
int ip_0;
int ip_1;
int ip_2;
int ip_3;
int nm_0;
int nm_1;
int nm_2;
int nm_3;
int gw_0;
int gw_1;
int gw_2;
int gw_3;
int dns_p0;
int dns_p1;
int dns_p2;
int dns_p3;
int dns_s0;
int dns_s1;
int dns_s2;
int dns_s3;
char system_login[64];
char system_password[64];
// setings for sleep mode option - work if this option is active
int active_time;
int sleep_time;
// setings for remote raporting sensor values
int remote_raporting;
int frequency_sec;
char remote_url[64];
char struct_end[10];
} mysetingstab, setingsfromdb;
//test funkcji string
String blabla(){
Serial.println("blabla..");
return "ok";
}
void handleRoot() {
server.send(200, "text/plain", "hello from ESP32!");
}
void handleNotFound(){
String message = "File Not Found\n\n";
message += "URI: ";
message += server.uri();
message += "\nMethod: ";
message += (server.method() == HTTP_GET)?"GET":"POST";
message += "\nArguments: ";
message += server.args();
message += "\n";
for (uint8_t i=0; i<server.args(); i++){
message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
}
server.send(404, "text/plain", message);
}
String WifiClientMode(char wfssid[], char wfpassword[]) {
Serial.println("try connect to wifi network");
Serial.print("wifi network ssid: ");
Serial.print("'");
Serial.print(wfssid);
Serial.println("'");
Serial.print("wifi network pass: ");
Serial.print("'");
Serial.print(wfpassword);
Serial.println("'");
WiFi.begin( wfssid, wfpassword);
// Wait for connection
int wait_time = 0;
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to ");
Serial.println( wfssid);
Serial.println( wfpassword);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
delay(10000);
Serial.println("end wifi procedure starting");
}
void setup(void){
Serial.begin(9600);
delay(1000);
Serial.println("esp starts ");
delay(1000);
Serial.println("wire begin");
// wire begin mode sda pin / scl pin // speed
Wire.begin(SDA1,SCL1,100000); // piny dla esp32
delay(2000);
Serial.println("check db ");
//GetSetingsfromdb();
if(eep.ready()){
Serial.println("Epprom ready...");
}
delay(2000);
String blavalue = blabla();
// Serial.println(dupa);
strcpy(mysetingstab.wifi_ssid ,"privnet");
strcpy(mysetingstab.wifi_password ,"987sdfsd");
if (strcmp(mysetingstab.wifi_ssid, ssid) != 0) {
Serial.println("Try run Network run in WIFI_CLIENT_STA mode: ");
WifiClientMode(mysetingstab.wifi_ssid, mysetingstab.wifi_password);
Serial.println("Network run in WIFI_CLIENT_STA mode: ");
//WiFi.printDiag(Serial);
delay(5000);
}
if (MDNS.begin("esp32")) {
Serial.println("MDNS responder started");
}
server.on("/", handleRoot);
server.on("/inline", [](){
server.send(200, "text/plain", "this works as well");
});
server.onNotFound(handleNotFound);
server.begin();
Serial.println("HTTP server started");
}
void loop(void){
server.handleClient();
}