非接触式音乐洗手计时器:基于 Arduino 与超声波传感器
项目概述
依据 CDC 建议,洗手需搓洗 20 秒以上。本项目制作一款非接触式洗手计时器:手在超声波传感器前挥动即可触发,7 段数码管倒计时显示,蜂鸣器同步播放 20 秒旋律(内置《生日歌》《Do-Re-Mi》《We Will Rock You》《危险边缘》主题曲),支持用户自行增减曲目。全程无需触碰,适合公共卫生场景。
核心组件与物料清单
- Arduino UNO ×1
- HC-SR04 超声波测距模块 ×1
- Adafruit 0.56" 4 位 7 段数码管(I2C 背包) ×1
- Adafruit 压电蜂鸣器 PS1240 ×1
- ProtoStax 系列外壳(Arduino 板、面包板、超声波模块专用套件、横向堆叠套件)
- 半尺寸免焊面包板 ×1
软件: Arduino IDE
硬件连接与原理图
原理图见项目附件。核心连接:
- HC-SR04:Trig/Echo 接数字引脚
- 7 段数码管:I2C 接 SDA/SCL (A4/A5)
- 蜂鸣器:接数字引脚(TONE_PIN)
- ProtoStax 外壳提供模块化堆叠与固定,超声波探头穿墙安装于侧壁
软件架构亮点
无阻塞并发:拒绝 delay()
需同时更新倒计时显示与播放音乐。利用 tone() 非阻塞特性(占用 Timer2),配合 millis() 时间戳实现“多任务”:
- 主循环按音符时长播放,期间反复刷新倒计时与数码管
- 倒计时结束后仍继续播放至曲终,避免音乐中断
乐谱转码:相对时值体系
定义 Note 结构体(频率 + 相对时值),用宏表示全/二分/四分/八分/十六分音符及附点:
#define NOTE_WHOLE 1
#define NOTE_HALF 0.5f
#define NOTE_QUARTER 0.25f
#define NOTE_EIGHTH 0.125f
#define NOTE_SIXTEENTH 0.0625f
#define DOTTED(X) (X * 1.5f)
结合 Melody 结构体(音符数组、音符数、全音符实际毫秒数),即可按标准乐谱逐音符转录,示例给出《生日歌》完整数组。
内存优化:PROGMEM 存放乐谱
UNO 仅 2 KB SRAM,4 首曲子占用 96% 导致数码管库失效。将 Note 与 Melody 数组移入 Flash(PROGMEM),动态内存从 76% 降至 22%,程序存储仅微增(31%→32%),可轻松容纳更多曲目。
代码结构要点
setup():初始化 I2C 数码管、超声波引脚、串口loop():轮询超声波距离 < 10 cm 触发 → 选曲、启动倒计时与播放- 播放循环:
tone()发声 → 计算音符间隔 →while(millis()-noteTime < pause)期间刷新显示 →noTone()止音
扩展建议
- 自行转录更多乐谱(注意注释掉旧曲目或迁移至 PROGMEM)
- 实现 PROGMEM 读取(进阶,需
pgm_read_word等) - 增加启动动画、音量控制、多语言提示等
资源链接
- 完整代码仓库:ProtoStax_Touchless_Musical_Handwash_Timer
- 原理图见项目附件(Schematics 部分)
制造工艺
- 洗手站巡检维护最佳实践:从日检到月检的标准化作业指导
- DIY 蓝牙控制 Arduino 间谍小车
- FlickMote:基于手势的智能家居红外遥控器
- DIY Arduino TV-B-Gone:万能关机遥控器
- 理解看门狗定时器:如何防止单片机死机卡死
- 自制大尺寸LED主时钟带闹钟功能 — 12米外清晰可见
- Find Me:基于 Arduino 与蓝牙的智能寻物器制作指南
- Arduino 项目优化供电方案:从按键开关到电池监测与数据记录
- Arduino 井字棋游戏:MAX7219 点阵屏 + 纸板外壳 DIY
- 从零构建智能 Arduino 四足机器人:完整指南
- 使用 SparkFun 7 段数码管构建可靠的 Arduino 倒计时器
- Arduino 洗手计时器:抗击 COVID-19 的简易 DIY 工具