如何知道 ESP8266 是不是被手动复位?

Posted

技术标签:

【中文标题】如何知道 ESP8266 是不是被手动复位?【英文标题】:How to know if the ESP8266 has been manually reset?如何知道 ESP8266 是否被手动复位? 【发布时间】:2016-01-03 07:02:44 【问题描述】:

dsleep 模式的帮助下,我有一个代码循环。每次dsleep 结束时,init.lua 都会被加载,然后执行一些操作以返回睡眠状态。

现在我想在我的 ESP8266 上实现一个按钮来触发复位引脚。推送时,我的系统应该进入“设置模式”,提供 AP 进行一些设置(那部分代码是可以的)。

我的问题是:我如何知道当前的初始化是手动触发的(然后进入设置模式)还是在dsleep 之后正常重启?

我猜应该有两种方法:

    以编程方式:以某种方式在dsleep 末尾存储一个由 gpio15 触发器更改的元全局变量... 电子方式:在按下重置按钮时修改某个引脚的状态

有什么建议吗?

【问题讨论】:

请选择正确答案。 【参考方案1】:

我知道使用带有ESP.getResetInfoPtr() 的Arduino IDE 是可能的(无需任何黑客攻击)。有人用过here

我认为 nodemcu 固件中没有启用它。

【讨论】:

NodeMCU 确实有这一点,正如另一个答案中指出的那样,node.bootreason【参考方案2】:

您可以使用node.bootreason() 函数获取重启原因。

示例代码是(如果您不需要其他信息,可以省略code, reason 之后的任何变量:

code, reason, exccause, epc1, epc2, epc3, excvaddr, depc = node.bootreason()

【讨论】:

exccause的定义吗?我可以找到代码和共振,但不是后者。【参考方案3】:

此功能由Espressif 在他们的 SDK 中实现:

int reason = ESP.getResetInfoPtr()->reason;


switch (reason) 
    case REASON_DEFAULT_RST:
        // Normal Power up
        break;
    case REASON_WDT_RST:
        break;
    case REASON_EXCEPTION_RST:
        break;
    case REASON_SOFT_WDT_RST:
        break;
    case REASON_SOFT_RESTART:
        break;
    case REASON_DEEP_SLEEP_AWAKE:
        break;
    case REASON_EXT_SYS_RST:
        break;

    default:
        break;
    

【讨论】:

以上是关于如何知道 ESP8266 是不是被手动复位?的主要内容,如果未能解决你的问题,请参考以下文章

ESP8266入门教程-ESP8266睡眠和唤醒功能

MPU9250 卡在使用 WOM 的 ESP8266 的复位循环中

启明云端分享|一款方便实用的且适用于ESP32/ESP8266的USB-TTL转接板开发工具推荐

ESP8266 TCP传输AT指令顺序

LUA (ESP8266) 如何从字符串调用/输入模块命令

ESP8266开发之旅 网络篇? SPIFFS——ESP8266 SPIFFS文件系统