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提供了充裕的空间。我选择它,主要基于以下几点考量:
- 丰富的IO与内置充电管理:Feather板载了锂电池充电芯片和JST PH连接器,这意味着你可以直接接上一块3.7V的锂聚合物电池,并通过USB口为电池充电,无需额外的充电模块或复杂的电源管理电路。这对于需要长期离线工作的设备来说是至关重要的便利。
- CircuitPython的完美支持:Adafruit对Feather M4的CircuitPython支持非常成熟,驱动库丰富,社区资源也多。用Python写嵌入式逻辑,调试和迭代的速度远超传统的C/C++。
- 引脚布局与扩展性: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 | 公共地 |
| EN | TPL5111DONE引脚 | 电源使能控制 |
| A4 | TPL5111DONE引脚 | 控制TPL5111定时 |
| 并联100nF电容到GND | 确保可靠启动 | |
| 3.3V | SI7021 VIN, eInk屏 VCC, TPL5111 VDD | 3.3V电源输出 |
| GND | SI7021 GND, eInk屏 GND, TPL5111 GND | 电源地 |
| SCL | SI7021 SCL | I2C时钟线 |
| SDA | SI7021 SDA | I2C数据线 |
| SCK | eInk屏 SCK | SPI时钟线 |
| MOSI | eInk屏 MOSI | SPI数据输出线 |
| MISO | eInk屏 MISO | SPI数据输入线(本项目未用,但需连接) |
| D6 | eInk屏 RST | 复位引脚 |
| D9 | eInk屏 SRCS | SRAM片选(本屏内置SRAM) |
| D10 | eInk屏 DC | 数据/命令选择 |
| D11 | eInk屏 ECS | 片选引脚 |
| D12 | eInk屏 BUSY | 忙状态指示 |
| D5 | 蜂鸣器正极 | PWM输出驱动蜂鸣器 |
| A5 | 按钮开关一端 | 按钮信号输入 |
| 按钮开关另一端 | 连接GND |
接线实操心得:
- 电源优先:首先连接所有模块的电源(3.3V和GND),确保供电正常再连接信号线。
- I2C上拉电阻:SI7021模块通常已集成上拉电阻。如果传输距离较长或干扰大,可以在SCL和SDA线上各加一个4.7kΩ的上拉电阻到3.3V。
- SPI线序:SPI接口的线序(SCK, MOSI, MISO)必须一一对应,接反了屏幕不会有任何反应。
- 按钮防抖:虽然代码中通过延时进行了软件防抖,但在硬件上,在按钮两端并联一个0.1uF的电容,可以更好地滤除触点抖动,让检测更稳定。
3.2 原型制作与封装建议
原项目作者使用了万用板和飞线焊接,然后固定在一个3D打印的广口瓶盖子上。这是一个非常实用的原型方案。
制作步骤:
- 焊接主控板:将Feather M4、TPL5111、蜂鸣器、按钮以及必要的电阻电容焊接在一小块万用板上。注意元器件布局要紧凑,但也要为连接屏幕和传感器的排针留出空间。
- 处理TPL5111:使用美工刀或烙铁,小心地割断TPL5111模块背面的“Trim”走线(断开板载电位器),以及“LED”走线(禁用指示灯以省电)。然后焊接上你计算好的定时电阻。
- 连接屏幕与传感器:使用排针和杜邦线,将屏幕和传感器作为可插拔模块连接到主控板。这样方便调试和更换。
- 制作密封盖:如果你有3D打印机,可以设计或下载一个适配你存储罐的盖子模型,并在上面预留安装主控板和屏幕的孔位。没有打印机的话,也可以使用厚亚克力板或塑料板手工制作。关键是要处理好传感器线的穿孔,可以使用热熔胶或专用的电缆防水接头(格兰头)进行密封,以保证罐内的气密性。
- 整体组装:将主控板用螺丝或尼龙柱固定在盖子上方,屏幕嵌入开孔中。传感器模块用延长线引入罐内,并妥善固定,避免直接接触物品。
注意事项:在最终封装前,务必进行完整的系统测试。包括:上电能否正常启动、屏幕显示是否正常、按钮功能、传感器读数、报警触发与消警、以及最重要的——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.mpycode.py:这是CircuitPython的入口文件,相当于Arduino的sketch.ino。系统启动后会自动执行这个文件。settings.txt:一个文本文件,用于配置温度/湿度范围、报警参数等。修改这个文件就能改变设备行为,无需重写代码。description.txt:最多4行,每行最多19个字符的文本,会显示在屏幕中央,用于标注罐内物品信息。font.py:包含了一个8x8像素的ASCII字符点阵数据。由于CircuitPython的显示库可能不包含小字体,我们自定义这个字体文件来渲染文本。lib/目录:存放项目依赖的第三方库。你需要从Adafruit的CircuitPython库包中,将adafruit_bus_device、adafruit_epd和adafruit_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 硬件初始化与默认配置
稳住电源后,便可以安心初始化其他硬件了。这部分代码顺序清晰:
- 导入依赖:引入时间、PWM、总线IO、显示屏驱动和传感器驱动等库。
- 初始化SPI与电子墨水屏:按照屏幕驱动库的要求,配置所有控制引脚并创建显示对象。
- 初始化I2C与SI7021传感器:I2C通信是标准的,初始化后即可读取数据。
- 配置蜂鸣器与按钮:将蜂鸣器引脚设置为PWM输出,按钮引脚设置为输入并启用内部上拉电阻。
- 设置默认参数:创建一个
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.py和render_character、render_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.txt和description.txt文件。修改保存后,再次按下按钮,设备蜂鸣提示并重启,加载新的配置。整个过程无需重写代码,交互简单直观。
4.2.5 主循环逻辑:监测、显示与报警
如果不是编辑模式,设备就会进入正常的主工作流程:
- 读取配置与描述:打开
settings.txt和description.txt,将内容解析后存入变量。 - 清屏并绘制静态内容:清除屏幕缓冲区,在顶部绘制标题,在中间区域绘制描述文本。
- 读取传感器数据:从SI7021读取温度和湿度,并转换为整数。
- 显示传感器数据:在屏幕左右两侧固定位置绘制温度和湿度数值。
- 判断与报警提示:
- 将读数与
settings中设定的范围比较。 - 如果读数异常,则在屏幕下方用红色字体显示“HIGH/LOW TEMPERATURE/HUMIDITY”。
- 同时在屏幕的顶部和底部绘制红色警示条,提供强烈的视觉警报。
- 将读数与
- 报警处理循环:
- 如果数据正常,直接跳到第7步。
- 如果数据异常,启动一个超时循环(时长由
alarm_timeout设定)。 - 在循环内,调用
sound_alarm()函数,按照设定发出“哔-哔-哔”的报警声。 - 在蜂鸣响起或间隔期间,持续检测按钮。如果用户按下按钮,则立即静音并跳出报警循环。
- 如果超时时间到,也跳出循环。
- 任务完成,进入休眠:所有工作完成后,执行最后也是最重要的一步:
done.value = True。这将DONE引脚拉高,TPL5111检测到信号,立即切断Feather的电源。设备进入深度睡眠,直到下一个定时周期到来。
4.3 关键函数详解
check_for_push(button, duration): 这是一个非阻塞式的按钮检测函数。它会在指定的duration秒内,每0.1秒检查一次按钮状态。一旦检测到按下,立即返回True;如果超时都未按下,则返回False。这保证了在等待蜂鸣或报警间隔时,系统仍然能响应用户的消警操作。sound_alarm(): 报警发声函数。它按照配置的频率、次数、时长来驱动蜂鸣器。关键在于,每一次蜂鸣和每一次蜂鸣间的间隔,都包裹在check_for_push调用中。这意味着用户可以在蜂鸣响起的任何时候按下按钮来立即静音,交互响应非常及时。out_of_range(t, h): 简单的逻辑判断函数,检查当前读数是否超出预设范围。它是触发整个报警流程的“开关”。
5. 调试、优化与扩展方向
5.1 常见问题与排查实录
在制作和调试过程中,我遇到了几个典型问题,这里分享给大家:
问题1:设备上电后屏幕闪一下,然后立刻关机,无法正常工作。
- 排查:这是最可能遇到的问题,根本原因就是前面提到的“电源竞争”问题。TPL5111过早地检测到了
DONE引脚的高电平。 - 解决:
- 首先确认代码最开头是否有
done.value = False这行代码,并且done引脚定义正确(A4)。 - 检查硬件,确保在Feather的A4引脚和GND之间,正确焊接了一个100nF(104)的瓷片电容。电容务必贴近引脚焊接。
- 用万用表测量TPL5111的
DONE引脚在上电瞬间的电压变化,确认电容起到了延时作用。
- 首先确认代码最开头是否有
问题2:屏幕显示乱码或者完全不显示。
- 排查:
- 接线错误:这是首要怀疑对象。请严格按照接线表,逐根检查SPI总线(SCK, MOSI, MISO)以及控制线(ECS, DC, RST, BUSY, SRCS)是否连接正确、接触良好。特别是BUSY线,必须连接,否则程序无法知道屏幕何时刷新完成。
- 库文件缺失或版本不匹配:确认
lib文件夹下是否有adafruit_epd及其依赖库adafruit_bus_device。尝试从Adafruit官网下载最新的CircuitPython库包进行替换。 - 电源问题:电子墨水屏在刷新瞬间需要较大电流。确保你的电池电量充足,或者尝试通过USB供电测试,排除电池供电不足的可能。
问题3:传感器读数不准或为0。
- 排查:
- 检查SI7021的I2C接线(SDA, SCL)。
- 在代码中尝试扫描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()- SI7021对焊接温度敏感,过热可能损坏。检查传感器模块是否完好。
问题4:报警不响或按钮无效。
- 排查:
- 蜂鸣器是有源还是无源?本项目需使用无源蜂鸣器。有源蜂鸣器给电就响,无法通过PWM控制音调。
- 检查蜂鸣器正负极是否接反(虽然通常影响不大),以及是否接在了支持PWM的引脚(D5)上。
- 按钮接线是否正确?一端接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 项目扩展与进阶玩法
这个项目的基础框架非常扎实,留下了很多扩展空间:
- 数据记录与历史趋势:为Feather M4增加一个微型SD卡模块,每次测量后将时间戳和读数写入CSV文件。这样你就能分析罐内环境的历史变化趋势。
- 无线传输与云端监控:将主控换成Adafruit Feather M4 Express with AirLift或者Feather ESP32-S2,集成Wi-Fi功能。设备唤醒后,可以将数据通过MQTT协议发送到Home Assistant、Blynk或自建的服务器上,实现手机远程监控和报警推送。
- 多传感器与融合判断:增加一个BME280传感器,同时获取温度、湿度、气压。气压数据可用于判断罐子是否被打开过(气压突变)。或者增加一个光照传感器,监控是否暴露在光线下。
- 改进人机交互:
- 增加更多按钮:实现模式切换、翻页查看历史数据等功能。
- 使用旋钮编码器:在编辑模式下,可以更直观地调整阈值数值,而不用连接电脑修改文件。
- 美化显示与UI:
- 设计更美观的字体和图形:可以寻找或制作更小的像素字体,以显示更多信息。或者绘制简单的温度计、水滴图标。
- 添加进度条或图表:用简单的条形图显示当前湿度/温度在设定范围内的相对位置。
- 制作专业PCB:如果你希望设备更小巧、更可靠,可以将目前的万用板电路设计成一块定制PCB。使用KiCad或EasyEDA等工具,把Feather M4的芯片、SI7021、TPL5111、蜂鸣器驱动等全部集成在一块板子上,只留下屏幕、电池和传感器作为外接模块。这能极大提升项目的完成度和专业性。
这个基于Feather M4和电子墨水屏的温湿度监控器,从一个具体的需求出发,串联了电源管理、传感器应用、低功耗显示和嵌入式Python编程等多个知识点。它不仅仅是一个可以用的工具,更是一个绝佳的学习平台。希望这份详细的拆解,能帮助你不仅成功复现它,更能理解其背后的设计思想,并激发出属于自己的创意和改进。