资料下载:
1、实现功能
(1)使用液晶屏幕显示当前时间,和下次吃药时间。
(2)达到设定时间时通过声光提醒用户,同时手机APP同步提醒。
(3)在到达吃药时间时,通过按键关闭吃药提醒,通过电机自动将药品推出
(4)手机APP同步显示数据,校准时间,设置吃药时间等
(5)药品不足时,屏幕与手机app同步显示提醒信息
可增加的功能:
主要元器件:
STM32F103C8T6最小系统板、红外传感器,蜂鸣器,led,oled屏幕,按键,esp8266-WiFi模块,ds1302时钟,舵机
2、实物
3、代码
STM32代码采用C语言,标准库编写,软件是keil5,带有详细中文注释
#include "stm32f10x.h"
#include <stdio.h>
#include <string.h>
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "math.h"
#include "oled.h"
#include "IO_Init.h"
#include "timer.h"
#include "pwm.h"
#include "DS1302.h"
u8 eat_time[3][2]={
8,00,12,30,18,30};
void app_check() //手机APP
{
char *p;
u8 d[20],time_str[200],i;
if(USART1_RX_STA>5)
{
delay_ms(200);
if(strstr((const char *)USART1_RX_BUF,"Time:"))
{
p = strstr((const char *)USART1_RX_BUF,"Time:");
for(i = 0;i<45;i++)
{
time_str[i] = *(p+i+5) - 0x30;
}
//时间校准
d[1] = time_str[2]*10+time_str[3];
d[2] = time_str[6]*10+time_str[7];
d[3] = time_str[10]*10+time_str[11];
d[4] = time_str[14]*10+time_str[15];
d[5] = time_str[18]*10+time_str[19];
d[6] = time_str[22]*10+time_str[23];
eat_time[0][0] = time_str[26]*10+time_str[27];//时间1设置
eat_time[0][1] = time_str[28]*10+time_str[29];
eat_time[1][0] = time_str[32]*10+time_str[33];//时间2设置
eat_time[1][1] = time_str[34]*10+time_str[35];
eat_time[2][0] = time_str[38]*10+time_str[39];//时间3设置
eat_time[2][1] = time_str[40]*10+time_str[41];
Ds1302_Time_Set(d[1],d[2],d[3],d[4],d[5],d[6]); //时间写入
}
USART1_RX_STA=0;
memset(USART1_RX_BUF,0,sizeof(USART1_RX_BUF));
}
}
u8 eat_flag; //吃药时间到
u8 drug_shortge_flag; //缺药
int main(void) //主函数
{
u8 i;
u8 send_flag;
u8 send_str[50];
SystemInit();
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 2组中断分组
Beep_Init(); //蜂鸣器
Beep = 0;
OLED_Init();Beep = 1; //OLED屏幕初始化
usart1_Init(115200); //串口1初始化,WIFI
Esp8266_AP_Init(); //WIFI初始化
TIM3_Int_Init(9999,719); //定时1s
Ds1302_Init(); //DS1302时钟初始化
TIM4_PWM_Init(1999,719); //PWM舵机驱动
TIM_SetCompare4(TIM4,100); //舵机居中
HW_Init();
while(1)
{
app_check(); //APP指令读取
if(time_s>=1) //1s一次,用于数据采集,数据发送APP,数据显示
{
time_s = 0;
Ds1302_Time_Get(); //获取时间
OLED_printf(0,0,"%02d-%02d %02d:%02d:%02d",calendar.w_month,calendar.w_date,calendar.hour,calendar.min,calendar.sec); //时间显示
OLED_printf(0,2,"time1:%02d:%02d",eat_time[0][0],eat_time[0][1]); //时间显示
OLED_printf(0,4,"time2:%02d:%02d",eat_time[1][0],eat_time[1][1]); //时间显示
OLED_printf(0,6,"time3:%02d:%02d",eat_time[2][0],eat_time[2][1]); //时间显示
if((calendar.sec>0) &&(calendar.sec <=2)) //防止一分钟内重复判断
{
if((calendar.hour == eat_time[0][0])&&(calendar.min==eat_time[0][1]))
eat_flag = 1;
if((calendar.hour == eat_time[1][0])&&(calendar.min==eat_time[1][1]))
eat_flag = 2;
if((calendar.hour == eat_time[2][0])&&(calendar.min==eat_time[2][1]))
eat_flag = 3;
}
if(send_flag==1)
{
switch(eat_flag)
{
case 1 :OLED_printf(0,2," ");
break;
case 2 :OLED_printf(0,4," ");
break;
case 3 :OLED_printf(0,6," ");
break;
}
}
if(send_flag==1) //发送状态
{
send_flag = 0;
i= sprintf((char *)send_str,"%dW%dW ",eat_flag,drug_shortge_flag);
UsartPrintf(ESP8266_USART,"AT+CIPSEND=0,%d\r\n",i);
}
else
{
UsartPrintf(ESP8266_USART,(char *)send_str);
send_flag = 1;
}
if(eat_flag==0)
{
TIM_SetCompare4(TIM4,100);
}
else
{
TIM_SetCompare4(TIM4,200);
if(Key_Scan()== 1)//按键按下
{
eat_flag = 0;
Beep = 1;
}
}
}
if(eat_flag>0) //吃药时间到,蜂鸣器报警
{
Beep = !Beep;
delay_ms(100);
}
if(PAin(11) == 0) //遮挡低电平有药品
drug_shortge_flag = 0;
else
drug_shortge_flag = 1;
}
}
void TIM3_IRQHandler(void) //0.1ms一次
{
if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)//是更新中断
{
time_s++;
TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIM3更新中断标志
}
}
在系统主程序设计中,首先STM32单片机通过DS1302模块初始化并获取当前时间,OLED液晶屏实时显示当前时间,并进入待机状态等待用户设置吃药时间。ESP8266 WiFi模块初始化,准备与手机APP建立通信。在接近设定的吃药时间时,主程序定期检查当前时间与设定时间的差值。当时间与设定时间匹配时,系统通过蜂鸣器和LED灯发出声光提醒,并通过APP同步推送提醒通知给用户。用户通过按键关闭提醒,系统收到用户的操作信号后,触发舵机自动将药品推出至药盒出口,用户可取药。系统能够实时通过红外传感器实时检测药品数量。如果药品不足,液晶和手机会同时显示提醒信息,提示用户及时补充药品。系统主程序设计如图
4、原理图/PCB
原理图和PCB都使用立创EDA绘制,对新手较为友好。可以导出为AD格式的文件
5、论文
系统以STM32单片机作为主控制器,利用DS1302模块进行时间设定。系统通过OLED液晶实时显示当前时间和下次吃药时间,并通过ESP8266 WiFi无线通信模块与手机APP建立数据通信。用户可通过手机APP设置吃药时间,当达到设定时间时通过声光提醒用户,同时手机APP同步提醒。用户可通过按键关闭吃药提醒,药盒通过舵机自动将药品推出。系统通过红外传感器对药品进行实时检测,当药品数量不足时,OLED液晶屏幕与手机App同步显示提醒信息。