Программировать ESP8266, чтобы избежать случайных исключений?

Ниже приведен код, который я сделал на Lolin Wemos D1 R2 и mini. Он работает нормально, но каждый раз выдает исключения. Я попытался понять свою проблему, прочитав это: NodeMCU 1.0 - Исключение 9 `Фатальное исключение 9 (LoadStoreAlignmentCause):` но не удалось!

#include <FirebaseArduino.h>
#include <SoftwareSerial.h>
#include <NTPClient.h>
#include <WiFiUdp.h>
//#включить "FS.h"

//---------креды firebase---------
#define FIREBASE_HOST "homeauto-3130d.firebaseio.com" 
#define FIREBASE_AUTH ""  

//--------кредиты wifi--------
#define WIFI_SSID "********"
#define WIFI_PASSWORD "***************" 


SoftwareSerial esp(D2,D8); //прием-передача

//--------данные из ардуино в esp-------
float temp_fb;
float gas_fb;
float hum_fb; 

//-------время проверки истекло печать b4 ------
unsigned long last_chk = 0 ; 
unsigned long time_elapsed; 

//-----управление скоростью отправки в firebase----
bool t_ar , h_ar , g_ar = false ; //проверка прихода всех данных отправки b4
char r;  
int found = 1;

//-----установка фидера pos из firebase
String feed_load = "0" ; 


//-----получение метки времени с ntp сервера
char time_stamp[12]; 
int len;
const long utcOffsetInSeconds = 19800; //gmt+5hrs:30mins => 19800 сек
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org", utcOffsetInSeconds);

//---------------------------------------переменные расписания---------------------- ------

void setup() 
{
  Serial.begin(9600);
  esp.begin(4800);

  SPIFFS.begin(); 
 
  // подключаемся к вайфаю.
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  Serial.print("connecting"); 
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
  }
   
  Serial.println("connected: ");
  Serial.println(WiFi.localIP());
  
  Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH); 
  
  if(Firebase.failed())
     {
      Serial.print("failed...");
      Serial.println(Firebase.error()); 
     }
  timeClient.begin();
}

void loop() 
{
  time_elapsed = millis(); 
  if(time_elapsed - last_chk > 5000)
  { 
    Serial.println("checking for data from arduino...");
    
    last_chk = time_elapsed;
    time_elapsed = millis();
  }
   while(esp.available()>0)
  { 
     
     if(found == 1)
     {
      Serial.println("................found data...............") ;
      timeClient.update();
      len = sprintf(time_stamp , "%d:%d:%d" , timeClient.getHours() , timeClient.getMinutes() , timeClient.getSeconds() ) ;
      Serial.print("Time stamp:\t");
      Serial.println(time_stamp);
      found = 0;
     } 
     r = esp.read(); 
      
     switch(r)
     {
           
      case 't':
      {
        Serial.print("got t...") ;
        t_ar = true;
        temp_fb = esp.parseFloat(); 
        Serial.println(temp_fb); 
        break ;
      }
            
      case 'g':
      {
          Serial.print("got g...") ;
          g_ar = true;
          gas_fb = esp.parseFloat();
          Serial.println(gas_fb);
          break ;
      }
           
      case 'h':
      {
        Serial.print("got h...") ;
        h_ar = true;
        hum_fb = esp.parseFloat();
        Serial.println(hum_fb);
        break ;   
      }
      default: break; 
            
     }
    
  }

  found = 1 ; 
  
  if(g_ar and t_ar and h_ar)
  {
     //запись в firebase
     Serial.println("got the set.. to fb now"); 
     Firebase.pushString("Time stamp" , time_stamp); 
     Firebase.setFloat("GAS SENSORinst" ,gas_fb);
     Firebase.setFloat("HUMIDITY SENSORinst" ,hum_fb);
     Firebase.setFloat("TEMP SENSORinst" ,temp_fb);
     Firebase.pushFloat("GAS SENSOR" ,gas_fb);
     Firebase.pushFloat("HUMIDITY SENSOR" ,hum_fb);
     Firebase.pushFloat("TEMP SENSOR" ,temp_fb);
     
  }
   
  t_ar , h_ar , g_ar = false ;
 
  feed_load = Firebase.getString("feeder");
  
  if (feed_load != "0")
   {
    Serial.println("\trecd req to feed"); 
      esp.print('w'); 
      esp.print(feed_load); 
      feed_load = "0";    
      Serial.println("\tsetting feeder to close in firebase");
      Firebase.setString("feeder" , "0");
     
   } 
  
}

Вот журнал ошибок: (я вставил только исключения, они просто повторяются снова и снова)

Exception (28):
epc1=0x4020cda0 epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000034 depc=0x00000000

>>>stack>>>

ctx: cont
sp: 3ffffc50 end: 3fffffc0 offset: 01a0
3ffffdf0:  0000000b 3ffeeb28 3fff0e18 40206e5c  
3ffffe00:  3ffe8857 000001bb 3fff0e18 40207d34  
3ffffe10:  3ffe890b 0000003b 3fff0e18 4020817c  
3ffffe20:  0000003b 3fffff00 3ffeec64 40203eb0  
3ffffe30:  3ffffe78 0000003b 3ffffe60 40209018  
3ffffe40:  3ffeeb24 3ffffe60 3ffe890b 3ffffee0  
3ffffe50:  3ffeeb24 3ffffea4 3fff0e14 402057ab  
3ffffe60:  3fff10bc 003b003f 00fffea4 3fff0f4c  
3ffffe70:  000c000f 00ffff5c 3fff0ef4 001d001f  
3ffffe80:  00fe876b 3ffeeb20 3fffff62 3ffffee0  
3ffffe90:  3ffeeb24 3ffe8888 3fff0ca4 402034ec  
3ffffea0:  3ffe876b 3fff0f38 3fff0ec4 3ffeea78  
3ffffeb0:  3fffff5c 3ffffee0 3ffe876b 40203e74  
3ffffec0:  3ffffee8 3fffff00 3fffff00 3ffeea78  
3ffffed0:  3fffff5c 3fff0ca4 3ffeeb20 40204765  
3ffffee0:  3ffeeb60 3fff0ed0 05e353f7 40205fef  
3ffffef0:  3ffeeb20 3ffeeb20 3fffff50 402047a6  
3fffff00:  00220000 3fff0174 3ffeea78 402068ca  
3fffff10:  00000006 00000002 40205fbc 402067ac  
3fffff20:  00c3c10e 00000006 3fffff5c 40209018  
3fffff30:  3ffeeb20 3fffff5c 3ffe8804 4020904e  
3fffff40:  3ffeeb20 3ffe851c 3ffeea61 40201438  
3fffff50:  3ffe0000 3fffff80 80feeb84 64656566  
3fffff60:  00007265 86595cc2 3ffeeb00 4020113a  
3fffff70:  00000000 00000000 feefeffe feefeffe  
3fffff80:  00000000 00000000 00000001 40100580  
3fffff90:  3fffdad0 00000000 3ffeec74 3ffeecb4  
3fffffa0:  3fffdad0 00000000 3ffeec74 40209f08  
3fffffb0:  feefeffe feefeffe 3ffe8584 401012d1  
<<<stack<<<

Exception (9):
epc1=0x4020cda0 epc2=0x00000000 epc3=0x00000000 excvaddr=0x65656663 depc=0x00000000

>>>stack>>>

ctx: cont
sp: 3ffffc50 end: 3fffffc0 offset: 01a0
3ffffdf0:  0000000b 3ffeeb28 3fff0e18 40206e5c  
3ffffe00:  3ffe8857 000001bb 3fff0e18 40207d34  
3ffffe10:  3ffe890b 0000003b 3fff0e18 4020817c  
3ffffe20:  0000003b 3fffff00 3ffeec64 40203eb0  
3ffffe30:  3ffffe78 0000003b 3ffffe60 40209018  
3ffffe40:  3ffeeb24 3ffffe60 3ffe890b 3ffffee0  
3ffffe50:  3ffeeb24 3ffffea4 3fff0e14 402057ab  
3ffffe60:  3fff0f1c 003b003f 00fffea4 3fff0f04  
3ffffe70:  000c000f 00ffff5c 3fff0eac 001d001f  
3ffffe80:  00fe876b 3ffeeb20 3fffff62 3ffffee0  
3ffffe90:  3ffeeb24 3ffe8888 3fff0c7c 402034ec  
3ffffea0:  3ffe876b 3fff0ef0 3fff0cbc 3ffeea78  
3ffffeb0:  3fffff5c 3ffffee0 3ffe876b 40203e74  
3ffffec0:  3ffffee8 3fffff00 3fffff00 3ffeea78  
3ffffed0:  3fffff5c 3fff0c7c 3ffeeb20 40204765  
3ffffee0:  3ffeeb60 3fff0cc8 a7ae147a 40205fef  
3ffffef0:  3ffeeb20 3ffeeb20 3fffff50 402047a6  
3fffff00:  00220000 3fff0174 3ffeea78 402068ca  
3fffff10:  00000006 00000002 40205fbc 402067ac  
3fffff20:  00c15609 00000006 3fffff5c 40209018  
3fffff30:  3ffeeb20 3fffff5c 3ffe8804 4020904e  
3fffff40:  3ffeeb20 3ffe851c 3ffeea61 40201438  
3fffff50:  3ffe0000 3fffff80 80feeb84 64656566  
3fffff60:  00007265 86461819 3ffeeb00 4020113a  
3fffff70:  00000000 00000000 feefeffe feefeffe  
3fffff80:  00000000 00000000 00000001 40100580  
3fffff90:  3fffdad0 00000000 3ffeec74 3ffeecb4  
3fffffa0:  3fffdad0 00000000 3ffeec74 40209f08  
3fffffb0:  feefeffe feefeffe 3ffe8584 401012d1  
<<<stack<<<

edit1 стек ошибок декодирования, вот что я получаю...

Exception 28: LoadProhibited: A load referenced a page mapped with an attribute that does not permit loads
PC: 0x402141d4: HTTPClient::connected() at C:\Users\Admin\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.6.3\libraries\ESP8266HTTPClient\src\ESP8266HTTPClient.cpp line 472
EXCVADDR: 0x00000040

Decoding stack results
0x40206e64: HTTPClient::disconnect(bool) at C:\Users\Admin\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.6.3\libraries\ESP8266HTTPClient\src\ESP8266HTTPClient.cpp line 435
0x40207d3c: HTTPClient::end() at C:\Users\Admin\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.6.3\libraries\ESP8266HTTPClient\src\ESP8266HTTPClient.cpp line 425
0x40208184: HTTPClient::begin(String, unsigned short, String, String) at C:\Users\Admin\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.6.3\libraries\ESP8266HTTPClient\src\ESP8266HTTPClient.cpp line 379
0x40203eb8: std::string::_Rep::_M_destroy(std::allocator  const&) at c:\users\admin\documents\arduinodata\packages\esp8266\tools\xtensa-lx106-elf-gcc\2.5.0-4-b40a506\xtensa-lx106-elf\include\c++\4.8.2\bits/basic_string.tcc line 452
0x40209164: String::copy(char const*, unsigned int) at C:\Users\Admin\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.6.3\cores\esp8266\WString.cpp line 214
0x402057b3: FirebaseHttpClientEsp8266::begin(std::string const&, std::string const&) at C:\Users\Admin\Documents\Arduino\libraries\firebase-arduino-master\src\FirebaseHttpClient_Esp8266.cpp line 51
0x402034f4: FirebaseRequest::sendRequest(std::string const&, std::string const&, char*, std::string const&, std::string const&) at C:\Users\Admin\Documents\Arduino\libraries\firebase-arduino-master\src\Firebase.cpp line 73
0x40203e7c: std::basic_string  , std::allocator  >::basic_string(char const*, std::allocator  const&) at c:\users\admin\documents\arduinodata\packages\esp8266\tools\xtensa-lx106-elf-gcc\2.5.0-4-b40a506\xtensa-lx106-elf\include\c++\4.8.2\bits/basic_string.tcc line 218
0x4020476d: FirebaseArduino::getRequest(String const&) at C:\Users\Admin\Documents\Arduino\libraries\firebase-arduino-master\src\FirebaseArduino.cpp line 101
0x40205ff7: std::_Function_base::_Base_manager ::_M_manager(std::_Any_data &, const std::_Any_data &, std::_Manager_operation) at c:\users\admin\documents\arduinodata\packages\esp8266\tools\xtensa-lx106-elf-gcc\2.5.0-4-b40a506\xtensa-lx106-elf\include\c++\4.8.2/functional line 1954
0x402047ae: FirebaseArduino::getString(String const&) at C:\Users\Admin\Documents\Arduino\libraries\firebase-arduino-master\src\FirebaseArduino.cpp line 132
0x402068d2: SoftwareSerial::rxBits() at C:\Users\Admin\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.6.3\libraries\SoftwareSerial\src\SoftwareSerial.cpp line 394
0x40205fc4: std::_Function_base::_Base_manager ::_M_manager(std::_Any_data &, const std::_Any_data &, std::_Manager_operation) at c:\users\admin\documents\arduinodata\packages\esp8266\tools\xtensa-lx106-elf-gcc\2.5.0-4-b40a506\xtensa-lx106-elf\include\c++\4.8.2/functional line 1931
0x402067b4: std::_Function_handler ::_M_invoke(const std::_Any_data &, unsigned int &&) at C:\Users\Admin\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.6.3\libraries\SoftwareSerial\src\SoftwareSerial.cpp line 393
0x40209164: String::copy(char const*, unsigned int) at C:\Users\Admin\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.6.3\cores\esp8266\WString.cpp line 214
0x4020919a: String::String(char const*) at C:\Users\Admin\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.6.3\cores\esp8266\WString.cpp line 36
0x40201440: loop() at C:\Users\Admin\Desktop\dummy\iot1\tonodemcu/tonodemcu.ino line 151
0x40201142: setup() at C:\Users\Admin\Desktop\dummy\iot1\tonodemcu/tonodemcu.ino line 72
0x40100580: ets_post(uint8, ETSSignal, ETSParam) at C:\Users\Admin\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.6.3\cores\esp8266\core_esp8266_main.cpp line 160
0x4020a054: loop_wrapper() at C:\Users\Admin\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.6.3\cores\esp8266\core_esp8266_main.cpp line 180

Exception 9: LoadStoreAlignmentCause: Load or store to an unaligned address
PC: 0x402141d4: HTTPClient::connected() at C:\Users\Admin\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.6.3\libraries\ESP8266HTTPClient\src\ESP8266HTTPClient.cpp line 472
EXCVADDR: 0x65656663

Decoding stack results
0x40206e64: HTTPClient::disconnect(bool) at C:\Users\Admin\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.6.3\libraries\ESP8266HTTPClient\src\ESP8266HTTPClient.cpp line 435
0x40207d3c: HTTPClient::end() at C:\Users\Admin\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.6.3\libraries\ESP8266HTTPClient\src\ESP8266HTTPClient.cpp line 425
0x40208184: HTTPClient::begin(String, unsigned short, String, String) at C:\Users\Admin\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.6.3\libraries\ESP8266HTTPClient\src\ESP8266HTTPClient.cpp line 379
0x40203eb8: std::string::_Rep::_M_destroy(std::allocator  const&) at c:\users\admin\documents\arduinodata\packages\esp8266\tools\xtensa-lx106-elf-gcc\2.5.0-4-b40a506\xtensa-lx106-elf\include\c++\4.8.2\bits/basic_string.tcc line 452
0x40209164: String::copy(char const*, unsigned int) at C:\Users\Admin\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.6.3\cores\esp8266\WString.cpp line 214
0x402057b3: FirebaseHttpClientEsp8266::begin(std::string const&, std::string const&) at C:\Users\Admin\Documents\Arduino\libraries\firebase-arduino-master\src\FirebaseHttpClient_Esp8266.cpp line 51
0x402034f4: FirebaseRequest::sendRequest(std::string const&, std::string const&, char*, std::string const&, std::string const&) at C:\Users\Admin\Documents\Arduino\libraries\firebase-arduino-master\src\Firebase.cpp line 73
0x40203e7c: std::basic_string  , std::allocator  >::basic_string(char const*, std::allocator  const&) at c:\users\admin\documents\arduinodata\packages\esp8266\tools\xtensa-lx106-elf-gcc\2.5.0-4-b40a506\xtensa-lx106-elf\include\c++\4.8.2\bits/basic_string.tcc line 218
0x4020476d: FirebaseArduino::getRequest(String const&) at C:\Users\Admin\Documents\Arduino\libraries\firebase-arduino-master\src\FirebaseArduino.cpp line 101
0x40205ff7: std::_Function_base::_Base_manager ::_M_manager(std::_Any_data &, const std::_Any_data &, std::_Manager_operation) at c:\users\admin\documents\arduinodata\packages\esp8266\tools\xtensa-lx106-elf-gcc\2.5.0-4-b40a506\xtensa-lx106-elf\include\c++\4.8.2/functional line 1954
0x402047ae: FirebaseArduino::getString(String const&) at C:\Users\Admin\Documents\Arduino\libraries\firebase-arduino-master\src\FirebaseArduino.cpp line 132
0x402068d2: SoftwareSerial::rxBits() at C:\Users\Admin\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.6.3\libraries\SoftwareSerial\src\SoftwareSerial.cpp line 394
0x40205fc4: std::_Function_base::_Base_manager ::_M_manager(std::_Any_data &, const std::_Any_data &, std::_Manager_operation) at c:\users\admin\documents\arduinodata\packages\esp8266\tools\xtensa-lx106-elf-gcc\2.5.0-4-b40a506\xtensa-lx106-elf\include\c++\4.8.2/functional line 1931
0x402067b4: std::_Function_handler ::_M_invoke(const std::_Any_data &, unsigned int &&) at C:\Users\Admin\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.6.3\libraries\SoftwareSerial\src\SoftwareSerial.cpp line 393
0x40209164: String::copy(char const*, unsigned int) at C:\Users\Admin\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.6.3\cores\esp8266\WString.cpp line 214
0x4020919a: String::String(char const*) at C:\Users\Admin\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.6.3\cores\esp8266\WString.cpp line 36
0x40201440: loop() at C:\Users\Admin\Desktop\dummy\iot1\tonodemcu/tonodemcu.ino line 151
0x40201142: setup() at C:\Users\Admin\Desktop\dummy\iot1\tonodemcu/tonodemcu.ino line 72
0x40100580: ets_post(uint8, ETSSignal, ETSParam) at C:\Users\Admin\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.6.3\cores\esp8266\core_esp8266_main.cpp line 160
0x4020a054: loop_wrapper() at C:\Users\Admin\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.6.3\cores\esp8266\core_esp8266_main.cpp line 180

Читайте здесь: Исключение NodeMCU 28 — непостоянная проблема, что исключение 28 может быть вызвано тем, что некоторые функции не возвращают значения, и я могу принять это, потому что я только что подключил ESP без arduino, просто чтобы проверить, что происходит, но в другое время я только вспоминаю, что исключение 9 повторяется

Переменная String feed_load считывается из firebase, которая получает значение из приложения, созданного изобретателем приложения MIT, я храню в нем 0 или значение нагрузки (число с плавающей запятой); но изобретатель приложения сохраняет его как строку, поэтому я читаю его как строку, я попытался ввести char feed_load[5], но выдало ошибку, говорящую, что строка не может быть сохранена в char[5]

пожалуйста, помогите решить эту проблему, нужно написать еще немного кода для планирования действий, поэтому я не хочу, чтобы плата постоянно перезагружалась или перезагружалась

, 👍1

Обсуждение

декодировать стек, @Juraj

Вы уверены, что ваш код может правильно скомпилироваться? if(g_ar и t_ar и h_ar) даже не является допустимым синтаксисом C++., @hcheung

Код @hcheung компилируется и работает уже несколько дней :), @Somasundharam Sampath

@Juraj Я добавил расшифрованный стек ошибок!, @Somasundharam Sampath

Вы получаете предупреждения компилятора?, @Sim Son

@SimSon Никаких предупреждений, единственное, что я заметил, это то, что было несколько файлов для ESP в файлах Arduino и ArduinoData (я не знаю, как этот файл появился, но я не стал его удалять, так как может появиться что-то еще !!), @Somasundharam Sampath

это известная проблема. использовать HttoClient как локальную переменную, @Juraj

@Juraj, вы имеете в виду вместо `Firebase.function()` , я должен использовать `Firebase HttpClient` и использовать `HttpClient.function()`, или мне нужно использовать совсем другая библиотека?, @Somasundharam Sampath

Отвечает ли это на ваш вопрос? ESP8266 всегда сбрасывается после 65 секунд работы, @Juraj

@Juraj Я должен попробовать эту библиотеку (ESP8266HTTPClient), поскольку та, которую я использую (FirebaseArduino), все еще использует ArduinoJson 5.13.5, я подумал об использовании библиотеки отсюда: https://github.com/mobizt/Firebase -ESP8266, но в целом первая выглядит как хорошая библиотека для такого рода приложений! Я посмотрю, решит ли это проблему, спасибо!, @Somasundharam Sampath

извините, я был на маленьком дисплее телефона. FirebaseArduino использует HttpClient. проверьте, есть ли исправление для FirebaseArduino для решения проблемы, @Juraj


1 ответ


1

Я не знаю, является ли это фактическим решением проблемы, но вместо библиотеки FirebaseArduino я использовал библиотеку FirebaseESP8266, и случайные исключения не возникали (пока)

Firebase esp8266 https://github.com/mobizt/Firebase-ESP8266 /

P.S. извините, что не вернулся быстрее!!

,