Skip to main content Link Menu Expand (external link) Document Search Copy Copied

生活极客系列 - 运动提醒闹钟

前言

有读者和我反馈,这个公号的文章技术性太强了,让人看不下去。为了让文章更有趣一些,我决定开创一个《生活极客系列》,介绍一些在生活中应用的小项目。今天这个项目是源于最近坐久了,感觉有点腰酸背疼,所以想要做一个定时提醒我起来活动一下的小闹钟。

img

运动提醒闹钟

功能

这个闹钟功能很简单,就是整点时提醒使用者起来走一走,然后整点过10分钟再提醒使用者可以回座位上继续工作或学习。

需要的材料

实现这个闹钟需要准备一个ESP32开发板,两根导线,一个无源蜂鸣器。也可以使用ESP32-S3开发板,只需要调整.cargo/config.toml中的配置项就可以了。网上可以买到蜂鸣器分有源和无源两种,最好买无源的,可以通过输出信号调节频率。有源的蜂鸣器只支持固定的频率。

img

编写软件

我还是使用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。

img

进入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打印机,也没有关系,只要将连线牢固地连接起来就可以了。

img

总结

我们只要仔细观察和思考,使用MCU可以实现很多方便生活的小玩意。今天的项目就到这里,如果你也有这方面的奇思妙想,欢迎大家留言交流。

链接

  1. esp32-alarm - https://github.com/paul356/esp32-alarm
  2. 准备开发环境 - https://paul356.github.io/2024/11/11/rust-on-esp-series_1.html