问题

最近在研究ESP8266低功耗方案,使用的是 ESP8266 NodeMCU,其核心是ESP-12F,整个板子是作为12F的引脚扩展+CH340串口+5V转3.3V (AMS1117-3.3V)来使用的,静态功耗较大。

然而,在使用ESP.deepsleep(1e6)后,开发板并不能自动唤醒。测试代码如下

void setup(){
    Serial.begin(74880);
    Serial.println("sleeping..");
    delay(1000);
    ESP.deepSleep(1e6);
}

void loop(){
}

串口打印数据如下

ets Jan  8 2013,rst cause:2, boot mode:(3,6)
load 0x4010f000, len 3424, room 16
tail 0
chksum 0x2e
load 0x3fff20b8, len 40, room 8
tail 0
chksum 0x2b
csum 0x2b
v00041de0
~ld
rf cal sector: 1020
freq trace enable 0
rf[112] : 0�sleeping..
ets Jan  8 2013,rst cause:2, boot mode:(3,6)

第一行是手动复位,显示正常启动信息。到最后一行是它自动唤醒的信息,但未被正常启动,而是挂起在那。

问题原因

这个问题困扰我一个星期之久,我一开始以为是我的操作有问题,于是查阅国内外搜索引擎、论坛社区,均以“ESP8266深度睡眠”作为搜索关键词,经过数十次比对,我的接线、代码与其他人一模一样。

因此,我换了个关键词“ESP8266无法被唤醒”,这次中文社区也未找到有用答案,而英文社区,github上,倒是有很多issue。

下面这个issue是我解决问题的关键:
ESP.deepSleep hangs after wakeup - ESP12F (Working on older chips) · Issue #6007 · esp8266/Arduino (github.com)
他们遇到问题与我一致,最终怀疑到了生产批次的问题,因为最老的版本没事,而新版本大多出现唤醒后挂起的问题。

解决方案

原文:
I have battled with this issue for months on and off. Was finally able to get the lolin Nodemcu v3 to wake up from deepsleep using a 220resistor between SDO(MISO) and 3.3v.
(this is in addition to the bridging of GPIO16 and RST of course)
翻译:
将一个电阻接在3.3V和MISO引脚之间,并且也要接GPIO16和RST引脚。