当前位置: 首页 > news >正文

ESP8266的低功耗方案-睡眠模式

在某些时候我们设计的产品可能不具备持久供电的环境,那通常会采用锂电池、干电池一类的轻便型的非持久性电源。当遇到这种情况时,产品的续航能力可能就会成用户评估产品的一个重要指标,加大电池容量当然是最为直接的方案,但是这也意味着提高产品的生产成本。那增加产品续航能力的另一个方案就是原自产品自身——降低不必要的能源消耗。

ESP8266有一个非常实用的低功耗运行模式 - 睡眠模式。

ESP8266系列产品的睡眠模式共有以下几种可选:

No-sleep

打开芯片所有的功能使所有功能处理长期持久的工作状态,此时芯片的功耗将处于最大状态。显然,这并不是一种推荐的用法,除非ESP8266芯片要处理长时间的实时性任务(此场景在真实的产品应用中并不多见)。

Modem-sleep

Modem-sleep是ESP8266的默认睡眠方式且仅工作于Station模式(即中继器模式 AP),而且只有连接到路由器后才会生效。

当ESP8266以AP方式连接到路由器且运行于Modem-sleep模式时,它会在两次DTIM Beacon间隔内关闭WIFI电路以达到省电效果,在下次Beacon到来前自动唤醒。睡眠时间由路由器的DTIM Beacon时间决定。睡眠的同时ESP8266可以保持与路由器的WI-FI连接,并通路由器接受来自手机或者服务器的交互信息。

一般路由器的DTIM Beacon间隔为100ms~1,000ms

Light-sleep

Light-sleep的工作模式与Modem-sleep相似,而不同的是除了关闭WI-FI模块电路以外,在该模下还会关闭时间并暂停内部CPU,从而达到比Modem-sleep模式更低的功耗。

Light-sleep模式可用于需要保持与路由器的连接,可以实时响应路由器发来的数据的场合。并且在未接收到命令时,CPU可以处于空闲状态。比如WI-FI开关的应用,大数据时间CPU是空闲的,直到收到控制命令,CPU才需要进行GPIO的操作。

Deep-sleep

Deep-sleep则是最狠的一种省电模式了,但此模式下ESP8266将会关闭除GPIO状态外的所有的电路,此时ESP8266几乎就处于假死状态,其电流的消耗仅仅为20uA

而事实上ESP8266并不会持续地维持这种深度睡眠状态,而是在一个指定间隔内关闭所有其它电路,当达到指定时间间隔后ESP8266将会自动重新启动一次,这个最大时间间隔为 4,294,967,295 µs 约合71分钟,其实也真的算得上睡得够久了。但这种模式非常适合于那种对时间间隔要求很长的场合,例如最长见的温度湿度检测,河水水位检测等。

要启用Deep-sleep模式不能单单通过固件控制而需要进行跳线,具体办法就是将D0(GPIO16)与RST脚相连。只要RST脚处于低电平状态时就会引发ESP8266重启,而Deep-sleep的真正实现方法就是在固件所指定的时间间隔内向GPIO16输出低电平引发芯片的重启,以达到唤醒的效果。

以下是在固件内引发Deep-sleep的代码:

void setup() {
  Serial.begin(115200);
  Serial.setTimeout(2000);

  // Wait for serial to initialize.
  while(!Serial) { }
  
  Serial.println("I'm awake.");

  Serial.println("Going into deep sleep for 20 seconds");

  // 一但遇到以下方法ESP就会进入deepSleep状态
  ESP.deepSleep(20e6); // 20e6 is 20 microseconds
}

void loop() {
}

下表为三种模式的具体对比:

相关文章:

  • NPOI 自定义单元格背景颜色-Excel
  • Android Studio Flavors的妙用(转)
  • linux下怎么卸载自带的JDK和安装想要的JDK
  • 1、win10下的Docker+Redis 的下载及简单使用
  • 单例设计模式
  • PHP多进程系列笔记(三)
  • Netty基础
  • 探讨.NET Core的未来
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • Mantis 1.3.13报表显示问题
  • SQL Server 与 DSN
  • 关于怎么在手机端实现一个拖拽的操作
  • 每日笔记之2018-06-26之小总结
  • emoji web端处理
  • libvirt-qemu-虚拟机设备热插拔
  • JavaScript 如何正确处理 Unicode 编码问题!
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • bootstrap创建登录注册页面
  • co.js - 让异步代码同步化
  • cookie和session
  • EOS是什么
  • iOS 系统授权开发
  • Mysql数据库的条件查询语句
  • Redis的resp协议
  • spring security oauth2 password授权模式
  • TypeScript迭代器
  • WebSocket使用
  • 安装python包到指定虚拟环境
  • 彻底搞懂浏览器Event-loop
  • 从伪并行的 Python 多线程说起
  • 读懂package.json -- 依赖管理
  • 高性能JavaScript阅读简记(三)
  • 工作中总结前端开发流程--vue项目
  • 面试遇到的一些题
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • #define 用法
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (libusb) usb口自动刷新
  • (层次遍历)104. 二叉树的最大深度
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • (转)linux 命令大全
  • .bat批处理(一):@echo off
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .net framework profiles /.net framework 配置
  • .Net Winform开发笔记(一)
  • .Net(C#)自定义WinForm控件之小结篇
  • .NET/C# 编译期间能确定的相同字符串,在运行期间是相同的实例
  • .Net程序猿乐Android发展---(10)框架布局FrameLayout
  • ?php echo $logosrc[0];?,如何在一行中显示logo和标题?
  • @entity 不限字节长度的类型_一文读懂Redis常见对象类型的底层数据结构
  • [ JavaScript ] JSON方法
  • [ vulhub漏洞复现篇 ] Grafana任意文件读取漏洞CVE-2021-43798