【STM32计划开源】基于STM32的智能点滴输液系统

news/2025/10/11 13:38:21/文章来源:https://www.cnblogs.com/slgkaifa/p/19134856

【STM32计划开源】基于STM32的智能点滴输液系统

目录

一、设计背景和意义

1.1设计背景

1.2设计意义

二、实物效果展示

2.1实物图片

2.2实物演示视频

三、硬件功能简介

3.1项目功能详解

3.2元器件清单

四、主框图与软件流程图

五、硬件PCB展示

六、软件程序设计

七、项目资料包内容

资料获取:查看主页介绍“充哥单片机设计”


一、设计背景和意义

1.1设计背景

本课题的立意根植于一个普遍而严峻的临床现实:传统静脉输液的监护模式因其高度依赖人力,正日益成为医疗安全链条上的脆弱一环。护士要求不间断地巡查,凭借肉眼判断滴速、估算余液、感知药液温度,这种模式不仅极大地增加了医护人员的劳动负荷,更因不可避免的疲劳与疏忽,潜藏着液空回血、滴速失控、药液冷刺激等诸多风险,直接关乎患者的生命安全。尽管市场上已有高端智能输液泵产品,但其令人望而却步的成本和操作复杂性,如同一道数字鸿沟,将其牢牢禁锢于重症监护室,无法惠及普通病房与基层医疗场景。因此,本研究的核心意义在于发起一场对传统输液监护模式的普惠式革新,它不仅仅是一个技巧项目,更是一次对智慧医疗“落地难”疑问的务实回应。

1.2设计意义

我们致力于打造的不仅是一台冰冷的机器,更是一位不知疲倦的“智能护士”。它借助精确的自动化监护与控制,将医护人员从机械重复的劳动中解放出来,使其能更专注于更高价值的诊疗决策;它依据及时可靠的报警与远程监控机制,构筑起一道坚实的安全屏障,极大提升了患者的治疗体验与安全感。更重要的是,本设计所坚持的低成本、易用性原则,旨在打破高端医疗手艺的应用壁垒,使其能够真正下沉到社区医院、乡镇卫生院乃至家庭病床,这对于促进医疗资源的公平可及、推动“全民健康”目标的达成,具有深远而积极的社会意义。

二、实物效果展示

2.1实物图片

2.2实物演示视频

【开源】基于STM32的智能点滴输液架构

三、硬件功能简介

3.1项目功能详解

  1. 传感器检测:M03非接触式液位检测,DS18B20检测药液温度,红外对管检测药液滴速。
  2. 信息展示:0.96OLED屏幕显示全部的传感器资料以及传感器的阈值等数据。
  3. 执行机构:借助继电器控制加热片,步进电机控制滴速。
  4. 连接蓝牙APP:系统通过JW01蓝牙模块连接手机蓝牙APP,构建数据上传。
  5. App远程监控:通过App远程监控全部传感器数据。
  6. 阈值数据设定:系统利用按键设定阈值。
  7. 自动模式:根据设定的滴速上下限、温度阈值判断。当检测到的滴速低于下限,步进电机正转加快滴速同时蜂鸣器报警提醒,当检测到滴速高于上限,步进电机反转减缓滴速同时蜂鸣器报警提醒;当检测到到温度低于设定阈值,自动打开加热片对药液进行加热同时蜂鸣器报警提醒;非接触式液位传感器检测到药液为无时,蜂鸣器报警提醒。

3.2元器件清单

  1. STM32F103C8T6主控
  2. 0.96OLED 表明屏幕
  3. JDY-31蓝牙模块
  4. M03非接触式液位传感器
  5. 红外对管滴速检测
  6. DS18B20温度检测
  7. 蜂鸣器声光报警
  8. 加热片
  9. 步进电机
  10. 按键

四、主框图与软件流程图

主框图

流程图

五、硬件PCB展示

六、软件程序设计

#include "sys.h"
#include "delay.h"
#include "gpio.h"
#include "OLED_I2C.h"
#include "ds18b20.h"
#include "timer.h"
#include "usart1.h"
#include "exti.h"
#include 
#include 
#include 
#include "adc.h"
#define STM32_RX1_BUF       Usart1RecBuf
#define STM32_Rx1Counter    RxCounter
#define STM32_RX1BUFF_SIZE  USART1_RXBUFF_SIZE
#define Coil_8B_A  {A=1;B=0;C=0;D=0;}//A相通电,其他相断电
#define Coil_8B_AB {A=1;B=1;C=0;D=0;}//AB相通电,其他相断电
#define Coil_8B_B  {A=0;B=1;C=0;D=0;}//B相通电,其他相断电
#define Coil_8B_BC {A=0;B=1;C=1;D=0;}//BC相通电,其他相断电
#define Coil_8B_C  {A=0;B=0;C=1;D=0;}//C相通电,其他相断电
#define Coil_8B_CD {A=0;B=0;C=1;D=1;}//CD相通电,其他相断电
#define Coil_8B_D  {A=0;B=0;C=0;D=1;}//D相通电,其他相断电
#define Coil_8B_DA {A=1;B=0;C=0;D=1;}//DA相通电,其他相断电
#define Coil_OFF   {A=0;B=0;C=0;D=0;}//全部断电
int flag = 0;
int PulseCount = 0;     //记录脉冲
int Speed = 0;          //滴速
int speed_min = 60;      //滴速下限
int speed_max = 180;     //滴速上限
float temperature=0.0;  //温度
float set_tempval=10.0; //温度设置值
u8 shuaxin = 0;  //刷新标志
u8 setFlag = 0;  //设置标志
u8 NoWater = 0;  //缺水标志
u8 shanshuo = 0; //shanshuo
u8 direction = 0;//方向标志
char display[16];
void Usart1RxBufClear(void) //清除串口接收缓存
{memset(STM32_RX1_BUF, 0, STM32_RX1BUFF_SIZE);//清除缓存STM32_Rx1Counter = 0;
}
void InitDisplay(void)   //初始化显示
{unsigned char i=0;for(i=0;i<6;i++)OLED_ShowCN(i*16+16,0,i+8,0);//显示中文:智能点滴系统for(i=0;i<2;i++)OLED_ShowCN(i*16,2,i+0,0);//显示中文:滴速for(i=0;i<2;i++)OLED_ShowCN(i*16,4,i+2,0);//显示中文:温度for(i=0;i<2;i++)OLED_ShowCN(i*16,6,i+4,0);//显示中文:药水OLED_ShowChar(32,6,':',2,0);
}
void displaySetValue(void)  //显示设置的值
{if(setFlag == 1 || setFlag == 2){sprintf(display,"%003d",(int)speed_min);OLED_ShowStr(40, 4, (u8*)display, 2,setFlag+1-1);//显示滴速下限sprintf(display,"%003d",(int)speed_max);OLED_ShowStr(40, 6, (u8*)display, 2,setFlag+1-2);//显示滴速上限}if(setFlag == 3){sprintf(display,"%4.1fC",set_tempval);OLED_ShowStr(40, 4, (u8*)display, 2,setFlag+1-3);//显示温度}
}
void keyscan(void)   //按键扫描
{unsigned char i=0;if(KEY1 == 0 || strstr(STM32_RX1_BUF,"k1") != NULL) //设置键{delay_ms(20);if(KEY1 == 0 || strstr(STM32_RX1_BUF,"k1") != NULL){Usart1RxBufClear();while(KEY1 == 0);setFlag ++;if(setFlag == 1){OLED_CLS();    //清屏for(i=0;i<4;i++)OLED_ShowCN(i*16+32,0,i+14,0);//显示中文:设置滴速for(i=0;i<2;i++)OLED_ShowCN(i*16,4,i+22,0);//显示中文:下限for(i=0;i<2;i++)OLED_ShowCN(i*16,6,i+24,0);//显示中文:上限OLED_ShowChar(32,4,':',2,0);OLED_ShowChar(32,6,':',2,0);OLED_ShowStr(62, 4, "/min", 2,0);OLED_ShowStr(62, 6, "/min", 2,0);
//                        displaySetValue();}if(setFlag == 3){OLED_CLS();    //清屏for(i=0;i<4;i++)OLED_ShowCN(i*16+32,0,i+18,0);//显示中文:设置温度}if(setFlag >= 4){setFlag = 0;OLED_CLS();    //清屏InitDisplay();if(NoWater==0)OLED_ShowCN(56,6,7,1);//显示中文:无elseOLED_ShowCN(56,6,6,1);//显示中文:有
//                            displaySetValue();}displaySetValue();   //显示没有设置值}}if(KEY2 == 0 || strstr(STM32_RX1_BUF,"k2") != NULL ||get_flag ==1) //加键{delay_ms(100);if(KEY2 == 0 || strstr(STM32_RX1_BUF,"k2") != NULL ||get_flag ==1){get_flag = 0;Usart1RxBufClear();if(setFlag == 1){if(speed_max-speed_min>1)speed_min++;}if(setFlag == 2){if(speed_max<999)speed_max++;}if(setFlag == 3){if(set_tempval<99.9)set_tempval+=0.1;}displaySetValue();   //显示没有设置值}}if(KEY3 == 0 || strstr(STM32_RX1_BUF,"k3") != NULL) //减键{delay_ms(100);if(KEY3 == 0 || strstr(STM32_RX1_BUF,"k3") != NULL){Usart1RxBufClear();if(setFlag == 1){if(speed_min>0)speed_min--;}if(setFlag == 2){if(speed_max-speed_min>1)speed_max--;}if(setFlag == 3){if(set_tempval>0)set_tempval-=0.1;}displaySetValue();   //显示没有设置值}}
}
void Usart1SendData(void)  //串口发送
{printf("滴速:%d\r\n",Speed);printf("液位:%d\r\n",NoWater);printf("温度:%0.1f\r\n",temperature);
}
int main(void)
{delay_init();	           //延时函数初始化NVIC_Configuration();	   //中断优先级配置I2C_Configuration();     //IIC初始化delay_ms(200);OLED_Init();             //OLED液晶初始化OLED_CLS();              //清屏InitDisplay();KEY_GPIO_Init();        //按键引脚初始化MOTOR_GPIO_Init();     //步进电机初始化DS18B20_GPIO_Init();EXTIX_Init();DS18B20_Init();         //初始化显示uart1_init(9600);TIM3_Init(99,719);   //定时器初始化Adc_Init();while(1){keyscan();  //按键扫描if(setFlag == 0)   //不在设置状态下{
//                     Get_Water_Value(&Water_Value);if((Speed!=0)&&((Speedspeed_max))&&shanshuo)   //滴速不在范围,闪烁显示{OLED_ShowStr(32, 2,":         ", 2,0);     //显示空白}else{sprintf(display,": %003d/min ",(int)Speed);OLED_ShowStr(32, 2, (u8*)display, 2,0);//显示滴速}if(Speed!=0){if(Speedspeed_max) direction=2;    //滴速过快,电机反转,模拟收紧调节阀else direction=0;  //在正常滴速范围,电机停止}else{direction=0;  //停止}if(shuaxin == 1){shuaxin = 0;temperature=ReadTemperature();           //读取温度if(temperature < set_tempval)relay = 1;  //温度低于设置值,开启加热else relay = 0;                          //温度达到设置值,关闭加热Usart1SendData();  //数据1秒发送一次}if(temperature=1000)  //1s{timeCount1 = 0;shuaxin = 1;}if(timeCount2 >= 1000)  //1s{timeCount2 = 0;Speed = PulseCount * 60;   //获取计数值,转化为滴/每分钟PulseCount = 0;}if(timeCount3>=300)  //300ms{timeCount3 = 0;shanshuo = !shanshuo;if(!setFlag){if(NoWater==0)  //无药水,蜂鸣器一直报警{beep = 1;LED1_ON;LED2_ON;}else{if(((Speed!=0)&&((Speedspeed_max)))||temperature

七、项目资料包内容

资料获取:查看主页介绍“充哥单片机设计”

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/934748.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

溶气气浮/浅层气浮/国内知名气浮机靠谱厂家品牌推荐

溶气气浮/浅层气浮/国内知名气浮机靠谱厂家品牌推荐 无锡工源环境科技股份有限公司是一家在环保水处理设备领域,特别是气浮设备研发与制造方面,具有深厚技术积累和市场声誉的高新技术企业。公司始终专注于水处理技术…

iOS 26 崩溃日志深度指南,如何收集、符号化、定位与监控 - 实践

iOS 26 崩溃日志深度指南,如何收集、符号化、定位与监控 - 实践2025-10-11 13:35 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !imp…

鸿蒙Next密码自动填充服务:安全与便捷的完美融合 - 实践

鸿蒙Next密码自动填充服务:安全与便捷的完美融合 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas…

覆盖动画 / 工业 / 科研!Rhino 7:专业 3D 建模的全能解决方案,新手也能上手

在 3D 建模领域,一款功能强大、兼容广泛且高效稳定的工具,往往能成为设计师、工程师突破创作瓶颈的关键。由美国 Robert McNeel 公司打造的Rhinoceros(简称 Rhino) 系列软件,凭借其 “集百家之长” 的设计理念,早…

2020CSP-J2比赛记录题解

题目请看洛谷备注:这次比赛我是没打的T1 先把数转成二进制,逐位计算,并判断是否可完整正确拆分贴一下代码 #include <bits/stdc++.h> using namespace std; #define fre(c) freopen(c".in","r…

Binder.getCallingPid()和Binder.getCallingUid()漏洞分析

最近在学习安卓漏挖,在分析ghera数据集时发现一个很有意思的binder特性,但还没搞懂底层原理,先挖个坑 漏洞分析EnforceCallingOrSelfPermission-PrivilegeEscalation-Lean以下代码使用Binder.getCallingPid()和Bind…

详细介绍:golang基础语法(五)切片

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

让博客园设置支持PlantUml画图

1. 引入 2. 博客园不支持plantuml渲染 3. 编写js脚本支持plantuml 4. 缺点‍ 1. 引入众所周知,我们在写博客的时候,常使用PlantUML 和 Mermaid绘制图表、流程图、架构图。这是因为用代码去画图,不怎么需要手动控制格…

jj

jjimport numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns from sklearn.preprocessing import StandardScaler from sklearn.decomposition import PCA from sklearn.cluste…

光谱相机的未来趋势 - 详解

光谱相机的未来趋势 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", …

Hall定理学习笔记

内容 设二分图左部点点数为 \(x\),右部点点数为 \(y\),且满足 \(x<y\)。定义一张二分图的完备匹配为:对于任意一个左部点都有与之匹配的右部点。 \(\text{Hall}\) 定理的内容是:一张二分图有完备匹配,等价于对…

面向对象抽象,接口多态综合-动物模拟系统

1、抽象一个动物类,会说话和走路。 public abstract class Animal() { public abstract void Speak(); public abstract void Walk(); } 2、抽象出能力,有的动物会飞,有的动物能用四条腿走路 interface IFly { void…

实用指南:APache shiro-550 CVE-2016-4437复现

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Spark - deprecated registerTempTable() function

Spark - deprecated registerTempTable() functionIn Apache Spark, the function registerTempTable() was an old API (deprecated since Spark 2.0 and removed in Spark 3.0) that allowed you to register a Data…

MinGW-即时入门-全-

MinGW 即时入门(全)原文:zh.annas-archive.org/md5/a899d9a6a04025b2abd50163c83cff2a 译者:飞龙 协议:CC BY-NC-SA 4.0第一章. 立即开始使用 MinGW 欢迎使用 立即开始使用 MinGW。 本书特别创建,旨在为您提供所…

个人微信开发文档

个人微信开发文档、微信个人号api开发、微信机器人API 微信机器人是一种基于微信平台的自动化程序,能够根据用户的输入自动回复信息。它可以用于客服、信息查询、娱乐等多个场景。通过程序化的方式,微信机器人可以在…

Splay学习笔记

问题分析: (来源:洛谷P3369【模板】普通平衡树) 您需要动态地维护一个可重集合 \(M\),并且提供以下操作:向 \(M\) 中插入一个数 \(x\)。 从 \(M\) 中删除一个数 \(x\)(若有多个相同的数,应只删除一个)。 查询…

象棋图片转FEN字符串详细教程

如把下图转换成:3ak4/7R1/3aCcN2/p7p/6r2/9/Pr1p1n2P/4B1p2/9/2BAKA1R1 模型21K,Intel N100上训练时间0.969秒,识别时间0.957秒。识别率好像是100% 一、安装软件包 apt install python3-scipy python3-pil 二、建目…

自然语言处理在风险识别中的应用

本文介绍了如何利用自然语言处理和机器学习技术来识别和预测风险,包括在在线教育平台和产品开发阶段的应用,以及相关技术架构和团队构成。利用自然语言处理理解和识别风险 作为某中心的应用科学经理,Muthu Chandras…

详细介绍:正点原子【第四期】Linux之驱动开发学习笔记-6.1 pinctrl和gpio子系统

详细介绍:正点原子【第四期】Linux之驱动开发学习笔记-6.1 pinctrl和gpio子系统pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-…