💡 划重点
- 一颗 ESP32-C3 搞定一切:控制、联网、驱动 OLED 显示屏与按键,稳定省电。
- 四个物理按钮对应早/中/晚/睡前服药时间:操作零门槛,不用手机不用识字,按下去就打卡。
- 一块 0.96 寸 OLED:清晰显示时间、已服次数、联网状态,老人一眼看清。
- 飞书消息通知:每次打卡实时推送至子女/看护人的飞书群,失效立即提醒。
- 物料总成本低于 50 元:所有元件均容易购买,适合批量制作送亲友。
需求洞察
我国 60 岁以上独居或空巢老人已超过 1.3 亿,慢性病服药管理是典型痛点。许多长辈每天需要服 3 至 4 种药,但经常忘记、重复服药或搞错时间。子女无法时刻陪伴,电话提醒既打扰又容易遗忘。传统智能药盒成本高、操作复杂,长辈难以接受。
本项目针对独居长辈,提供一个极简物理交互的打卡按钮盒。它不依赖手机 APP,不使用触摸屏,不需要记密码。按下对应时间段的按钮,盒子发出 LED 灯光和 OLED 文字反馈,同时通过 Wi-Fi 向飞书群发送一条“妈妈早间已服药”的通知。设备成本控制在 50 元以内,制作简单,适合学生、创客为长辈定制。
为什么值得做?因为它不仅解决了“忘记吃药”问题,更重要的是让子女获得真实的安心——看到一条打卡消息比任何智能药盒的统计数据都更有温度。同时,它用最低的技术门槛,实现了健康监测中最核心的行为记录功能,兼顾隐私与实用,完全符合养老场景的现实需求。
方案设计
整体方案分为四层:感知层、控制层、执行层、日志/联网层。
感知层
由 4 个物理按键(按钮 A、B、C、D)组成,分别对应早间、午间、晚间、睡前四个服药时段。按键采用微动开关,按下即接通 GPIO,触发中断或轮询检测。每个按键带有简易文字贴纸,方便老人识别。
控制层
ESP32-C3 作为主控,运行 Arduino 框架。它负责读取按键状态、驱动 OLED 显示、控制 LED 状态灯,并通过 Wi-Fi 连接互联网。ESP32-C3 的 RISC-V 内核功耗低,支持深度睡眠,可延长电池寿命,但本项目为常供电设计,保持实时响应。
执行层
- OLED 屏 (0.96 寸, SSD1306 I2C):显示当前时间、最近一次打卡的时段、打卡总数。未打卡时段用小点提示。
- LED 指示灯:每次有效按键,LED 闪烁 2 秒;长时间无操作则呼吸显示,表示设备在线。
- 飞书消息推送:使用飞书自定义机器人 Webhook 发送文本消息,格式如:“【妈妈】2025-01-21 07:30 已服早间药物”。该方式无需独立服务器,免费且即时。
日志/联网层
ESP32-C3 连接家中 2.4GHz Wi-Fi。打卡数据不上云,仅通过 Webhook 送到指定飞书群。为避免误触或重复推送,加入 1 分钟防抖与重复检测逻辑。若网络断开,设备会本地缓存最后一次打卡信息,待网络恢复后自动补发,并在 OLED 上显示离线提示图标。
物料清单
| 序号 | 物料名称 | 数量 | 用途 | 估算单价(元) | 小计(元) |
|---|---|---|---|---|---|
| 1 | ESP32-C3 开发板 (合宙或微雪) | 1 | 主控与 Wi-Fi | 9.9 | 9.9 |
| 2 | 0.96 寸 OLED 屏幕 (I2C) | 1 | 信息显示 | 7.5 | 7.5 |
| 3 | 6x6mm 微动开关 (带键帽) | 4 | 服药时段按钮 | 1.2 | 4.8 |
| 4 | 5mm LED (绿色) | 1 | 状态指示 | 0.2 | 0.2 |
| 5 | 5mm LED 限流电阻 220Ω | 1 | 保护 LED | 0.1 | 0.1 |
| 6 | 杜邦线、排针 | 若干 | 接线 | 2.0 | 2.0 |
| 7 | 面包板或洞洞板 | 1 | 固定结构 | 3.0 | 3.0 |
| 8 | 塑料外壳 (如 85x58x33mm) | 1 | 成品外壳 | 8.0 | 8.0 |
| 9 | Micro USB 线 + 5V 充电头 | 1 | 供电 | 5.0 | 5.0 |
| 合计 | 40.5 |
总计 40.5 元,留有近 10 元余量,符合 50 元目标成本。若已有供电线材,成本还可更低。
接线与结构
按题目建议接线,并微调说明理由:
- 按键:4 个按键分别接 GPIO0、GPIO1、GPIO2、GPIO3。选择这些引脚是因为 ESP32-C3 的 GPIO0 和 GPIO2 在上电时需注意电平,但作为输入且仅按下时拉低,常规使用没有问题。内部启用上拉电阻,无需外接。
- OLED (I2C):SDA=GPIO8, SCL=GPIO9。ESP32-C3 的 I2C 任意引脚可用,8/9 靠近板边,方便走线。
- LED:接 GPIO10,串联 220Ω 电阻到 GND。
- 供电:通过 Micro USB 口的 5V 供电至开发板 Vin/5V 引脚,开发板自带 3.3V 稳压。
结构设计:在塑料外壳上盖钻 4 个按键孔,按键帽通过内部热熔胶固定,周围贴上早/中/晚/睡前标签。OLED 屏幕嵌入右侧开窗,LED 置于上方小孔。内部使用洞洞板固定开发板和 OLED,用短线连接。底部留 Micro USB 供电口。整机可立于床头柜或餐桌。
核心代码
使用 Arduino IDE,基于 ESP32-C3 板卡包,需要安装 U8g2(OLED)和 WiFi、HTTPClient、ArduinoJson 等库。
#include <WiFi.h>
#include <HTTPClient.h>
#include <U8g2lib.h>
#include <ArduinoJson.h>
const char* ssid = "your_ssid";
const char* password = "your_password";
const char* webhook = "https://open.feishu.cn/open-apis/bot/v2/hook/xxxxx";
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE, /* SCL=*/ 9, /* SDA=*/ 8);
const int btnPins[] = {0, 1, 2, 3};
const char* medTimes[] = {"早间", "午间", "晚间", "睡前"};
const int LED = 10;
int lastBtnStates[4] = {HIGH, HIGH, HIGH, HIGH};
unsigned long lastSent[4] = {0};
const unsigned long debounceDelay = 60000; // 1分钟防抖
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) { delay(500); }
u8g2.begin();
pinMode(LED, OUTPUT);
for (int i = 0; i < 4; i++) pinMode(btnPins[i], INPUT_PULLUP);
}
void sendFeishu(String msg) {
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
http.begin(webhook);
http.addHeader("Content-Type", "application/json");
DynamicJsonDocument doc(200);
doc["msg_type"] = "text";
doc["content"]["text"] = msg;
String body;
serializeJson(doc, body);
http.POST(body);
http.end();
}
}
void loop() {
u8g2.clearBuffer();
u8g2.setCursor(0, 14);
u8g2.print("服药打卡");
for (int i = 0; i < 4; i++) {
int reading = digitalRead(btnPins[i]);
if (reading == LOW && lastBtnStates[i] == HIGH && (millis() - lastSent[i] > debounceDelay)) {
lastSent[i] = millis();
digitalWrite(LED, HIGH);
String msg = "【妈妈】已服" + String(medTimes[i]) + "药物";
sendFeishu(msg);
delay(2000);
digitalWrite(LED, LOW);
}
lastBtnStates[i] = reading;
// 显示打卡状态
u8g2.setCursor(10, 30 + i*10);
if (millis() - lastSent[i] < 60000) {
u8g2.print(medTimes[i]); u8g2.print(": 已服");
} else {
u8g2.print(medTimes[i]); u8g2.print(": 未服");
}
}
u8g2.sendBuffer();
delay(200);
}
代码说明:使用内部上拉,按键接低有效。1分钟防抖防止重复漏服。成功打卡后 LED 亮 2 秒,飞书推送消息。OLED 动态显示各时段状态。
调试步骤
- 硬件测试:先用万用表检查各按键与 LED 连接,确保无短路。USB 供电看 ESP32-C3 指示灯正常。
- OLED 测试:上传简单的 U8g2 例程,确认 I2C 地址 0x3C 正常显示中文。
- Wi-Fi 连接:修改 SSID 和密码,通过串口监视器查看连接状态,观察 OLED 上是否显示已连接。
- 飞书机器人:创建飞书群机器人,复制 Webhook 地址填入代码,测试手动调用是否收到消息。
- 整体联调:按下按钮,看 LED 是否亮、OLED 对应时段是否变为“已服”,飞书群是否收到正确文本。测试一分钟内重复按压是否被屏蔽。
- 外壳组装:确认所有功能正常后,断电装入外壳,用热熔胶固定按钮和屏幕,封装即可。
设计图
流程图展示了从老人按下按钮到子女收到通知的完整链路,所有模块围绕低成本、高可靠的思路紧密配合。