news 2026/5/17 2:07:56

基于Feather M4与电子墨水屏的极低功耗温湿度监控器设计与实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于Feather M4与电子墨水屏的极低功耗温湿度监控器设计与实现

1. 项目概述与核心价值

如果你也和我一样,喜欢在家里囤点干货、茶叶,或者是个电子元件爱好者,总担心储物罐里的环境温湿度不合适,那这个项目你一定会感兴趣。我最近动手做了一个基于Feather M4和电子墨水屏的温湿度监控器,它就像一个不知疲倦的“环境哨兵”,能持续监测罐子内部的状况,一旦温湿度越界就立刻报警,而平时则依靠电子墨水屏的特性,在完全断电的情况下依然显示着上一次的读数。这不仅仅是又一个简单的传感器读数项目,它融合了低功耗设计、持久化显示和用户可配置交互,是一个相当完整的嵌入式系统实践案例。

这个监控器的核心目标是解决密封存储环境下的温湿度监控问题。无论是防止中药材受潮发霉,还是确保摄影器材干燥,甚至是给心爱的雪茄找个安稳的家,它都能派上用场。其工作原理并不复杂:主控芯片Feather M4 Express定时(例如每小时)从SI7021传感器读取一次温湿度数据,与用户预设的安全范围进行比较,然后将结果刷新到电子墨水屏上。如果数据异常,它会通过蜂鸣器发出警报,直到环境恢复正常或用户手动干预。整个系统的“大脑”运行着用CircuitPython编写的固件,这使得开发和调试变得异常简单,即使你不是嵌入式开发老手也能轻松上手。

我选择这个方案,主要是看中了它的实用性可玩性。实用性在于,电子墨水屏(eInk)的零功耗显示特性,让设备在两次测量间隔可以彻底断电,仅由一颗小小的定时芯片TPL5111唤醒,这使得一颗1200mAh的锂电池可以轻松工作数月。可玩性在于,CircuitPython带来了类似桌面Python的开发体验,你可以随时通过USB连接电脑,像修改文本文件一样更新代码和配置文件,调整报警阈值、显示标题,甚至自定义报警音效,完全摆脱了传统嵌入式开发中编译、烧录的繁琐流程。接下来,我就带你从硬件选型到代码实现,完整地拆解这个项目的每一个细节。

2. 硬件选型与设计思路解析

2.1 主控板:为什么是Feather M4 Express?

在早期的版本中,项目使用了Trinket M0。这次升级到Feather M4 Express,是一个质的飞跃。Trinket M0虽然小巧便宜,但其有限的IO引脚和性能,制约了功能的扩展,比如驱动一个需要多条控制线的电子墨水屏就显得捉襟见肘。

Feather M4 Express的核心是ATSAMD51 Cortex-M4处理器,运行频率高达120MHz,并拥有512KB的Flash和192KB的RAM。这为运行CircuitPython提供了充裕的空间。我选择它,主要基于以下几点考量:

  1. 丰富的IO与内置充电管理:Feather板载了锂电池充电芯片和JST PH连接器,这意味着你可以直接接上一块3.7V的锂聚合物电池,并通过USB口为电池充电,无需额外的充电模块或复杂的电源管理电路。这对于需要长期离线工作的设备来说是至关重要的便利。
  2. CircuitPython的完美支持:Adafruit对Feather M4的CircuitPython支持非常成熟,驱动库丰富,社区资源也多。用Python写嵌入式逻辑,调试和迭代的速度远超传统的C/C++。
  3. 引脚布局与扩展性:Feather标准的引脚排列和丰富的模拟、数字、PWM、I2C、SPI接口,使得连接传感器、显示屏和其他外设变得非常直观。未来如果你想增加更多传感器(如光照、气压),也有足够的余地。

注意:市场上也有其他强大的开发板,如ESP32系列,其自带Wi-Fi/蓝牙,更适合需要联网的场景。但本项目核心需求是极致的低功耗和简单可靠,无线功能会带来额外的功耗和复杂度,因此Feather M4的“纯粹”与“高效”更符合定位。

2.2 传感器:SI7021的可靠性与精度

温湿度传感器选择SI7021,是一个经过市场检验的稳妥决定。相比常见的DHT11/DHT22,SI7021采用I2C接口,通信更稳定,精度和响应速度也更高(湿度精度±3% RH,温度精度±0.4°C)。

它的接口极其简单,只需要连接VCC、GND、SCL、SDA四根线。其内部集成了信号处理电路,直接输出校准后的数字值,省去了微控制器进行复杂模拟信号处理和补偿的麻烦。在代码中,我们只需调用adafruit_si7021库,几行代码就能轻松读取数据,非常省心。

在实际部署时,你需要考虑传感器的放置。为了准确测量罐内环境,最好用一根杜邦线将传感器模块引到罐子内部,而主控板留在外部。确保传感器周围空气流通,不要被物品直接包裹,同时要做好引线处的密封,以维持罐内的密闭环境。

2.3 显示模块:电子墨水屏的零功耗魅力

本项目最大的亮点之一就是这块1.54英寸、152x152像素的三色(黑、白、红)电子墨水屏。选择它,而非传统的LCD或OLED,原因只有一个:功耗

电子墨水屏的工作原理是通过电场控制带电荷的颜料颗粒移动,一旦图像刷新完成,即使完全断电,图像也能保持数月不变。这意味着我们的设备99%的时间都可以处于深度睡眠状态,只有每秒一次唤醒刷新屏幕的那几秒钟需要消耗能量。这对于电池供电的设备而言,是革命性的优势。

当然,它也有缺点:刷新速度慢(全屏刷新需要2-3秒),且有刷新次数寿命。但在每小时才更新一次数据的监控器上,这两个缺点几乎可以忽略不计。三色屏的加入,让我们可以用红色高亮显示报警信息,视觉提示非常醒目。

这块屏通过SPI接口与Feather通信,除了电源和SPI引脚(SCK, MOSI, MISO),还需要额外的控制引脚(ECS, DC, SRCS, RST, BUSY)。Feather M4丰富的IO资源完美满足了这一需求。

2.4 电源与定时管理:TPL5111的精准守夜人

如何实现每小时唤醒一次?这里用到了一个精巧的芯片:TPL5111低功耗定时器。它的作用就像一个严格的“守夜人”。

TPL5111的核心功能是,在设定的时间间隔后,将其DONE引脚拉高(或拉低,可配置)。我们将Feather M4的EN(使能)引脚连接到TPL5111的DONE引脚。平时,TPL5111输出低电平,Feather处于断电状态。当定时时间一到,TPL5111将DONE拉高,瞬间给Feather上电。Feather启动后,第一件事就是通过一个GPIO口(本例中是A4)将DONE信号主动拉低,告诉TPL5111:“我醒了,计时暂停”。然后Feather执行测量、显示、报警等所有任务。任务完成后,Feather再将DONE拉高,TPL5111检测到高电平,立即切断Feather的电源,并开始下一轮的定时。

这种设计实现了近乎零的待机功耗(只有TPL5111自身的微安级电流)。定时精度由TPL5111的外接电阻决定。为了获得更精确、更稳定的定时,我建议剪断板载电位器的调节走线,改用一颗精密贴片电阻。根据数据手册,定时时间T = (R * 0.1) + 0.5秒,其中R是电阻值(单位千欧)。例如,要实现1小时(3600秒)唤醒,可以计算所需电阻:R = (T - 0.5) / 0.1 = (3600 - 0.5) / 0.1 = 35995 kΩ,即约36MΩ。你可以选择一个接近的标准值电阻。

一个关键的硬件技巧:Feather M4的GPIO在上电初始瞬间是浮空状态,可能为高电平。如果TPL5111在Feather还没准备好拉低DONE引脚时就检测到了高电平,它会误以为任务已完成,立即断电,导致系统无法启动。解决方法是在Feather的DONE控制引脚(A4)和地(GND)之间,并联一个100nF(0.1uF)的电容。这个电容在上电瞬间会短暂地将该引脚电压拉低,为Feather的固件运行争取到几十毫秒的初始化时间,等Feather的GPIO配置完成并输出低电平时,电容也充电完毕,系统便稳定进入工作状态。这个小电容是系统可靠启动的保障,必不可少。

2.5 其他外围器件

  • 蜂鸣器:选择一个无源压电蜂鸣器。注意,它需要PWM方波驱动才能发声,不能直接接电源。我们使用Feather的PWM引脚(D5)来控制它。
  • 按钮:一个轻触开关,用于消警和进入编辑模式。连接时需启用内部上拉电阻,这样平时读到的就是高电平,按下时变为低电平。
  • 电池:一块3.7V、1200mAh的锂聚合物电池,通过Feather的JST接口连接即可。这个容量对于本项目来说绰绰有余。

3. 电路连接与原型制作要点

3.1 完整接线图与原理

根据上面的分析,我们可以整理出清晰的接线表。请务必在通电前仔细核对。

Feather M4 Express 引脚连接至说明
VBAT锂电池正极供电输入
GND锂电池负极、所有模块GND公共地
ENTPL5111DONE引脚电源使能控制
A4TPL5111DONE引脚控制TPL5111定时
并联100nF电容到GND确保可靠启动
3.3VSI7021 VIN, eInk屏 VCC, TPL5111 VDD3.3V电源输出
GNDSI7021 GND, eInk屏 GND, TPL5111 GND电源地
SCLSI7021 SCLI2C时钟线
SDASI7021 SDAI2C数据线
SCKeInk屏 SCKSPI时钟线
MOSIeInk屏 MOSISPI数据输出线
MISOeInk屏 MISOSPI数据输入线(本项目未用,但需连接)
D6eInk屏 RST复位引脚
D9eInk屏 SRCSSRAM片选(本屏内置SRAM)
D10eInk屏 DC数据/命令选择
D11eInk屏 ECS片选引脚
D12eInk屏 BUSY忙状态指示
D5蜂鸣器正极PWM输出驱动蜂鸣器
A5按钮开关一端按钮信号输入
按钮开关另一端连接GND

接线实操心得

  1. 电源优先:首先连接所有模块的电源(3.3V和GND),确保供电正常再连接信号线。
  2. I2C上拉电阻:SI7021模块通常已集成上拉电阻。如果传输距离较长或干扰大,可以在SCL和SDA线上各加一个4.7kΩ的上拉电阻到3.3V。
  3. SPI线序:SPI接口的线序(SCK, MOSI, MISO)必须一一对应,接反了屏幕不会有任何反应。
  4. 按钮防抖:虽然代码中通过延时进行了软件防抖,但在硬件上,在按钮两端并联一个0.1uF的电容,可以更好地滤除触点抖动,让检测更稳定。

3.2 原型制作与封装建议

原项目作者使用了万用板和飞线焊接,然后固定在一个3D打印的广口瓶盖子上。这是一个非常实用的原型方案。

制作步骤

  1. 焊接主控板:将Feather M4、TPL5111、蜂鸣器、按钮以及必要的电阻电容焊接在一小块万用板上。注意元器件布局要紧凑,但也要为连接屏幕和传感器的排针留出空间。
  2. 处理TPL5111:使用美工刀或烙铁,小心地割断TPL5111模块背面的“Trim”走线(断开板载电位器),以及“LED”走线(禁用指示灯以省电)。然后焊接上你计算好的定时电阻。
  3. 连接屏幕与传感器:使用排针和杜邦线,将屏幕和传感器作为可插拔模块连接到主控板。这样方便调试和更换。
  4. 制作密封盖:如果你有3D打印机,可以设计或下载一个适配你存储罐的盖子模型,并在上面预留安装主控板和屏幕的孔位。没有打印机的话,也可以使用厚亚克力板或塑料板手工制作。关键是要处理好传感器线的穿孔,可以使用热熔胶或专用的电缆防水接头(格兰头)进行密封,以保证罐内的气密性。
  5. 整体组装:将主控板用螺丝或尼龙柱固定在盖子上方,屏幕嵌入开孔中。传感器模块用延长线引入罐内,并妥善固定,避免直接接触物品。

注意事项:在最终封装前,务必进行完整的系统测试。包括:上电能否正常启动、屏幕显示是否正常、按钮功能、传感器读数、报警触发与消警、以及最重要的——TPL5111定时唤醒功能是否工作。你可以先将定时电阻换成一个较小阻值的(例如对应10秒),快速测试几个睡眠-唤醒周期。

4. 软件架构与CircuitPython代码深度解析

4.1 工程结构与文件说明

将Feather M4通过USB连接到电脑,它会显示为一个名为CIRCUITPY的U盘。我们的所有代码和配置文件都将放在这里。

CIRCUITPY/ ├── code.py # 主程序,系统启动后自动运行 ├── settings.txt # 用户配置文件,定义报警阈值等参数 ├── description.txt # 显示在屏幕上的描述文本 ├── font.py # 8x8点阵字体文件 └── lib/ # 库文件目录 ├── adafruit_bus_device/ ├── adafruit_epd/ └── adafruit_si7021.mpy
  • code.py:这是CircuitPython的入口文件,相当于Arduino的sketch.ino。系统启动后会自动执行这个文件。
  • settings.txt:一个文本文件,用于配置温度/湿度范围、报警参数等。修改这个文件就能改变设备行为,无需重写代码。
  • description.txt:最多4行,每行最多19个字符的文本,会显示在屏幕中央,用于标注罐内物品信息。
  • font.py:包含了一个8x8像素的ASCII字符点阵数据。由于CircuitPython的显示库可能不包含小字体,我们自定义这个字体文件来渲染文本。
  • lib/目录:存放项目依赖的第三方库。你需要从Adafruit的CircuitPython库包中,将adafruit_bus_deviceadafruit_epdadafruit_si7021这三个库复制到这里。

4.2 核心代码流程剖析

让我们深入code.py,看看这个监控器是如何工作的。

4.2.1 生死攸关的第一行代码:稳住电源

系统上电后,CircuitPython运行时环境会先初始化,然后才执行我们的code.py。但TPL5111定时器可能比这更快地检测DONE引脚状态。因此,代码最开头的任务不是导入库,而是立即配置并拉低控制TPL5111的DONE引脚

import digitalio import board done = digitalio.DigitalInOut(board.A4) done.direction = digitalio.Direction.OUTPUT done.value = False # 关键!告诉TPL5111“我还在工作,别断电”

这四行代码是系统稳定运行的“定海神针”。它抢在TPL5111可能误判之前,强行将控制线置于安全状态。

4.2.2 硬件初始化与默认配置

稳住电源后,便可以安心初始化其他硬件了。这部分代码顺序清晰:

  1. 导入依赖:引入时间、PWM、总线IO、显示屏驱动和传感器驱动等库。
  2. 初始化SPI与电子墨水屏:按照屏幕驱动库的要求,配置所有控制引脚并创建显示对象。
  3. 初始化I2C与SI7021传感器:I2C通信是标准的,初始化后即可读取数据。
  4. 配置蜂鸣器与按钮:将蜂鸣器引脚设置为PWM输出,按钮引脚设置为输入并启用内部上拉电阻。
  5. 设置默认参数:创建一个settings字典,存放所有可配置参数的默认值。如果settings.txt文件不存在或配置错误,系统将使用这些默认值。
# 默认参数示例 settings['temperature_range'] = (15, 30) # 温度下限和上限,单位摄氏度 settings['humidity_range'] = (60, 70) # 湿度下限和上限,单位百分比 settings['title'] = 'Jar Minder' # 屏幕顶部显示的标题 settings['alarm_frequency'] = 4000 # 报警蜂鸣器频率,单位赫兹 settings['alarm_number_of_beeps'] = 3 # 每次报警循环的蜂鸣次数 settings['alarm_seconds_beep_on'] = 0.5 # 单次蜂鸣持续时间 settings['alarm_seconds_between_beeps'] = 0.5 # 蜂鸣间隔时间 settings['alarm_timeout'] = 60.0 # 报警持续总时间,超时后自动休眠

4.2.3 文本渲染引擎:自己动手“画”字

由于使用的adafruit_epd库可能没有内置小字号字体,或者为了极致控制,项目选择自己实现一个简单的位图字体渲染器。这就是font.pyrender_characterrender_string函数的作用。

font.py文件定义了一个庞大的列表bitmaps,其中每个元素对应一个ASCII字符的8x8点阵数据(用8个十六进制数表示)。render_character函数根据字符的ASCII码找到对应的点阵数据,然后遍历8行8列,如果某位是1,就在屏幕对应位置画一个黑色(或红色)的点;如果是0,就画白色(擦除)。

render_string函数则负责连续调用render_character,实现字符串的绘制。centered函数是一个简单的工具,根据字符串长度计算使其在152像素宽的屏幕上居中显示的起始X坐标。

这种做法的优劣

  • 优点:完全可控,不依赖外部字体文件,节省内存,渲染速度快。
  • 缺点:字体固定,只有一种大小,不支持中文等非ASCII字符。如果你需要显示中文,需要寻找包含中文字阵的库,或者使用支持TrueType字体渲染的更高性能主板。

4.2.4 编辑模式:一个巧妙的交互设计

设备如何知道用户想要修改配置呢?它没有键盘和复杂的菜单。这里用了一个非常巧妙的“上电检测”法。

在代码初始化完硬件后、读取配置文件前,会立刻检查按钮(silence_button)是否被按下:

if not silence_button.value: # 如果按钮在上电时就是按下的 # 1. 发出一声低音蜂鸣提示进入编辑模式 # 2. 在屏幕中央显示“EDIT MODE” # 3. 等待用户松开按钮,再等待用户再次按下按钮 # 4. 再次发出低音蜂鸣,退出编辑模式,继续正常启动流程

这个设计的精妙之处在于,它利用了一次完整的“按下-松开-再按下”作为触发信号,误触概率极低。进入编辑模式后,设备会保持上电状态,此时用户可以通过USB连接电脑,直接修改CIRCUITPY盘里的settings.txtdescription.txt文件。修改保存后,再次按下按钮,设备蜂鸣提示并重启,加载新的配置。整个过程无需重写代码,交互简单直观。

4.2.5 主循环逻辑:监测、显示与报警

如果不是编辑模式,设备就会进入正常的主工作流程:

  1. 读取配置与描述:打开settings.txtdescription.txt,将内容解析后存入变量。
  2. 清屏并绘制静态内容:清除屏幕缓冲区,在顶部绘制标题,在中间区域绘制描述文本。
  3. 读取传感器数据:从SI7021读取温度和湿度,并转换为整数。
  4. 显示传感器数据:在屏幕左右两侧固定位置绘制温度和湿度数值。
  5. 判断与报警提示
    • 将读数与settings中设定的范围比较。
    • 如果读数异常,则在屏幕下方用红色字体显示“HIGH/LOW TEMPERATURE/HUMIDITY”。
    • 同时在屏幕的顶部和底部绘制红色警示条,提供强烈的视觉警报。
  6. 报警处理循环
    • 如果数据正常,直接跳到第7步。
    • 如果数据异常,启动一个超时循环(时长由alarm_timeout设定)。
    • 在循环内,调用sound_alarm()函数,按照设定发出“哔-哔-哔”的报警声。
    • 在蜂鸣响起或间隔期间,持续检测按钮。如果用户按下按钮,则立即静音并跳出报警循环。
    • 如果超时时间到,也跳出循环。
  7. 任务完成,进入休眠:所有工作完成后,执行最后也是最重要的一步:done.value = True。这将DONE引脚拉高,TPL5111检测到信号,立即切断Feather的电源。设备进入深度睡眠,直到下一个定时周期到来。

4.3 关键函数详解

  1. check_for_push(button, duration): 这是一个非阻塞式的按钮检测函数。它会在指定的duration秒内,每0.1秒检查一次按钮状态。一旦检测到按下,立即返回True;如果超时都未按下,则返回False。这保证了在等待蜂鸣或报警间隔时,系统仍然能响应用户的消警操作。

  2. sound_alarm(): 报警发声函数。它按照配置的频率、次数、时长来驱动蜂鸣器。关键在于,每一次蜂鸣和每一次蜂鸣间的间隔,都包裹在check_for_push调用中。这意味着用户可以在蜂鸣响起的任何时候按下按钮来立即静音,交互响应非常及时。

  3. out_of_range(t, h): 简单的逻辑判断函数,检查当前读数是否超出预设范围。它是触发整个报警流程的“开关”。

5. 调试、优化与扩展方向

5.1 常见问题与排查实录

在制作和调试过程中,我遇到了几个典型问题,这里分享给大家:

问题1:设备上电后屏幕闪一下,然后立刻关机,无法正常工作。

  • 排查:这是最可能遇到的问题,根本原因就是前面提到的“电源竞争”问题。TPL5111过早地检测到了DONE引脚的高电平。
  • 解决
    1. 首先确认代码最开头是否有done.value = False这行代码,并且done引脚定义正确(A4)。
    2. 检查硬件,确保在Feather的A4引脚和GND之间,正确焊接了一个100nF(104)的瓷片电容。电容务必贴近引脚焊接。
    3. 用万用表测量TPL5111的DONE引脚在上电瞬间的电压变化,确认电容起到了延时作用。

问题2:屏幕显示乱码或者完全不显示。

  • 排查
    1. 接线错误:这是首要怀疑对象。请严格按照接线表,逐根检查SPI总线(SCK, MOSI, MISO)以及控制线(ECS, DC, RST, BUSY, SRCS)是否连接正确、接触良好。特别是BUSY线,必须连接,否则程序无法知道屏幕何时刷新完成。
    2. 库文件缺失或版本不匹配:确认lib文件夹下是否有adafruit_epd及其依赖库adafruit_bus_device。尝试从Adafruit官网下载最新的CircuitPython库包进行替换。
    3. 电源问题:电子墨水屏在刷新瞬间需要较大电流。确保你的电池电量充足,或者尝试通过USB供电测试,排除电池供电不足的可能。

问题3:传感器读数不准或为0。

  • 排查
    1. 检查SI7021的I2C接线(SDA, SCL)。
    2. 在代码中尝试扫描I2C设备地址,确认是否能找到SI7021(通常地址是0x40)。
    import board import busio i2c = busio.I2C(board.SCL, board.SDA) while not i2c.try_lock(): pass print([hex(x) for x in i2c.scan()]) i2c.unlock()
    1. SI7021对焊接温度敏感,过热可能损坏。检查传感器模块是否完好。

问题4:报警不响或按钮无效。

  • 排查
    1. 蜂鸣器是有源还是无源?本项目需使用无源蜂鸣器。有源蜂鸣器给电就响,无法通过PWM控制音调。
    2. 检查蜂鸣器正负极是否接反(虽然通常影响不大),以及是否接在了支持PWM的引脚(D5)上。
    3. 按钮接线是否正确?一端接A5,另一端接GND。代码中启用了内部上拉,所以按钮按下时,A5应读到低电平(False)。

5.2 功耗优化实测与电池寿命估算

低功耗是本项目的核心目标。我们来粗略估算一下电池寿命。

  • 睡眠电流:Feather M4被完全断电,电流为0。TPL5111的静态电流典型值为35nA(纳安级),几乎可以忽略不计。传感器、屏幕等均已断电。
  • 工作电流:设备唤醒后,主要耗电单元是Feather M4、SI7021和屏幕刷新。
    • Feather M4运行CircuitPython:约10-20mA。
    • SI7021测量时:约1.5mA。
    • eInk屏全屏刷新:峰值电流可达30mA以上,但持续时间很短(约2秒)。
  • 单次唤醒耗时:假设测量、计算、显示刷新、报警判断等所有操作在5秒内完成。
  • 唤醒间隔:设为1小时(3600秒)。

计算: 假设工作期间平均电流为15mA,工作5秒。 每小时耗电量 =15mA * (5 / 3600)h ≈ 0.0208 mAh。 1200mAh的电池,理论工作时间 =1200 / 0.0208 ≈ 57692 小时 ≈ 6.6 年

这只是一个非常理想化的理论值,实际中电池自放电、电路漏电、温度影响、报警状态(蜂鸣器耗电)都会缩短续航。但即便如此,持续工作几个月到一年是完全没有问题的。你可以通过增大TPL5111的定时电阻来延长唤醒间隔,从而进一步增加续航。

5.3 项目扩展与进阶玩法

这个项目的基础框架非常扎实,留下了很多扩展空间:

  1. 数据记录与历史趋势:为Feather M4增加一个微型SD卡模块,每次测量后将时间戳和读数写入CSV文件。这样你就能分析罐内环境的历史变化趋势。
  2. 无线传输与云端监控:将主控换成Adafruit Feather M4 Express with AirLift或者Feather ESP32-S2,集成Wi-Fi功能。设备唤醒后,可以将数据通过MQTT协议发送到Home Assistant、Blynk或自建的服务器上,实现手机远程监控和报警推送。
  3. 多传感器与融合判断:增加一个BME280传感器,同时获取温度、湿度、气压。气压数据可用于判断罐子是否被打开过(气压突变)。或者增加一个光照传感器,监控是否暴露在光线下。
  4. 改进人机交互
    • 增加更多按钮:实现模式切换、翻页查看历史数据等功能。
    • 使用旋钮编码器:在编辑模式下,可以更直观地调整阈值数值,而不用连接电脑修改文件。
  5. 美化显示与UI
    • 设计更美观的字体和图形:可以寻找或制作更小的像素字体,以显示更多信息。或者绘制简单的温度计、水滴图标。
    • 添加进度条或图表:用简单的条形图显示当前湿度/温度在设定范围内的相对位置。
  6. 制作专业PCB:如果你希望设备更小巧、更可靠,可以将目前的万用板电路设计成一块定制PCB。使用KiCad或EasyEDA等工具,把Feather M4的芯片、SI7021、TPL5111、蜂鸣器驱动等全部集成在一块板子上,只留下屏幕、电池和传感器作为外接模块。这能极大提升项目的完成度和专业性。

这个基于Feather M4和电子墨水屏的温湿度监控器,从一个具体的需求出发,串联了电源管理、传感器应用、低功耗显示和嵌入式Python编程等多个知识点。它不仅仅是一个可以用的工具,更是一个绝佳的学习平台。希望这份详细的拆解,能帮助你不仅成功复现它,更能理解其背后的设计思想,并激发出属于自己的创意和改进。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/17 2:06:43

规则引擎设计原理与实战:从RETE算法到生产级应用

1. 项目概述:一个为现代应用量身定制的规则引擎如果你正在开发一个需要处理复杂业务逻辑、决策流程或者动态权限控制的应用,比如一个电商促销系统、一个智能客服机器人,或者一个需要精细风控的金融产品,那么你大概率会遇到一个共同…

作者头像 李华
网站建设 2026/5/17 2:04:46

K-Means 聚类算法背后的数学原理

原文:towardsdatascience.com/the-math-and-code-behind-k-means-clustering-795582423666 https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/7a15ce1ee914788a5034a92c18a9b424.png 由 DALL-E 生成的图像 K-Means 聚类算法在机…

作者头像 李华
网站建设 2026/5/17 2:04:02

全志T113-S3开发板试用指南:从芯片解析到Qt与DSP实战

1. 项目概述与背景又到了“白嫖”开发板的时候了!这次的主角是米尔电子推出的基于全志T113-S3处理器的MYC-YT113X开发板。对于嵌入式开发者、物联网爱好者,甚至是高校学生来说,这类试用活动简直就是技术探索路上的“及时雨”。它不仅仅是一块…

作者头像 李华
网站建设 2026/5/17 2:02:00

免费在线UML绘图终极指南:5分钟掌握PlantUML文本驱动设计

免费在线UML绘图终极指南:5分钟掌握PlantUML文本驱动设计 【免费下载链接】plantuml-editor PlantUML online demo client 项目地址: https://gitcode.com/gh_mirrors/pl/plantuml-editor 还在为绘制复杂的UML图表而烦恼吗?你是否曾经花费数小时在…

作者头像 李华
网站建设 2026/5/17 2:01:07

开源火车模拟器Libre-TrainSim:基于Godot引擎的架构与开发实践

1. 项目概述与核心价值如果你是一个火车模拟游戏的爱好者,同时又对开源软件抱有热情,那么“Libre-TrainSim”这个名字很可能已经引起了你的注意。这不仅仅是一个游戏,它是一个雄心勃勃的开源项目,旨在构建一个完全自由、开放、可深…

作者头像 李华
网站建设 2026/5/17 1:59:05

Touchpoint:一种服务器优先的Web应用开发范式解析

1. 项目概述:一个被低估的现代应用开发范式如果你和我一样,在过去几年里频繁地穿梭于各种前端框架、后端服务和状态管理库之间,可能会对“复杂性疲劳”深有体会。我们构建的应用越来越强大,但随之而来的脚手架、配置文件和抽象层也…

作者头像 李华