💡 划重点
- 四个实体按键对应早、中、晚、睡前服药,按下即打卡,OLED大字显示状态。
- ESP32-C3联网,打卡后通过飞书机器人通知子女,解决独居长辈漏服、重复服药无人知晓的问题。
- 目标成本50元内,物料易买,接线简单,适合快速制作。
需求洞察
目标用户是独居长辈、记忆力减退者、需要长期服药的慢性病患者。真实痛点有三个:一是忘服、漏服,尤其是多种药物、多个时间点;二是重复服药,记不清是否吃过;三是子女无法远程确认,电话询问容易让长辈烦躁。现有手机提醒对长辈不友好:屏幕小、操作复杂、通知易忽略。纸质记录又容易丢。为什么值得做:实体按钮符合长辈习惯,按一下即打卡;OLED大字显示,减少认知负担;飞书通知让子女实时掌握,不打扰长辈。低成本、低功耗、可放置于餐桌或床头。
方案设计
感知层:4个独立按键,分别对应早、中、晚、睡前。按下触发打卡,内部上拉,低电平有效。控制层:ESP32-C3做主控,负责按键去抖、状态机、时间管理、Wi-Fi连接和飞书Webhook请求。执行层:0.96寸OLED显示当前时间、待服药项、已打卡状态;LED指示联网或打卡成功;蜂鸣器在设定时间提醒。日志/联网层:通过NTP获取时间,打卡记录写入内存并发送到飞书机器人;可扩展每日汇总。整体采用事件驱动:定时器检查服药时间,按键轮询捕获打卡。
物料清单
| 物料 | 数量 | 用途 | 估算单价 | 小计 |
|---|---|---|---|---|
| ESP32-C3开发板 | 1 | 主控与Wi-Fi | 15元 | 15元 |
| 0.96寸OLED I2C | 1 | 显示时间与状态 | 8元 | 8元 |
| 4x1按键模块 | 1 | 四个打卡键 | 3元 | 3元 |
| 有源蜂鸣器 | 1 | 声音提醒 | 1.5元 | 1.5元 |
| LED与电阻 | 2 | 状态指示 | 0.5元 | 1元 |
| 洞洞板与杜邦线 | 1 | 连接 | 3元 | 3元 |
| 塑料外壳 | 1 | 收纳 | 5元 | 5元 |
| 合计 | 36.5元 |
接线与结构
按键:GPIO0、GPIO1、GPIO2、GPIO3,另一端接GND,设置为内部上拉。OLED:SDA接GPIO8,SCL接GPIO9。LED:GPIO10经限流电阻接LED正极,负极接GND。蜂鸣器可接GPIO4或与LED并联。说明:GPIO9为启动引脚,上电时OLED模块不应拉低该脚,否则可能进入下载模式;若遇到启动异常,可将SCL改到GPIO5,SDA改到GPIO6,这是微调理由。结构上,按键排成一列,OLED居中,外壳开孔对应。
核心代码
Arduino骨架:
#include <WiFi.h>
#include <HTTPClient.h>
#include <U8g2lib.h>
#include <Wire.h>
const char* ssid = "你的WiFi";
const char* password = "你的密码";
const char* webhook = "飞书机器人Webhook";
const int keys[4] = {0, 1, 2, 3};
const int ledPin = 10;
bool taken[4] = {false, false, false, false};
const char* names[4] = {"早", "中", "晚", "睡前"};
void sendFeishu(String msg) {
if (WiFi.status() != WL_CONNECTED) return;
HTTPClient http;
http.begin(webhook);
http.addHeader("Content-Type", "application/json");
String body = "{\"msg_type\":\"text\",\"content\":{\"text\":\"" + msg + "\"}}";
http.POST(body);
http.end();
}
void setup() {
Serial.begin(115200);
Wire.begin(8, 9);
u8g2.begin();
pinMode(ledPin, OUTPUT);
for (int i = 0; i < 4; i++) pinMode(keys[i], INPUT_PULLUP);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) delay(500);
configTime(8 * 3600, 0, "ntp.aliyun.com");
}
void loop() {
for (int i = 0; i < 4; i++) {
if (digitalRead(keys[i]) == LOW && !taken[i]) {
delay(50);
if (digitalRead(keys[i]) == LOW) {
taken[i] = true;
digitalWrite(ledPin, HIGH);
String msg = String("已打卡:") + names[i];
sendFeishu(msg);
delay(300);
digitalWrite(ledPin, LOW);
}
}
}
u8g2.clearBuffer();
u8g2.drawStr(0, 14, "服药打卡");
for (int i = 0; i < 4; i++) {
u8g2.drawStr(0, 30 + i * 12, (String(names[i]) + (taken[i] ? " 已服" : " 待服")).c_str());
}
u8g2.sendBuffer();
delay(100);
}
说明:代码为骨架,需填入WiFi和飞书Webhook;蜂鸣器与定时提醒可另加。实际编译需安装U8g2库。
调试步骤
- 硬件检查:用万用表确认按键按下导通、OLED供电3.3V。2. I2C扫描:运行扫描程序确认OLED地址0x3C。3. 按键测试:串口打印每个GPIO状态。4. 网络测试:连接WiFi,确认能联网。5. 飞书测试:手动发送一条消息,确认机器人收到。6. 整体联调:模拟按键,观察OLED变化、LED亮起、飞书通知。7. 外壳装配:固定模块,留出按键孔和OLED窗口。