零基础学会制作 基于STM32/51单片机的输液监控系统设计/医院输液/输液检测/输液检测装置

项目介绍

本文研究了单片机输液监控系统,以STM32F103C8T6单片机为核心,利用DS18B20温度传感器对输液瓶中液体进行温度检测,利用液位传感器进行液位检测,将其显示在OLED屏上。红外传感器进行滴速测量,通过步进电机控制药液滴速的控制,通过按键可以进行最大滴速和最小滴速的设置,并通过蓝牙模块将其数据发送至手机端。本次开发的单片机输液监控系统可以显示药液是否空瓶,此系统方便医护人员对患者输液状态的监控大大提高了工作效率,适合在医院、诊所等场合推广。

功能介绍

设计一基于单片机的输液监控系统,该系统以单片机作为控制芯片,可以检测输液瓶内液位、检测液体点滴速度值及液体温度,传感器采集到的信号通过A/D转换传送到单片机中完成数据处理,控制步进电机工作来调整滴速,实现液体点滴的智能监控。
1)实现输液瓶中液位的测量、点滴速度的测量及液体温度检测;
2)可手动设置液位阈值、速度阈值及温度阈值;
3)在显示屏上显示相关数据信息;
4)可实现报警功能;
5)可实现点滴速度控制和液体温度控制功能。
6)可将数据通过蓝牙传输到手机端。

所用模块

基于单片机的输液监控系统设计旨在提高医疗输液过程的自动化水平、精确度和安全性。该系统集成了点滴感应模块、液位监测模块、步进电机驱动模块、步进电机模块、显示模块、温度检测、蓝牙模块等关键技术,以确保输液过程的稳定性和准确性[15]。系统的核心是一款高性能的单片机,负责整个输液监控系统的控制逻辑和数据处理。单片机通过各种传感器模块收集实时数据,如点滴速率、液体量等,并根据设定的输液参数控制步进电机的运转,以调节输液速率,同时通过显示模块反馈输液状态信息给医护人员[16]。点滴感应模块负责监测输液的滴速,确保输液速度符合医嘱要求[17]。该模块通过光电传感器实时检测输液瓶中液滴的下落,转换成电信号后送至单片机进行处理。液位监测模块通过液位传感器监测输液瓶中的液体量,当液体达到预设的低液位警告线时,系统将自动发出报警提示,确保医护人员可以及时更换药液[18]。步进电机驱动模块接收单片机的控制信号,驱动步进电机按照指定的方向和速度运转。该模块的设计确保了输液速率的精确调节,满足不同病人的需求[19]。步进电机模块直接连接输液管路,通过精确控制其转速和方向来调整输液的速率。步进电机的运转精度直接影响输液速率的准确性和稳定性[20]。显示模块实时显示当前的输液状态,包括滴速、总滴数、剩余液体量等信息。此外,系统异常(如液位过低、滴速异常等)也会通过该模块以文本或图形形式提醒医护人员。温度检测模块检测当前液体的温度状态,根据设定的温度进行升温和降温。蓝牙模块将滴速、液体的温度、药液的剩余情况、发送至手机端。

系统原理图

在这里插入图片描述

实物图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

部分代码

#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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值