生活极客系列 - 运动提醒闹钟
前言
有读者和我反馈,这个公号的文章技术性太强了,让人看不下去。为了让文章更有趣一些,我决定开创一个《生活极客系列》,介绍一些在生活中应用的小项目。今天这个项目是源于最近坐久了,感觉有点腰酸背疼,所以想要做一个定时提醒我起来活动一下的小闹钟。
运动提醒闹钟
功能
这个闹钟功能很简单,就是整点时提醒使用者起来走一走,然后整点过10分钟再提醒使用者可以回座位上继续工作或学习。
需要的材料
实现这个闹钟需要准备一个ESP32开发板,两根导线,一个无源蜂鸣器。也可以使用ESP32-S3开发板,只需要调整.cargo/config.toml中的配置项就可以了。网上可以买到蜂鸣器分有源和无源两种,最好买无源的,可以通过输出信号调节频率。有源的蜂鸣器只支持固定的频率。
编写软件
我还是使用VS Code加Copilot Plugin来编写代码。我给Copliot的初始需求如下。
你好。我想基于ESP32制作一个闹钟,你能帮我完成这个项目吗?我的计划是使用ESP32开发板和蜂鸣器。ESP32开发板会连接到本地WiFi网络,其SSID和密码通过宏定义传入,即env!("WIFI_SSID")和env!("WIFI_PASS")。这个系统会每小时通过NTP协议同步一次时间,并在每个整点触发蜂鸣器提醒用户。请生成合适的代码并尝试编译,我稍后会提供具体的编译步骤。
Copilot很快生成了代码,我然后再让Copilot做了一些调整,中间过程我这里省略了,最后我让Copliot总结了输出代码的结构。
ESP32闹钟项目总结
我已帮你完成了一个功能完善的基于ESP32的闹钟,具备以下特性:
已实现的核心功能
WiFi连接
通过环境变量提供的凭证连接本地WiFi网络
每30秒自动监测连接状态
连接中断时自动重连
NTP时间同步
启动时与NTP服务器同步时间
每小时定期同步以保持时间精确
整点报时系统
每个整点触发闹钟
通过专用消息通道向蜂鸣器线程发送控制指令
蜂鸣器控制
采用独立线程确保稳定运行
支持消息通道控制(播放闹铃、设置频率、停止指令)
运行时频率可调(默认2000Hz)
可配置的闹铃模式参数包括:
单次循环的蜂鸣次数
每次蜂鸣的持续时间
蜂鸣间与循环间的间隔
模式重复次数
技术实现细节
线程通信
使用mpsc通道进行线程间通信
通过Arc<Mutex<>>实现线程安全的频率调整
WiFi管理
正确初始化ESP-IDF WiFi驱动
实时监测连接状态
包含错误处理的自动重连机制
时间处理
解析时间至时/分/秒
记录当前小时避免重复触发闹钟
定期输出时间日志
蜂鸣器控制系统
基于精确计算的时序生成目标频率
主程序终止时可安全关闭线程
代码已通过所有依赖项的编译,随时可烧录至ESP32设备。
到这个时候程序已经实现了基本功能,我又让Copliot简化一些地方。最后我手动增加了过10分钟的提醒,另外调整了蜂鸣器提醒的次数,整点时响的次数等于对应的小时数。还调整了整点闹钟和10分钟闹钟的频率,以区分是整点还是整点过10分钟。还限制了闹钟的时间,只在7:00到23:10之间会触发闹钟。相关的代码如下。
完整的代码可以在esp32-alarm代码仓库找到。编译环境准备可以参考准备开发环境。下面连接蜂鸣器和开发板,蜂鸣器的正极连接GPIO5,负极连接GND。
进入Rust on ESP环境,使用命令 env WIFI_SSID=<ssid> WIFI_PASS=<pass> cargo espflash flash -p /dev/ttyUSB0
编译和上传固件,闹钟就开始运行了。可以通过 cargo espflash monitor -p /dev/ttyUSB0
查看日志来确认程序是否运行正常。
3D打印外壳
我还使用FreeCAD做了一个简单外壳,3D模型如下。这个外壳适用于的26.7mm X 50.1mm的esp32开发板,模型文件我也加到了代码仓库里。没有3D打印机,也没有关系,只要将连线牢固地连接起来就可以了。
总结
我们只要仔细观察和思考,使用MCU可以实现很多方便生活的小玩意。今天的项目就到这里,如果你也有这方面的奇思妙想,欢迎大家留言交流。