基于STM32的电子药盒提醒装置实现

在线体验各类最新模型,更有模型 免费Token 额度领取!
立即体验
简介: 基于STM32的电子药盒提醒装置实现

一、系统架构设计

  1. 核心功能模块

    • 定时提醒:通过DS1302时钟模块获取时间,触发蜂鸣器与LED报警

    • 状态反馈:红外传感器检测药盒开合状态,通过蓝牙模块同步至手机APP

    • 人机交互:OLED显示屏实时显示时间与状态,按键设置提醒时间

  2. 硬件组成

    | 模块 | 型号/接口 | 功能说明 |
    | -------- | -------------------- | --------------- |
    | 主控芯片 | STM32F103C8T6 | 核心控制器 |
    | 时钟模块 | DS1302 | 精确时间管理 |
    | 显示模块 | OLED 0.96英寸(I2C) | 时间/状态显示 |
    | 通信模块 | HC-05蓝牙模块 | 手机APP数据交互 |
    | 传感器 | 红外对管(开盒检测) | 药盒状态监测 |
    | 提示装置 | 蜂鸣器+LED灯 | 声光报警 |


二、代码实现(HAL库+标准外设库)

1. 工程结构
├── Core/
│   ├── Inc/
│   │   ├── main.h
│   │   ├── ds1302.h
│   │   ├── oled.h
│   │   └── bluetooth.h
│   └── Src/
│       ├── main.c
│       ├── ds1302.c
│       ├── oled.c
│       └── bluetooth.c
├── Drivers/
│   ├── CMSIS/
│   └── STM32F1xx_HAL_Driver/
└── Middlewares/
    └── Bluetooth/
2. 核心代码
(1) DS1302时钟驱动(ds1302.c)
#include "ds1302.h"

void DS1302_Init(void) {
   
  // 初始化GPIO与SPI
  __HAL_RCC_SPI1_CLK_ENABLE();
  DS1302_RST = 0;  // 复位信号
  HAL_Delay(1);
  DS1302_CLK = 0;  // 时钟信号
  HAL_Delay(1);
  DS1302_RST = 1;  // 释放复位
}

void DS1302_WriteByte(uint8_t addr, uint8_t dat) {
   
  for(int i=0; i<8; i++) {
   
    DS1302_IO = 0;  // 发送地址位
    DS1302_CLK = 1;
    DS1302_CLK = 0;
    DS1302_IO = (dat & 0x01);
    dat >>= 1;
  }
}

uint8_t DS1302_ReadByte(uint8_t addr) {
   
  uint8_t dat = 0;
  addr |= 0x80;  // 读模式
  for(int i=0; i<8; i++) {
   
    DS1302_IO = 0;
    DS1302_CLK = 1;
    DS1302_CLK = 0;
    dat >>= 1;
    DS1302_IO = 1;
  }
  return dat;
}
(2) OLED显示驱动(oled.c)
#include "oled.h"

void OLED_Init(void) {
   
  // 初始化I2C
  HAL_I2C_Init(&hi2c1);
  OLED_WriteCmd(0xAE);  // 关闭显示
  OLED_WriteCmd(0x20);  // 设置内存地址模式
  OLED_WriteCmd(0xB0);  // 设置页起始地址
}

void OLED_DisplayTime(uint8_t hour, uint8_t min) {
   
  char buf[16];
  sprintf(buf, "Time: %02d:%02d", hour, min);
  OLED_ShowString(0, 0, buf);
}
(3) 蓝牙通信处理(bluetooth.c)
#include "bluetooth.h"

void Bluetooth_Init(void) {
   
  // 初始化USART2
  MX_USART2_UART_Init();
}

void Bluetooth_ProcessCmd(char *cmd) {
   
  if(strncmp(cmd, "SET:",4) == 0) {
   
    sscanf(cmd+4, "%d:%d", &medicine_time[0], &medicine_time[1]);
    sprintf(send_buf, "Time set to %02d:%02d", medicine_time[0], medicine_time[1]);
    HAL_UART_Transmit(&huart2, (uint8_t*)send_buf, strlen(send_buf), 100);
  }
}
(4) 主程序(main.c)
#include "main.h"
#include "ds1302.h"
#include "oled.h"
#include "bluetooth.h"

extern uint8_t medicine_time[2];  // 设定时间[小时][分钟]

int main(void) {
   
  HAL_Init();
  SystemClock_Config();

  DS1302_Init();
  OLED_Init();
  Bluetooth_Init();

  while(1) {
   
    // 获取当前时间
    RTC_TimeTypeDef sTime;
    HAL_RTC_GetTime(&hrtc, &sTime, FORMAT_BIN);

    // 时间匹配检测
    if(sTime.Hours == medicine_time[0] && sTime.Minutes == medicine_time[1]) {
   
      HAL_GPIO_WritePin(BUZZER_GPIO_Port, BUZZER_Pin, GPIO_PIN_SET);
      OLED_DisplayString(2, 0, "Medicine Time!");
    } else {
   
      HAL_GPIO_WritePin(BUZZER_GPIO_Port, BUZZER_Pin, GPIO_PIN_RESET);
    }

    // 蓝牙指令处理
    if(USART2_RX_STA) {
   
      Bluetooth_ProcessCmd(USART2_RX_BUF);
      USART2_RX_STA = 0;
    }

    HAL_Delay(1000);
  }
}

三、硬件连接说明

STM32引脚 外设模块 连接说明
PA0 DS1302_SCLK 时钟信号
PA1 DS1302_IO 数据总线
PA2 DS1302_RST 复位信号
PB6 OLED_SDA I2C数据线
PB7 OLED_SCL I2C时钟线
PA9/PA10 HC-05_UART 蓝牙通信
PC13 蜂鸣器 高电平触发
PA8 红外传感器 低电平表示药盒开启

四、调试与优化建议

  1. 时间同步问题

    • 使用STM32CubeMX配置RTC时钟源为外部LSE(32.768kHz晶振)

    • 添加闰年补偿算法(参考DS1302_SetTime函数)

  2. 抗干扰措施

    • 在DS1302电源引脚并联10μF电解电容 + 0.1μF陶瓷电容

    • OLED数据线套磁环抑制高频噪声

  3. 低功耗优化

    // 进入睡眠模式(需外部中断唤醒)
    HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
    

参考代码 基于STM32的一种电子药盒提醒装置 www.youwenfan.com/contentalh/102265.html

五、扩展功能实现

  1. 药品余量检测

    // 使用HX711称重模块
    float Get_DrugWeight() {
         
      float weight = (HX711_GetValue() - OFFSET) * SCALE_FACTOR;
      return weight > 50.0f ? 1 : 0;  // 重量>50g表示充足
    }
    
  2. 语音播报模块

    // WT588D语音芯片控制
    void Play_Reminder() {
         
      WT588D_SendCommand(0xAA, 0x06, 0x01, 0x00, 0x00, 0x00);  // 播放语音1
    }
    
相关文章
|
数据可视化 中间件 API
FreeRTOS记录(一、熟悉开发环境以及CubeMX下FreeRTOS配置)
熟悉 在 STM32 CubeMX 下面的 FreeRTOS 使用
5841 1
FreeRTOS记录(一、熟悉开发环境以及CubeMX下FreeRTOS配置)
|
传感器 芯片
STM32--PWR电源控制
STM32--PWR电源控制
898 0
STM32--PWR电源控制
|
4月前
|
人工智能 API 数据安全/隐私保护
OpenClaw(“小龙虾”)保姆级教程:3分钟阿里云/本地部署+API配置+5个必装Skill及常见问题解答
2026年,OpenClaw(曾用名Clawdbot)以“GitHub星标之王”的姿态席卷开源圈,但其基础功能仅能满足简单对话需求。对新手而言,真正解锁其生产力价值的关键,在于安装适配场景的Skill(技能插件)——如同给天才宝宝搭配乐高组件,装上信息检索Skill就能实时洞察世界,配上办公管理Skill就能变身金牌秘书,组合使用更能实现“搜索-提炼-创作”全流程自动化。
1954 6
|
7月前
|
机器学习/深度学习
SAPO:让强化学习告别“硬剪切”
SAPO提出一种稳定高效的大语言模型强化学习方法,通过平滑门控替代硬剪切,解决GRPO/GSPO梯度丢失与不稳定问题。其连续信任域、序列级一致性及token级自适应设计,显著提升训练稳定性与样本效率,适用于dense/MoE模型,在数学、代码、逻辑等多任务上表现优越。
802 9
|
8月前
|
人工智能 弹性计算 自然语言处理
史上首次!万卡AI集群支撑双11,通义千问大规模落地
2025年双11,阿里云提供超千万核ECS算力及万卡灵骏智算集群,支撑淘宝推荐等核心业务性能提升超30%。通义千问大模型大规模落地,Qwen-MT单日调用超14亿次,助力商品出海、客服与经营分析,全面赋能双11智能化升级。
1185 0
史上首次!万卡AI集群支撑双11,通义千问大规模落地
|
6月前
|
机器学习/深度学习 JSON 算法
大模型对齐实战:从原理到代码,透彻理解PPO微调全流程
* **PPO是什么**:一种稳定、高效的强化学习算法,通过“近端”优化和“优势”估计,在追求高奖励的同时,用KL散度约束策略不偏离太远。 * **PPO微调做什么**:利用奖励模型(代表人类偏好)作为引导,优化语言模型的生成策略,使其输出更对齐人类价值观。 * **四大核心**:**Actor**(被优化者)、**Critic**(价值评估者)、**Reward Model**(评分官)、**Reference Model**(守门员/底线)四者协同工作。 * **核心价值**:解决了SFT难以处理的复杂、动态、多目标权衡的对齐问题,是打造如ChatGPT般“好用”模型的关键
|
8月前
|
人工智能 供应链 物联网
行业最新发布:2025保理公司排名揭晓,海尔金融保理如何成为市场焦点
《2025年保理公司综合实力排名》发布,海尔金融保理凭借强大股东背景、科技驱动的“海创云链”平台及“SaaS+IoT+AI”生态模式,位居榜首。其以数字化手段赋能产业链,实现融资高效化、风控智能化,服务超万亿资产生态,成为产融结合标杆。该排名综合资本实力、科技能力、产业布局等多维度评估,展现行业向科技化、生态化发展的趋势,为市场主体提供权威参考。
954 0
|
人工智能 网络协议 API
开发效率翻倍!Apipost这些协议调试秘籍,从HTTP到金融报文全搞定
Apipost是一款强大的API研发管理工具,支持多种协议与数据格式,包括HTTP(s)、WebSocket、SSE、gRPC、TCP及金融协议(如ISO 8583、FIX)。它内置国密算法库,提供HTTP文件秒传、全局参数配置等实用功能。在SSE调试中,可轻松处理AI模型流式响应;WebSocket与Socket.IO实现高效实时通信;GraphQL支持可视化Query编写;TCP模块解决金融报文编码难题;gRPC则具备服务反射与流式调试能力。Apipost不仅简化了多协议切换的复杂性,还自动生成文档,显著提升开发效率,让开发者专注于核心业务逻辑。
|
机器学习/深度学习 边缘计算 缓存
有哪些方法可以降低 LLM 的计算成本?
【8月更文挑战第13天】
719 5
|
网络协议 应用服务中间件 网络安全
odoo17在线聊天报错提示 Couldn‘t bind the websocket...
当 Odoo 17 报错 "Couldn't bind the websocket..." 时,通过检查和配置 WebSocket 端口、防火墙规则、代理服务器以及 Odoo 配置文件,可以有效解决此问题。确保每一步操作准确无误,最终重启相关服务,使配置生效。希望这些步骤能帮助您快速恢复 Odoo 的在线聊天功能。
669 1