【STM32设计】基于STM32的智能药盒控制系统(硬件+资料+论文)

  资料下载:


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同步显示提醒信息。
在这里插入图片描述

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/lihuadetongzhuo/article/details/146428241
今日推荐