首页 文章

软重置 - ESP8266 / NodeMCU

提问于
浏览
1

当我上传我的代码时,在循环()的3次迭代之后,我得到一个软wdt重置并且NodeMCU重新启动 . 它每次都会发生 . 会出现什么错误?

#include <dummy.h>
#include <elapsedMillis.h>
#include <ESP8266WiFi.h>
#include <FirebaseArduino.h>

// Set these to run example.
#define FIREBASE_HOST "plugmatebeta.firebaseio.com"
#define FIREBASE_AUTH "zQtW9gVXzNuz1tD8OzaTCoFpIx7MbFjwyncsWnGC"                       
#define WIFI_SSID "6LowPAN"
#define WIFI_PASSWORD "rashmin0703"
#define WifiAlertLED D3
#define pushButton D6
#define outsideButton D7
#define relay D8
#define connectedLED D2

void setup() {
  Serial.begin(9600);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  Serial.print("Connecting: ");
  delay(5000);

//  while (WiFi.status()!=WL_CONNECTED){
//    Serial.print(".");
//    delay(100);
//  }
//  Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);
//  delay(1000);

  pinMode(WifiAlertLED,OUTPUT);
  pinMode(connectedLED,OUTPUT);
  pinMode(pushButton,INPUT);
  pinMode(outsideButton,INPUT);
  pinMode(relay,OUTPUT);


}

void loop() {
  if (WiFi.status() != WL_CONNECTED){
        digitalWrite(connectedLED, LOW);
        WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
        Serial.print("connecting");
        BlinkLED();
        controlOne();
        delay(1000);
    }
  else{
    Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);
    delay(500);
    Serial.println("inside connected");
    controlTwo();
  }
}


void BlinkLED(){
  digitalWrite(WifiAlertLED, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(100);              // wait for a second
  digitalWrite(WifiAlertLED, LOW);    // turn the LED off by making the voltage LOW
  delay(100);   
}

void controlOne(){
  if ((digitalRead(pushButton) == HIGH) && (digitalRead(outsideButton)==HIGH) ){
         digitalWrite(relay, HIGH);
         Serial.println("on");
  }else{
         digitalWrite(relay, LOW);
         Serial.println("off");
  }
}

void controlTwo(){
  String firebaseResult = firebaseAction();
  if ((digitalRead(pushButton) == HIGH) && ( (firebaseResult=="1") || (digitalRead(outsideButton)==HIGH) ) ){
    digitalWrite(relay, HIGH);
    Serial.println("onnnnnnnnn");
    publishtoFirebase("ON");
  }else{
    digitalWrite(relay, LOW);
    Serial.println("onnnnnnnnn");
    publishtoFirebase("OFF");
  } 
}


String firebaseAction(){
    String x =Firebase.getString("/plgm8-1/command");
    yield();
    delay(200);
    Serial.println(x);
    return x;
    delay(100);
}

void publishtoFirebase(String x){
  Firebase.setString("/plgm8-1/status", x);
  delay(200);
  yield();
}

我试图寻找有关软错误重置的错误,但似乎资源非常低 . 这是NodeMCU定时器的问题吗?

2 回答

  • 1

    你不应该多次调用WiFi.begin或Firebase.begin . 一旦ESP在设置中连接,如果连接断开,它将自己重新连接,你不需要在你的循环内处理它 .

    我认为您应该取消注释您的设置功能中的代码然后循环,只需调用 controlTwo();

    有一点需要注意 . 如果你花太多时间无所事事,特别是在设置功能中,会有一个看门狗计时器,所以尽量避免太多不需要的延迟调用或设置中的无限循环 .

    这是我认为应该工作的代码的黑客版本 .

    void setup() {
      Serial.begin(115200);
      WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
      Serial.print("Connecting: ");
      delay(5000);
    
       while (WiFi.status()!=WL_CONNECTED){
        Serial.print(".");
        BlinkLED();
        controlOne();
        delay(100);
       }
       Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);
       delay(1000);
    
      pinMode(WifiAlertLED, OUTPUT);
      pinMode(connectedLED, OUTPUT);
      pinMode(pushButton, INPUT);
      pinMode(outsideButton, INPUT);
      pinMode(relay, OUTPUT);
    }
    
    void loop() {
      Serial.println("inside connected");
      controlTwo();
      delay(500);
    }
    
  • -1

    它会重置,因为您处理Wi-Fi连接的方式有问题 . 当我在连接到服务器之前尝试发出http请求时,它发生在我身上 . 编译器没有看到这个,所以你需要知道你在做什么 .

    尝试在 setup() 中仅运行一次 WiFi.begin() 函数,并在完成后关闭与firebase服务器的连接,或者如果您希望它连接到服务器24/7,则只运行一次 .

相关问题