ESP8266模块睡眠模式
当我们使用电池给esp模块进行供电的时候,为了节省电量。我们要实际应用的时候,这个问题就需要去解决。
而这个问题的解决方法就是使用esp模块的睡眠模式
睡眠模式的类型
共有三种不同的睡眠模式:调制解调器睡眠,轻度睡眠和深度睡眠。下表显示了每种模式之间的差异(ESP8266数据表中的信息)。
esp低电量解决方案官方文档
我们可以看到三种睡眠模式wifi都是关闭的。这就意味着很多情况下需要持续连接wifi的应用场景是不适用的。
深度睡眠模式只打开了时钟。其他都是关闭的。而深度睡眠也是最省电的只有20μA。
每一种睡眠模式有他们适用的应用场景。
调制解调器睡眠
调制解调器睡眠通常用于需要CPU供电的应用程序。一个
应用的例子是需要实时的脉冲宽度调制(PWM)光
CPU控制。
当不需要恒定的wifi连接时,且应用程序需要保留的状态下,对于减少功耗是很有用的。
对于这种模式的控制通过对wifi的控制来实现
WiFi.forceSleepBegin(); // Wifi off
delay();
WiFi.forceSleepWake(); // Wifi on
当需要进入睡眠模式时 使用第一条语句
当需要唤醒时,使用第二条语句。
可以在loop中使用。
示例
void loop() {
data();
delay(200);
Serial.println(“Going to sleep now”);
WiFi.forceSleepBegin(); // Wifi Off
delay(1000*10); // sleep for 10 seconds
WiFi.forceSleepWake(); // Wifi On
Serial.println(“Wake up”);
}
data() 函数是获取传感器的值 并使用mqtt发送
可以看到 获取到值后,让esp模块进入睡眠模式,睡眠10s后,进行唤醒。再次重复操作。
参考链接
轻度睡眠
Light sleep。
依旧可以在loop中进行睡眠。
调用 可以使用light_sleep()
void light_sleep(){
wifi_station_disconnect();
wifi_set_opmode_current(NULL_MODE);
wifi_fpm_set_sleep_type(LIGHT_SLEEP_T);
wifi_fpm_open(); // Enables force sleep
gpio_pin_wakeup_enable(GPIO_ID_PIN(2), GPIO_PIN_INTR_LOLEVEL);
wifi_fpm_do_sleep(0xFFFFFFF); // Sleep for longest possible time
}
这里面设置的睡眠时间是最长的时间,唤醒通过按钮将GPIO2 接地。
可以通过调整睡眠时间来定时发送数据。
唤醒后要做的是连接wifi。因此需要在loop中第一句连接wifi
参考ESP8266 Light Sleep with MQTT
### 深度睡眠
deep sleep
对于耗电有要求,而且发送数值不频繁 可以使用睡眠模式,里面应有程序数据在深度睡眠模式将都不执行。相当于关机
实现方式有两个。
第一种是定时器唤醒,可以理解为定时开关机
传入代码后将GPIO16 与RST连接。
调用函数 ESP.deepSleep(30e6); (单位us)
使esp模块进入深度睡眠模式 30s.
30s达到后 GPIO16进行唤醒
最多睡眠时长4,294,967,295 µs 也就是大概71分钟
esp01使用定时来实现睡眠模式不太好做,需要接出来一个非常小的引脚
第二种方式是通过外部触发进行唤醒
使用 ESP.deepSleep(0);
进行长时间的深度睡眠状态
当按钮按下 RST有低电平信号,将进行唤醒,唤醒后执行到这条语句将再次睡眠直到下一次按钮按下。
esp01s是同样的方式
参考代码
void setup() {
Serial.begin(115200);
Serial.setTimeout(2000);
// Wait for serial to initialize.
while(!Serial) { }
// Deep sleep mode for 30 seconds, the ESP8266 wakes up by itself when GPIO 16 (D0 in NodeMCU board) is connected to the RESET pin
//Serial.println("I'm awake, but I'm going into deep sleep mode for 30 seconds");
//ESP.deepSleep(30e6);
// Deep sleep mode until RESET pin is connected to a LOW signal (for example pushbutton or magnetic reed switch)
Serial.println("I'm awake, but I'm going into deep sleep mode until RESET pin is connected to a LOW signal");
ESP.deepSleep(0);
}
void loop() {
}
参考ESP8266 Deep Sleep with Arduino IDE (NodeMCU)
参考 ESP8266 Deep sleep mode
参考The sleep states of the ESP8266
补充
对dht11 获取温度值 进行 light sleep模式测试
有可能是模块的原因 获取到的值不准确 因为每次都是获取到的初始化的值 可能会存在问题。(目前还不确定与轻度睡眠有关系没)