如何解决 wdt 重置,第一个原因:4,引导模式:(3,6) / NODEMCU 1.0 (ESP 8266) / ThingSpeak

Posted

技术标签:

【中文标题】如何解决 wdt 重置,第一个原因:4,引导模式:(3,6) / NODEMCU 1.0 (ESP 8266) / ThingSpeak【英文标题】:How to solve wdt reset, rst cause:4, boot mode:(3,6) / NODEMCU 1.0 (ESP 8266) / ThingSpeak 【发布时间】:2022-01-23 18:15:49 【问题描述】:

问题出在哪里?看门狗复位每次都会触发。我对这种类型的项目有些陌生。在任何地方都找不到解决方案。在某处我发现分解延迟值可能会有所帮助。但这对我来说不起作用。

#include <DHT.h>  // Including library for dht 
#include <ESP8266WiFi.h>
 
String apiKey = "******";     //  Enter your Write API key from ThingSpeak
 
const char *ssid =  "*********";     // replace with your wifi ssid and wpa2 key
const char *pass =  "*************";
const char* server = "api.thingspeak.com";

使用引脚 7 作为 DHT22 传感器的输入

#define DHTPIN 7          //pin where the dht22 is connected
 
DHT dht(DHTPIN, DHT22);
 
WiFiClient client;
 
void setup() 

       Serial.begin(115200);
       delay(10);
       dht.begin();
 
       Serial.println("Connecting to ");
       Serial.println(ssid);
 
 
       WiFi.begin(ssid, pass);

这个命令有问题吗?我很困惑

      while (WiFi.status() != WL_CONNECTED) 
     
            delay(50);
            Serial.print(".");
     
      Serial.println("");
      Serial.println("WiFi connected");
 

 
void loop() 

  
      float h = dht.readHumidity();
      float t = dht.readTemperature();
      
              if (isnan(h) || isnan(t)) 
                 
                     Serial.println("Failed to read from DHT sensor!");
                      return;
                 
 
                         if (client.connect(server,80))   //   "184.106.153.149" or api.thingspeak.com
                        
                            
                             String postStr = apiKey;
                             postStr +="&field1=";
                             postStr += String(t);
                             postStr +="&field2=";
                             postStr += String(h);
                             postStr += "\r\n\r\n";
 
                             client.print("POST /update HTTP/1.1\n");
                             client.print("Host: api.thingspeak.com\n");
                             client.print("Connection: close\n");
                             client.print("X-THINGSPEAKAPIKEY: "+apiKey+"\n");
                             client.print("Content-Type: application/x-www-form-urlencoded\n");
                             client.print("Content-Length: ");
                             client.print(postStr.length());
                             client.print("\n\n");
                             client.print(postStr);
 
                             Serial.print("Temperature: ");
                             Serial.print(t);
                             Serial.print(" degrees Celcius, Humidity: ");
                             Serial.print(h);
                             Serial.println("%. Send to Thingspeak.");
                        
          client.stop();
 
          Serial.println("Waiting...");
  
  // thingspeak needs minimum 15 sec delay between updates
  delay(200);


【问题讨论】:

这很奇怪。我从来没有见过一个 MCU 库,其中看门狗在没有任何关于如何服务的文档的情况下被隐式打开。我试图在 ESP8266 文档中找到 WDT 服务的位置(显然它同时具有 SW 和 HW WDT),但我没有立即得到任何东西。 在收到 WDT 重置消息之前,您会收到什么输出? 您能否提供您正在使用的每个库的哪个版本?我发现的 DHT 库有 getTemperaturegetHumidity 方法,但没有 readTemperatereadHumidity 【参考方案1】:

This ESP documentation 告诉我们您的应用程序正在被一个硬件看门狗定时器复位,该定时器仅在软件看门狗定时器禁用时间过长时才会打开。可能有一些方法可以禁用硬件 WDT,但我目前不知道那是什么。

您应该能够通过启用软件 WDT 并定期对其进行维护来防止这种情况发生。

#include <Esp.h>

void setup() 
    ESP.enableWDT();


void loop() 
    // do useful stuff

    ESP.wdtFeed(); // service the WDT here

我不确定默认的 WDT 超时是多少,但代码中的 cmets 表明我们无法指定非默认超时。

Esp.h on github

【讨论】:

我在代码中看不到任何触发看门狗重置的内容,但它也是通过掉电触发的。通常是射频功率太高的时候,通常是射频校准错误 @juraj WDT 超时是在掉电时触发的?或者这是一个单独的复位源?通常 WDT 和掉电是独立的复位源。 在掉电时,寄存器被损坏,CPU 开始执行废话或挂起。如果产生了损坏的堆栈转储,我们会看到这一点。 @juraj 我明白了。这很可能是 OP 的问题。

以上是关于如何解决 wdt 重置,第一个原因:4,引导模式:(3,6) / NODEMCU 1.0 (ESP 8266) / ThingSpeak的主要内容,如果未能解决你的问题,请参考以下文章

[实践篇]13.21 la qcom watchdog学习笔记

RedHat6重置root密码

Linux红帽RHEL 7 系统重置root用户密码

CMT2380F32模块开发12-看门狗 WDT例程

CMT2380F32模块开发12-看门狗 WDT例程

nrf52832 DUF功能加看门狗