💡 划重点

  • 四个实体按键对应早、中、晚、睡前服药,按下即打卡,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库。

调试步骤

  1. 硬件检查:用万用表确认按键按下导通、OLED供电3.3V。2. I2C扫描:运行扫描程序确认OLED地址0x3C。3. 按键测试:串口打印每个GPIO状态。4. 网络测试:连接WiFi,确认能联网。5. 飞书测试:手动发送一条消息,确认机器人收到。6. 整体联调:模拟按键,观察OLED变化、LED亮起、飞书通知。7. 外壳装配:固定模块,留出按键孔和OLED窗口。

设计图

药品服用打卡按钮盒结构flow
1
感知输入
→
2
控制处理
→
3
执行反馈
→
4
数据上报