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

简介: 基于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
    }
    
相关文章
|
1月前
|
传感器 数据采集 数据可视化
基于STM32的智能家居控制系统设计方案
基于STM32的智能家居控制系统设计方案
|
3月前
|
机器学习/深度学习 边缘计算 安全
C#实现OPC客户端
C#实现OPC客户端,结合OPC DA与OPC UA两种协议
|
4月前
|
机器学习/深度学习 传感器 数据采集
MATLAB实现滚动轴承故障诊断(外圈故障)
MATLAB实现滚动轴承故障诊断(外圈故障)
|
4月前
|
传感器 并行计算 算法
基于卡尔曼滤波的锂离子电池剩余电量估算
基于卡尔曼滤波的锂离子电池剩余电量(SOC)估算的方案,结合等效电路模型与自适应优化策略
|
1月前
|
网络协议 物联网 编译器
STM32 MQTT客户端实现方案(基于二次开发包)
STM32 MQTT客户端实现方案(基于二次开发包)
|
5月前
|
存储 算法 生物认证
matlab实现指纹识别
指纹识别技术凭借其唯一性和稳定性,已成为生物特征识别领域的重要组成部分。MATLAB作为强大的数值计算和图像处理平台,为指纹识别算法的研究与实现提供了有力支持。
|
8月前
|
机器学习/深度学习 固态存储 算法
基于MATLAB的图像人数统计
基于MATLAB的图像人数统计
|
4月前
|
SQL 供应链 测试技术
C# 图书管理系统(三层架构)
C#三层架构图书管理系统,包含表示层、业务逻辑层和数据访问层。
|
4月前
|
传感器 缓存 监控
基于C#实现串口调试工具读取温度值
基于C#实现串口调试工具读取温度值
|
4月前
|
JSON 安全 测试技术
C#实现的全能HTTP POST工具类
C#实现的全能HTTP POST工具类,整合了多种协议格式、安全认证和扩展能力,支持JSON、表单、文件上传等场景