浏览量: 305 次浏览

ESP8266模块睡眠模式

2020年2月4日 0 作者 Nie Hen

当我们使用电池给esp模块进行供电的时候,为了节省电量。我们要实际应用的时候,这个问题就需要去解决。
而这个问题的解决方法就是使用esp模块的睡眠模式

睡眠模式的类型

共有三种不同的睡眠模式:调制解调器睡眠,轻度睡眠和深度睡眠。下表显示了每种模式之间的差异(ESP8266数据表中的信息)。
enter description here
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连接。
enter description here
调用函数 ESP.deepSleep(30e6); (单位us)
使esp模块进入深度睡眠模式 30s.
30s达到后 GPIO16进行唤醒
最多睡眠时长4,294,967,295 µs 也就是大概71分钟

esp01使用定时来实现睡眠模式不太好做,需要接出来一个非常小的引脚
enter description here

第二种方式是通过外部触发进行唤醒
enter description here
使用 ESP.deepSleep(0);
进行长时间的深度睡眠状态
当按钮按下 RST有低电平信号,将进行唤醒,唤醒后执行到这条语句将再次睡眠直到下一次按钮按下。
esp01s是同样的方式
enter description here
参考代码

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模式测试
有可能是模块的原因 获取到的值不准确 因为每次都是获取到的初始化的值 可能会存在问题。(目前还不确定与轻度睡眠有关系没)