智能 Arduino 水杯:实时监测饮水量与智能提醒
所需元件与材料
| 元件 | 数量 | 备注 |
|---|---|---|
| SparkFun Arduino Pro Mini 328 5V/16MHz | 1 | 主控,低功耗 |
| 防水超声波测距模块 | 1 | 测水位,量程 3–16 cm |
| DS1307 RTC 模块(自制或成品) | 1 | 掉电走时,I²C 接口 |
| 共阴 4 位 7 段数码管 | 1 | 显示饮水量/时间 |
| 无源蜂鸣器 | 1 | 饮水提醒 |
| 轻触开关 12mm | 1 | 菜单切换/唤醒 |
| 2N2222 NPN 三极管 | 4 | 数码管位选驱动 |
| 1000 mAh Li-Ion 电池 | 1 | 供电 |
| USB Li-Ion 充电板 (TP4056) | 1 | 充电管理 |
| 221 Ω 电阻 | 8 | 段限流 |
| 1 kΩ 电阻 | 4 | 三极管基极限流 |
| 4.75 kΩ 电阻 | 2 | I²C 上拉 |
所需工具
- 烙铁、热熔胶枪
项目动机
75% 的美国人长期缺水。喝足水能改善皮肤、大脑功能、精力与体重。本项目让水杯“变聪明”:记录日/周饮水量、显示上次饮水时间、2 小时未喝水双响提醒、单次充电待机 1 个月以上。
硬件模块制作
RTC 模块(DS1307)
- 外接 32.768 kHz 晶振、两个 4.7 kΩ 上拉电阻(SDA/SCL)
- VBAT 脚接地(不装纽扣电池),主电池供电时自动走时
- 体积压缩至 15×15 mm,适配瓶盖内部
4 位 7 段数码管驱动板
- 共阴极复用:8 段并联(a–g、dp),4 位各自阴极接三极管集电极
- 段电流限流 221 Ω,基极 1 kΩ,Arduino D10–D17 驱动段,D6–D9 驱动位
- 按键接 D2 (INT0),双重作用:菜单切换 + 外部中断唤醒睡眠
主板连线
| 模块引脚 | Arduino 引脚 |
|---|---|
| RTC SDA | A4 |
| RTC SCL | A5 |
| 蜂鸣器 | D3 |
| 超声波 Trig | D4 |
| 超声波 Echo | D5 |
| 按键 | D2 (INT0) |
超声波安装
- 瓶盖中心钻孔,传感器探头朝内、居中固定
- 四根导线穿孔引出,焊接主板
- 量程覆盖瓶身高度(约 16 cm),水位 0–30 盎司对应 16–3 cm
软件设计
低功耗策略
- 使用
LowPower库进入SLEEP_8S× 6 ≈ 48 s,约 1 分钟唤醒一次 - 看门狗定时 + 按键外部中断 (FALLING) 双重唤醒源
- 唤醒后连续采样 5 次取平均,滤除抖动
- 显持 10 s 后熄屏再睡眠
核心算法
// 5 次读数平均,单位 cm
avg_cm = (sum_of_5_readings) / 5;
// 瓶高 17 cm,水位高度 = 17 - avg_cm
water_level_cm = 17 - avg_cm;
// 经标定:16 cm 水柱 ≈ 30 盎司 → 1 cm ≈ 1.875 盎司
water_oz = int(water_level_cm * 1.875);
饮水事件判定
- 若
water_oz < previous_oz - 1且非换日 → 记录饮水量previous_oz - water_oz,清零空闲计数 - 若
water_oz > previous_oz→ 判定为加水,更新基准值 - 若相等 →
idle_time++(单位:分钟) idle_time ≥ 120(2 小时) → 每 15 分钟双响提醒,喝水后重置
数据统计
- 每日 23:59 归零,进入新一天
- 周均值 = 过去 7 天日摄入总和 / 天数
- 按键单击循环显示:D 日摄入、A 周均值、R 实时余量、时间 (HH:MM)
关键库
DS1307RTC、Time/TimeLib、WireLowPower(RocketScream)OneButton(按键事件:单击/双击/长按)
组装与防水
- 主板热熔胶固定瓶盖内侧上方
- 电池贴合主板顶部,绝缘防短路
- 充电板 USB 口朝外,胶水封边但保留插拔口
- 全电路(除 USB 口)厚涂热熔胶/环氧树脂,达到 IPX6 以上
- ⚠️ 切勿将瓶盖整体浸水
效果展示
完成后拧上瓶身,按键唤醒即显示实时余量;坚持使用可养成定时饮水习惯。代码约 200 行,已整理注释,可直接烧录 Pro Mini(需 5V/16MHz 版本,选板时选 Arduino Pro or Pro Mini, ATmega328P (5V, 16 MHz))。
制造工艺