如何确定ESP8266是否已被手动重置?

我有一个代码使用 dsleep 模式进行循环。每次 dsleep 结束时,init.lua 被加载,执行一些操作,然后重新进入睡眠状态。

现在,我想给我的 ESP8266 实现一个按钮,用于触发复位引脚。当按下时,我的系统应该进入“设置模式”,提供 AP 进行一些设置(代码部分是 OK 的)。

我的问题是:我怎么知道当前的 init 是手动触发的(然后进入设置模式)还是在 dsleep 后正常重启导致的?

我猜有两种方法可以实现这个:

  1. 编程方式:在 dsleep 结束时,以某种方式存储一个由 gpio15 触发更改的元全局变量...
  2. 电子方式:在按下复位按钮时,通过某种方式突破一个引脚状态的更改

有什么建议吗?

点赞
用户922975
用户922975

我知道在 Arduino IDE 中,使用 ESP.getResetInfoPtr() 可以实现重置原因的检测(无需任何黑客手段)。在这里有人已经用过它了 here

我认为它还没有在 NodeMCU 固件中启用。

2015-11-14 17:58:38
用户1580216
用户1580216

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

示例代码为(如果不需要额外信息,可以省略code, reason后面的任何变量):

code, reason, exccause, epc1, epc2, epc3, excvaddr, depc = node.bootreason()
2016-01-30 21:12:20
用户1896554
用户1896554

这个功能是由 Espressif 在他们的 SDK 中实现的:

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

switch (reason) {
    case REASON_DEFAULT_RST:
        // 正常上电
        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;
    }
2019-12-05 20:01:46