项目介绍
本文研究了单片机输液监控系统,以STM32F103C8T6单片机为核心,利用DS18B20温度传感器对输液瓶中液体进行温度检测,利用液位传感器进行液位检测,将其显示在OLED屏上。红外传感器进行滴速测量,通过步进电机控制药液滴速的控制,通过按键可以进行最大滴速和最小滴速的设置,并通过蓝牙模块将其数据发送至手机端。本次开发的单片机输液监控系统可以显示药液是否空瓶,此系统方便医护人员对患者输液状态的监控大大提高了工作效率,适合在医院、诊所等场合推广。
功能介绍
设计一基于单片机的输液监控系统,该系统以单片机作为控制芯片,可以检测输液瓶内液位、检测液体点滴速度值及液体温度,传感器采集到的信号通过A/D转换传送到单片机中完成数据处理,控制步进电机工作来调整滴速,实现液体点滴的智能监控。
1)实现输液瓶中液位的测量、点滴速度的测量及液体温度检测;
2)可手动设置液位阈值、速度阈值及温度阈值;
3)在显示屏上显示相关数据信息;
4)可实现报警功能;
5)可实现点滴速度控制和液体温度控制功能。
6)可将数据通过蓝牙传输到手机端。
所用模块
系统原理图
实物图
部分代码
#include “sys.h”
#include “stdio.h”
#include “string.h”
#include “stdlib.h”
#include “math.h”
#include “delay.h”
#include “gpio.h”
#include “key.h”
#include “oled.h”
#include “usart.h”
#include “ds18b20.h”
#include “exti.h”
#include “timer.h”
#include “motor_bujin.h”
#include “tcs34725.h”
/**********************************
变量定义
**********************************/
uint8_t key_num = 0; //按键扫描标志位
uint8_t flag_display = 0; //显示界面标志位
uint32_t time_num = 0; //10ms计时
char display_buf[48] = {0}; //显示缓存区
_Bool flag_run = 0; //开始运行标志位
_Bool flag_liquid = 0; //药水状态标志位
_Bool alarm_liquid = 0; //药水异常标志位
_Bool flag_liquid_send = 0; //发送药水空标志位
short temp_value = 0; //温度值
u16 temp_max = 40; //温度最大值
u16 temp_min = 10; //温度最小值
COLOR_RGBC rgb; //获取的RGB值
u8 red_value = 0; //红色识别值
u16 red_cumulative = 0; //累计红色值
u8 red_count = 0; //红色识别计数
_Bool alarm_red = 0; //红色回血标志位
_Bool flag_red_send = 0; //发送回血标志位
u16 flow_value = 0; //药水流速值
u16 flow_max = 80; //药水流速最大值
u16 flow_min = 40; //药水流速最小值
_Bool flag_flowmanage = 0; //流速处理标志位
extern uint32_t pulse_num; //脉冲数
extern _Bool flag_timer_begin; //计时开始标志位
extern _Bool flag_3s; //定时3s完成标志位
extern _Bool flag_bujin_foreward; //步进电机正转标志位
extern _Bool flag_bujin_reversal; //步进电机反转标志位
extern _Bool flag_bujin_state; //步进电机状态标志位
/**********************************
函数声明
**********************************/
void Key_function(void); //按键函数
void Monitor_function(void); //监测函数
void Display_function(void); //显示函数
void Manage_function(void); //处理函数
/****
******* 主函数
*****/
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //配置中断优先分组
Delay_Init(); //延时初始化
Gpio_Init(); //IO初始化
Key_Init(); //按键初始化
Oled_Init(); //OLED初始化
Oled_Clear_All(); //清屏
Usart1_Init(9600); //串口1初始化
Step_Motor_Init(); //步进电机初始化
Exti_Configuration_Init(); //中断初始化
TIM2_Init(999,7199); //定时器初始化
while(DS18B20_Init()); //DS18B20初始化
while(TCS34725_Init() == 0); //TCS34725初始化
while(1)
{
Key_function(); //按键函数
Monitor_function(); //监测函数
Display_function(); //显示函数
Manage_function(); //处理函数
time_num++; //计时变量+1
Delay_ms(10);
if(time_num %10 == 0)
LED_SYS = ~LED_SYS;
if(time_num >= 5000)
{
time_num = 0;
}
}
}
/****
*******按键函数
*****/
void Key_function(void)
{
key_num = Chiclet_Keyboard_Scan(0); //按键扫描
if(key_num != 0) //有按键按下
{
switch(key_num)
{
case 1: //按键1,切换设置界面
flag_display++;
if(flag_display >= 5)
flag_display = 0;
Oled_Clear_All(); //清屏
break;
case 2: //按键2
switch(flag_display)
{
case 1: //界面1:温度最大值+1
if(temp_max < 99)
temp_max++;
break;
case 2: //界面2:温度最小值+1
if(temp_min < temp_max-1)
temp_min++;
break;
case 3: //界面3:流速最大值+1
if(flow_max < 99)
flow_max++;
break;
case 4: //界面4:流速最小值+1
if(flow_min < flow_max-1)
flow_min++;
break;
default:
break;
}
break;
case 3: //按键3
switch(flag_display)
{
case 0: //界面0:切换输液状态
if(flag_run == 0)
flag_run = 1;
else
flag_run = 0;
break;
case 1: //界面1:温度最大值-1
资料下载链接
「实物制作资料 分享.rar」,来自夸克网盘分享。
夸克网盘无需下载在线播放视频,畅享原画5倍速,支持电视投屏。
/7b80346jCs😕
链接:https://pan.quark.cn/s/3e81858eda83
提取码:Ceiz