基于ESP32-S2与MAX17048的物联网电池监控系统设计与实现

news2026/5/17 1:54:50
1. 项目概述与核心价值对于任何一个需要长期部署在户外的物联网设备比如环境监测站、智能农业传感器或者远程摄像头最让人头疼的问题往往不是代码bug而是“它什么时候会没电”。你不可能天天跑现场去检查而设备一旦断电数据就断了整个项目也就失去了意义。这就是为什么一个可靠的、能远程通知的电池监控系统对于物联网开发者来说不是“锦上添花”而是“雪中送炭”的刚需。这个项目就是一个为解决这个痛点而生的“物联网电池监控器”。它的核心思路非常清晰用硬件精确感知用软件智能处理最后通过云端实现远程触达。具体来说我们使用了一块自带彩色屏幕的Feather ESP32-S2开发板作为大脑它集成了Wi-Fi功能负责联网和显示。再搭配一颗MAX17048电池电量计芯片这颗芯片的厉害之处在于它不需要通过测量电压来粗略估算而是使用专利的“ModelGauge”算法能直接、精确地计算出锂电池的剩余电量百分比精度远高于传统的电压检测法。整个系统的逻辑闭环是这样的MAX17048芯片持续监测电池状态Feather ESP32-S2每分钟读取一次数据并实时显示在自带的TFT屏幕上。同时它通过Wi-Fi将数据特别是电量百分比上传到Adafruit IO这个物联网平台。当你在Adafruit IO上设置一个“当电量达到100%时”的触发条件平台就会自动向你指定的邮箱或手机发送通知告诉你“电池已充满可以安心使用了。”这样一来你无需守在设备旁边就能对电源状态了如指掌。这个项目非常适合两类朋友一是物联网项目开发者你可以直接把这块监控板作为你现有设备的一个电源管理模块集成进去二是硬件和Python的初学者因为它基于CircuitPython这是一种对新手极其友好的微控制器编程语言无需复杂的开发环境像操作U盘一样编辑代码即可是入门嵌入式开发和物联网的绝佳跳板。接下来我会带你从硬件选型、代码解析到云端配置完整地走一遍这个项目的构建过程并分享我在实际制作中踩过的坑和总结的技巧。2. 硬件选型与物料清单解析工欲善其事必先利其器。这个项目的硬件选型非常考究每一件组件都承担着不可替代的角色。理解为什么选它们比单纯照单全收更重要。2.1 核心控制器Feather ESP32-S2 Reverse TFT这块板子是整个项目的“心脏”和“脸面”。选择它主要基于以下四个不可替代的优势All-in-One设计它集成了ESP32-S2 Wi-Fi微控制器、一个240x135像素的彩色TFT显示屏、三个物理按键以及锂电池充电管理电路。这意味着你不需要再额外连接屏幕、按键或充电模块极大简化了硬件设计和焊接工作降低了出错概率。CircuitPython原生支持Adafruit的Feather系列是CircuitPython的“亲儿子”固件更新及时库支持完善。这块Reverse TFT型号更是有专门优化的显示驱动库开箱即用。“Reverse”设计的妙用所谓的“Reverse”是指屏幕与主板是背对背焊接的。这种设计让屏幕和主控板共享同一个物理平面使得最终产品非常纤薄可以直接嵌入到我们设计的3D打印外壳中形成一个整体而不是屏幕凸出在外。丰富的GPIO与I2C接口尽管板载资源丰富它依然引出了足够的GPIO引脚。本项目正是利用其I2C总线来连接MAX17048芯片同时D0、D1、D2三个引脚连接了板载按键实现了人机交互。实操心得购买时请注意市面上有些ESP32-S2开发板不带屏幕务必确认型号中包含“Reverse TFT”。另外首次使用前建议先单独给板子通上USB电源测试屏幕和按键是否正常排除硬件故障。2.2 核心传感器MAX17048锂电池电量计为什么不用简单的电压分压电路来测电池电压因为锂电池的放电曲线并非线性。电压在电量中间段变化很平缓快到没电时又会急剧下降。仅靠电压很难准确判断“还剩50%”还是“还剩30%”。MAX17048解决了这个问题库仑计原理它通过监测流入和流出电池的电荷电流对时间的积分来直接计算剩余容量精度通常在±1%以内。无需校准芯片出厂时已针对典型锂电池特性进行建模对于标准锂聚合物电池上电即可获得相对准确的读数无需用户进行复杂的充放电循环校准。超低功耗自身工作电流极低约7µA几乎不会给电池带来额外负担非常适合长期监测场景。在电路中它仅通过SDA和SCL两根线连接到ESP32-S2的I2C接口VCC接3.3VGND接地硬件连接极其简单。2.3 电源与连接件锂电池项目推荐了从100mAh到2000mAh多种容量的电池。选择的关键在于尺寸和续航的平衡。1200mAh电池是兼顾容量和外壳尺寸的甜点选择。对于需要长时间待机的项目2000mAh是更好的选择但需确认其物理尺寸是否能放入电池仓。JST-PH延长线这是一个非常实用但容易被忽视的小配件。它的作用是将电池接口从板子上延伸出来。如果没有它每次更换电池都需要打开外壳、拔插板子上的接口非常麻烦且可能损坏接口。使用延长线后电池可以像手机电池一样轻松插拔大大提升了设备的可维护性。USB数据线与电源必须使用能传输数据的USB-C线。很多廉价的充电线只有电源线没有数据线会导致电脑无法识别CIRCUITPY磁盘。电源适配器选择5V1A即5W即可足以满足ESP32-S2工作和电池充电的需求。2.4 结构件3D打印外壳与螺丝外壳的设计体现了产品化思维免螺丝卡扣前后盖采用卡扣式设计一按即合无需工具即可开合方便调试。可调视角外壳与底座之间设计有转轴可以让设备以不同角度站立适应不同的摆放场景。专用的电池仓为特定型号的电池设计了 snug fit紧配合的仓位防止电池在内部晃动。硬件清单你需要准备4颗M2.5x6mm螺丝用于固定主板和底座2颗M2x6mm螺丝配合尼龙柱用于固定主板。这些规格的螺丝在电子DIY市场很常见。3. 软件环境搭建与CircuitPython入门对于不熟悉嵌入式开发的朋友来说CircuitPython可能是你遇到过的最友好的开发方式。它完全颠覆了传统的“编写-编译-烧录”流程。3.1 CircuitPython固件刷写首先我们需要让开发板“变身”为一台CircuitPython设备。下载固件访问 circuitpython.org 在搜索框中输入“Feather ESP32-S2 Reverse TFT”找到对应的板子型号下载最新的.uf2格式固件文件。进入引导加载模式用USB线连接开发板和电脑。快速双击板子上的复位按钮RST。此时板载的RGB LED会先变成绿色然后迅速变为紫色。关键操作是在LED变成紫色的瞬间再次快速单击复位按钮。如果成功电脑上会出现一个名为FTHRS2BOOT的U盘。拖放烧录将刚才下载的.uf2文件直接拖入FTHRS2BOOT盘符。拖入后该盘符会自动消失稍等片刻电脑上会出现一个新的名为CIRCUITPY的盘符。恭喜刷写完成踩坑记录这里最常见的失败原因是“双击复位”的节奏不对。如果第一次没成功多试几次。另一个常见问题是USB线务必使用数据线。如果电脑只提示“充电”换根线试试。3.2 项目文件部署项目运行需要代码、库和资源文件。我们需要将这些文件放到CIRCUITPY盘中。下载项目包从Adafruit学习页面找到本项目的“Download Project Bundle”按钮下载一个ZIP压缩包。解压并复制解压ZIP包后你会看到以下关键文件和文件夹code.py主程序文件设备上电后自动运行的就是它。lib/文件夹包含所有必要的CircuitPython库文件。bat_bg.bmp屏幕背景图片。roundedHeavy-26.bdf和roundedHeavy-46.bdf两种尺寸的字体文件。将lib整个文件夹、以及code.py、.bmp和两个.bdf文件全部复制到CIRCUITPY盘的根目录下。复制完成后你的CIRCUITPY盘应该看起来结构清晰而不是一堆散乱的文件。3.3 核心配置文件settings.toml详解这是CircuitPython 8.x版本引入的新特性用于安全地管理敏感信息。它的重要性堪比你家门的钥匙。为什么不用secrets.py而用settings.tomlsettings.toml是新的标准语法更规范支持注释并且是未来发展的方向。它的核心目的是将Wi-Fi密码、API密钥等敏感信息与主程序code.py分离。这样你可以放心地将code.py分享到GitHub而不用担心泄露隐私。创建你的settings.toml文件在CIRCUITPY盘根目录下新建一个文本文件。将其重命名为settings.toml注意扩展名是.toml不是.txt。用文本编辑器如VS Code、Notepad甚至系统自带的记事本打开它输入以下内容# 你的Wi-Fi网络配置 CIRCUITPY_WIFI_SSID 你的Wi-Fi名称 CIRCUITPY_WIFI_PASSWORD 你的Wi-Fi密码 # 你的Adafruit IO账户信息 AIO_USERNAME 你的Adafruit IO用户名 AIO_KEY 你的Adafruit IO Active Key关键细节与避坑指南变量名必须严格匹配代码中通过os.getenv(AIO_USERNAME)来读取。这里的‘AIO_USERNAME’必须和settings.toml中的AIO_KEY完全一致包括大小写。这是最常见的连接失败原因之一。Adafruit IO Key获取登录Adafruit IO网站点击右上角头像进入“My Key”那里有一串长字符串就是AIO_KEY。注意不是你的登录密码。文件编码建议使用支持“UTF-8 without BOM”编码的编辑器保存。在Windows记事本中保存时选择“另存为”在编码下拉框中选择“UTF-8”。即时生效修改settings.toml文件后无需重启板子CircuitPython会自动重新读取。但如果你修改了Wi-Fi信息可能需要手动复位或等待代码中的重连逻辑触发。4. 代码深度解析与工作原理光把文件拷进去能跑起来但理解代码如何工作才能让你真正掌握这个项目并能够根据自己的需求进行定制。我们来逐段拆解code.py。4.1 初始化与网络连接代码开头导入了一堆库这是CircuitPython项目的标准做法。重点关注以下几个wifi和socketpool负责Wi-Fi连接和网络套接字管理。adafruit_max1704xMAX17048芯片的驱动库封装了读取电压、电量的复杂操作。adafruit_io与Adafruit IO云平台通信的核心库。displayio,vectorio,adafruit_display_text负责在TFT屏幕上绘制图形和文字。# 状态变量初始化 send_io True # 控制是否向Adafruit IO发送数据 bat_clock ticks_ms() # 记录上次读取电池的时间戳 bat_timer 60 * 1000 # 读取电池的间隔60秒 first_run True # 首次运行标志这里定义了四个全局状态变量。bat_timer 60 * 1000意味着每60000毫秒即1分钟读取一次电池数据这是一个平衡了实时性和功耗的间隔。first_run确保设备一启动就立即读取一次电池数据而不是等待第一个60秒过去。网络连接部分逻辑清晰# 从settings.toml读取配置 aio_username os.getenv(AIO_USERNAME) aio_key os.getenv(AIO_KEY) # 连接Wi-Fi wifi.radio.connect(os.getenv(CIRCUITPY_WIFI_SSID), os.getenv(CIRCUITPY_WIFI_PASSWORD)) # 创建网络会话和Adafruit IO对象 pool socketpool.SocketPool(wifi.radio) requests adafruit_requests.Session(pool, ssl.create_default_context()) io IO_HTTP(aio_username, aio_key, requests) # 获取或创建名为“battery-monitor”的数据流Feed try: battery_feed io.get_feed(battery-monitor) except AdafruitIO_RequestError: battery_feed io.create_new_feed(battery-monitor)这段代码的健壮性体现在try-except块。它先尝试获取一个已有的名为battery-monitor的Feed如果不存在比如第一次运行就自动创建一个。这样你无需提前在Adafruit IO网页上手动创建Feed代码帮你完成了初始化。4.2 图形用户界面构建这是项目中比较有趣的部分它展示了CircuitPython的displayio图形框架的基本用法。创建显示组displayio.Group()就像一个图层容器或画布。我们创建了两个组group图形界面和textOnly_group纯文本界面。通过切换board.DISPLAY.root_group指向哪个组就能实现整个屏幕显示的切换。调色板displayio.Palette定义了一组颜色。这里定义了5种颜色红、黄、绿、蓝、黑后续的矢量图形矩形、圆会引用这些颜色的索引。矢量图形rect代表电池电量的矩形条。它的width和x坐标会根据电量百分比动态变化产生“电量填充”的动画效果。circle一个蓝色小圆点作为“数据正在上传至IO”的指示灯。text_bg一个黑色矩形作为纯文本模式下百分比数字的背景板用于提高对比度。位图与字体bat_bg.bmp被加载为背景图并通过make_transparent(0)将其中的紫色调色板索引0设为透明从而露出后面的图形。加载了两种尺寸的.bdf点阵字体文件分别用于图形模式的小字和纯文本模式的大字。创建了多个Label对象来显示电压和百分比的文本并精确设置了它们的位置x, y坐标和对齐方式anchor_point和anchored_position。4.3 按键与传感器驱动# 按键初始化 button0 digitalio.DigitalInOut(board.D0) button0.direction digitalio.Direction.INPUT button0.pull digitalio.Pull.UP # D0按键使用内部上拉电阻 button1 digitalio.DigitalInOut(board.D1) button1.direction digitalio.Direction.INPUT button1.pull digitalio.Pull.DOWN # D1和D2使用内部下拉电阻 button2 digitalio.DigitalInOut(board.D2) button2.direction digitalio.Direction.INPUT button2.pull digitalio.Pull.DOWN这里有一个非常重要的硬件细节三个按键的初始化方式不同。D0按键被设置为Pull.UP上拉这意味着当按键未按下时单片机读取到的button0.value为True高电平按下时引脚接地读取到False低电平。而D1和D2是Pull.DOWN下拉未按下时为False按下时为True。这种差异源于板子上的实际电路设计代码必须与之匹配否则按键逻辑会完全相反。MAX17048的初始化则非常简单利用I2C总线自动发现设备monitor adafruit_max1704x.MAX17048(board.I2C()) monitor.activity_threshold 0.01 # 设置电量变化阈值低于此值不更新4.4 主循环逻辑与状态机整个项目的“大脑”在while True循环里。它主要干三件事扫描按键、定时读取电池、更新显示和云端。按键处理采用了典型的“边沿检测”防抖逻辑# 1. 复位按键状态当按键释放时 if button0.value and button0_state: # 如果D0现在是高电平已释放且之前记录为按下状态 button0_state False # 则复位状态为下一次按下做准备 # 2. 检测按键按下下降沿或上升沿 if not button0.value and not button0_state: # 如果D0是低电平按下且状态是未按下 button0_state True # 标记为已按下 send_io not send_io # 切换发送状态 # ... 更新指示灯颜色这种逻辑确保了每次物理按键按下只触发一次动作避免了因按键抖动或长按导致的重复触发。电池读取与显示更新 每60秒或首次运行时代码会执行以下操作monitor.cell_voltage和monitor.cell_percent读取精确的电压和百分比。使用map_range函数将百分比0-100映射到矩形条的长度0-72像素和位置。这是实现电量条动态增长的核心计算。调用get_color()函数根据电量百分比返回对应的调色板索引红、黄、绿从而改变矩形条颜色。更新所有文本标签的内容。最关键的一步如果send_io为True且电量100%则执行io.send_data(battery_feed[key], battery_percent)将数据点发送到Adafruit IO云端。深度优化建议这里的bat_timer是固定的60秒。在实际部署中你可以根据电池状态动态调整这个间隔。例如当电量高于80%时可以每小时检查一次当电量低于20%时可以每10秒检查一次实现更智能的功耗管理。这只需要在循环中加入一些判断逻辑来修改bat_timer的值即可。5. Adafruit IO云端触发配置实战硬件和代码让设备具备了“感知”和“思考”的能力而Adafruit IO则赋予了它“通信”和“行动”的翅膀。这一步是实现远程通知的关键。5.1 创建触发器与动作Adafruit IO的“Actions”功能就像一个自动化机器人当满足某个条件时它就执行你预设的任务。登录与导航访问 io.adafruit.com 用你的账户登录。在左侧边栏找到并点击“Actions”。创建新动作点击“New Action”按钮。系统会询问你是否使用Blockly图形化编程选择“Yes, use Blockly!”。这比写代码简单直观得多。设置触发条件在左侧区块列表中点击“Triggers”菜单将其展开。找到“Reactive”区块将其拖拽到画布上的“Trigger”区域。这个“Reactive”触发器意味着当某个Feed的数据发生变化时检查是否满足条件。配置触发器细节点击“Values”菜单找到“Feed”区块拖到“Reactive”区块的“Feed”插槽上。在弹出的下拉菜单中选择我们代码里创建的那个battery-monitor。再次点击“Values”找到“A number, whole or decimal”区块拖到“Feed or Value”插槽。在区块的输入框里手动输入数字100。在“Reactive”区块中间的下拉菜单中将运算符选择为“”大于等于。至此触发器逻辑已设定为“当 battery-monitor 这个Feed的数据大于等于100时触发动作”。5.2 配置邮件通知动作触发器告诉我们“什么时候做”动作则定义“做什么”。在左侧区块列表点击“Actions”菜单找到“Email”区块将其拖拽到画布上的“Action”区域。在“Email”区块中填写邮件的主题和正文。例如Subject主题:[电池监控器] 电池已充满Body正文:您监控的电池电量已达到 ${value}%充电已完成。时间${time}。注意这里的${value}和${time}是Adafruit IO提供的占位符发送时会自动替换为实际的数据值和时间戳。最关键的一步——指定收件人在“Email”区块下方有一个“to”字段。你必须在这里填入你Adafruit IO账户注册时使用的邮箱地址。Adafruit IO目前只支持向账户绑定邮箱发送通知。如果你想发送到其他邮箱需要先在账户设置中添加并验证该邮箱。可选关联数据从“Values”中再拖一个“Feed”区块到“using”插槽并再次选择battery-monitor。这样邮件中可以使用该Feed的最新数据。点击右上角的“Save”按钮保存整个Action。5.3 测试与验证保存后这个自动化工作流就生效了。如何测试呢确保你的设备已上电、联网并且send_io状态为开启蓝色指示灯亮起。为设备接上USB电源开始给电池充电。打开Adafruit IO网站上battery-monitor这个Feed的详情页你应该能看到数据点随着时间在增加。当电量达到100%时你可能需要稍微等待一下数据上传和系统处理检查你的注册邮箱应该会收到一封通知邮件。高级技巧与排查短信通知Adafruit IO也支持Twilio集成来发送短信配置流程与邮件类似但需要额外的Twilio账户和API配置。延迟问题从数据上传到邮件发出可能有1-2分钟的延迟这是云端服务处理的正常时间。没有收到邮件首先检查Adafruit IO的“Activities”日志看Action是否被触发。其次检查垃圾邮件文件夹。最后确认“Email”动作中的“to”地址是否正确。多级警报你可以创建多个Action。例如再创建一个触发器为“当电量 20%时”动作是发送一封主题为“电量告急”的邮件实现低电量预警。6. 机械组装与调试要点有了稳定运行的软件我们需要一个坚固、美观且实用的“家”来安置它。3D打印外壳的组装过程虽然不复杂但细节决定成败。6.1 3D打印与后处理下载与切片从项目页面下载STL文件。使用Cura、PrusaSlicer等软件进行切片。关键参数建议层高0.2mm在打印速度和表面光洁度间取得平衡。填充率15%-20%即可结构件不需要太高强度。支撑按照设计说明这些部件无需支撑。请确保打印机床平整第一层附着良好以实现部件的悬空部分成功打印。材料PLA是最佳选择易于打印且强度足够。PETG更耐用、耐温但打印难度稍高。打印后处理打印完成后仔细移除底部的裙边brim或 raft如果有。用镊子或小刀清理螺丝孔内的少量拉丝确保螺丝能顺畅拧入。对于卡扣和转轴部位如果感觉过紧可以使用细砂纸如600目轻轻打磨结合面直到活动顺滑但又不松动。6.2 电路板安装步骤主板固定将Feather ESP32-S2主板屏幕朝上对齐后盖上的四个安装孔。使用2颗M2x6mm螺丝配合2个M2尼龙隔离柱先将主板垫高并固定。这一步的目的是避免主板背面的元器件与塑料外壳直接接触导致短路。然后使用2颗M2.5x6mm螺丝将主板牢牢固定在后盖上。连接延长线将JST-PH延长线的公头带引脚的一端牢固地插入主板上的电池接口。这是一个关键防呆步骤务必确认插头的红线对应主板上标有“”或“VBAT”的一侧。插反会烧毁主板。外壳合体先将前壳与电池托盘对齐用2颗M2.5x6mm螺丝从底部将其固定。将组装好的后盖模块已接好延长线靠近前壳小心地将延长线的母头插座端穿过外壳侧面的预留缺口。最后对准前后壳的卡扣均匀用力将其按压直到听到清晰的“咔嗒”声表示卡扣已完全啮合。切勿使用蛮力如果无法合拢检查是否有线材被压住或卡扣未对齐。6.3 电池安装与首次上电连接电池将电池的JST插头插入延长线的母头。同样确认红线对红线正极。放入电池仓将电池平整地放入底座的电池仓内。如果电池尺寸合适它会有一个 snug fit不会晃动。首次通电此时一旦电池接好设备应立即启动屏幕亮起。你可以看到它尝试连接Wi-Fi并最终显示电池电压和百分比。充电测试使用5V1A的USB电源适配器和数据线插入主板的USB-C口进行充电。屏幕上显示的百分比应逐渐上升。当接近100%时观察Adafruit IO指示灯蓝色圆点是否闪烁表示数据上传并最终检查你的邮箱是否收到通知。组装避坑清单螺丝滑丝塑料件拧螺丝时力度要适中感觉拧紧即可不要过度用力导致螺柱开裂。屏幕排线Feather ESP32-S2 Reverse TFT的屏幕是直接焊死的无需担心排线。但如果是其他分体屏幕务必小心操作排线避免折损。Wi-Fi连接失败如果屏幕一直卡在连接Wi-Fi首先检查settings.toml中的SSID和密码是否正确注意大小写和特殊字符。其次检查路由器是否设置了MAC地址过滤。可以将设备靠近路由器试试。电量显示不准MAX17048在电池长期存放后可能需要一次完整的充放电循环来“学习”电池容量以达到最高精度。首次使用显示略有偏差是正常的。7. 项目扩展思路与高级应用至此一个基础的电池监控器已经完成。但它的潜力远不止于此。你可以基于这个框架扩展出更多实用的功能。7.1 功能扩展多电池监控利用ESP32-S2的另一个I2C接口可以连接多个MAX17048芯片每个芯片有唯一地址同时监控多节电池的电压和电量适用于电池组或冗余电源系统。本地数据记录虽然数据上传到了云端但网络中断时数据会丢失。可以添加一个SPI接口的MicroSD卡模块让设备每分钟将电池数据时间戳、电压、百分比以CSV格式写入SD卡实现离线备份。低功耗深度睡眠对于纯粹监控、无需常亮屏幕的场景可以修改代码。让设备每分钟唤醒一次读取传感器数据、通过Wi-Fi上传、然后立即进入深度睡眠模式。这可以将待机电流从几十mA降低到几百µA使电池续航从几天延长到数月。自定义报警阈值将代码中的100%触发条件改为一个可配置的变量。你可以在settings.toml里增加一个LOW_BATTERY_THRESHOLD 20的配置当电量低于此值时触发另一个Adafruit IO Action发送“低电量警告”邮件。7.2 集成到现有项目这个监控器本身可以作为一个独立的模块集成到你更大的物联网项目中。作为子模块你的主控设备比如树莓派或另一块ESP32可以通过UART串口与这块Feather通信定期询问它获取电池状态从而在主系统中实现更复杂的电源管理策略。提供HTTP API利用ESP32-S2的Wi-Fi能力在代码中启动一个简单的Web服务器。当其他设备访问http://[设备IP]/battery时返回一个JSON数据{voltage: 3.85, percent: 65}使其成为一个网络化的电池状态查询服务。7.3 故障排除与维护即使一切顺利长期运行中也可能遇到问题。这里有一个快速排查指南现象可能原因排查步骤屏幕不亮1. 电池没电或接反2. 主板损坏1. 用USB供电测试检查电池接口极性。2. 连接电脑查看CIRCUITPY盘是否存在。屏幕亮但无数据显示1. MAX17048连接问题2. 代码未运行1. 检查I2C连线SDA/SCL是否松动。2. 查看串口输出使用Mu编辑器或screen/putty连接串口。无法连接Wi-Fi1.settings.toml配置错误2. 网络问题1. 确认SSID/密码正确文件在根目录。2. 检查路由器是否工作设备是否在信号范围内。Adafruit IO无数据1.AIO_KEY错误2. 网络防火墙3.send_io被关闭1. 重新生成并复制AIO Key。2. 尝试手机热点排除网络问题。3. 按D0键确认蓝色指示灯亮起。电量显示长时间不变或跳动1. 电池老化2. I2C总线干扰1. 尝试对电池进行一次完整的充放电。2. 确保I2C走线短并远离电源线。这个项目从一颗芯片、一块开发板开始最终构建了一个具备本地显示、云端通知的完整物联网解决方案。它最宝贵的价值在于提供了一个清晰、可复现的范式如何用CircuitPython快速原型如何利用成熟云服务Adafruit IO实现智能化以及如何通过3D打印完成产品化封装。希望这份详细的指南不仅能帮你成功复现这个项目更能激发你用它去解决实际工作中遇到的电源管理难题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2620077.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…