如何知道 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 是不是被手动复位?的主要内容,如果未能解决你的问题,请参考以下文章
MPU9250 卡在使用 WOM 的 ESP8266 的复位循环中