当前位置: 首页 > article >正文

STM32实战:基于STM32F103的智能输液监控系统(液滴检测+报警)

文章目录一、项目概述二、硬件电路连接三、开发环境准备四、STM32CubeMX配置步骤1新建工程步骤2系统时钟配置步骤3GPIO引脚配置步骤4串口配置步骤5工程生成五、系统工作流程图六、完整代码实现1. 创建文件名main.c2. 创建文件名gpio.c3. 创建文件名gpio.h4. 创建文件名usart.c5. 创建文件名usart.h6. 创建文件名delay.c7. 创建文件名delay.h8. 创建文件名stm32f10x_it.c9. 创建文件名stm32f10x_it.h七、代码编译与下载步骤1添加文件到工程步骤2编译工程步骤3程序下载八、实物调试与功能验证步骤1硬件连接检查步骤2串口调试步骤3功能测试九、常见问题解决十、项目扩展功能一、项目概述本项目基于STM32F103C8T6单片机实现输液液滴自动检测、滴速计算、液位异常报警功能完全适配医疗输液场景零基础也能一步步复刻实现。核心功能红外对管检测输液液滴无接触式采集信号实时计算输液滴速串口打印数据滴速异常/输液完成自动触发蜂鸣器LED报警硬件电路简单、代码开源可直接移植硬件清单主控STM32F103C8T6最小系统板检测模块红外对管发射管接收管报警模块有源蜂鸣器、LED指示灯辅助杜邦线、USB转TTL模块、5V电源二、硬件电路连接所有接线均为直连无需额外复杂电路严格按照下表操作器件引脚STM32F103引脚功能说明红外发射管正极3.3V供电红外发射管负极GND接地红外接收管输出PA0液滴检测信号输入红外接收管VCC3.3V供电红外接收管GNDGND接地蜂鸣器正极PB0报警控制蜂鸣器负极GND接地LED正极PB1状态指示LED负极GND接地USB转TTL TXDPA10串口发送USB转TTL RXDPA9串口接收USB转TTL GNDSTM32 GND共地三、开发环境准备本项目使用Keil5 MDKSTM32CubeMX零基础推荐自动生成初始化代码安装Keil5 MDK添加STM32F1系列芯片库安装STM32CubeMX配置Java环境安装USB转TTL驱动准备STM32F103C8T6最小系统板四、STM32CubeMX配置步骤1新建工程打开STM32CubeMX点击ACCESS TO MCU SELECTOR搜索STM32F103C8T6选中芯片点击Start Project步骤2系统时钟配置点击RCCHSE选择Crystal/Ceramic Resonator点击Clock Configuration设置系统时钟为72MHz步骤3GPIO引脚配置PA0设置为GPIO_INPUT液滴检测输入PB0设置为GPIO_OUTPUT蜂鸣器控制PB1设置为GPIO_OUTPUTLED指示灯步骤4串口配置点击USART1模式选择Asynchronous波特率115200数据位8停止位1无校验步骤5工程生成点击Project Manager设置工程名、存储路径Toolchain/IDE选择MDK-ARM V5点击GENERATE CODE生成工程五、系统工作流程图否是正常异常/完成系统上电初始化红外对管检测液滴信号检测到液滴?计数1, 计算滴速滴速正常/输液完成?蜂鸣器LED报警六、完整代码实现所有代码均为标准库函数无复杂操作直接替换对应文件即可。1. 创建文件名main.c#includestm32f10x.h#includedelay.h#includeusart.h#includegpio.h// 全局变量定义uint16_tdrop_count0;// 液滴计数uint32_ttime_count0;// 计时变量floatdrop_speed0.0;// 滴速滴/分钟uint8_tdrop_flag0;// 液滴检测标志位// 函数声明voidSystem_Init(void);// 系统总初始化voidDrop_Check(void);// 液滴检测函数voidAlarm_Check(void);// 报警判断函数voidAlarm_On(void);// 报警开启voidAlarm_Off(void);// 报警关闭intmain(void){// 系统初始化System_Init();// 开机提示printf(STM32智能输液监控系统已启动\r\n);printf(\r\n);while(1){Drop_Check();// 实时检测液滴Alarm_Check();// 实时判断报警条件time_count;// 计时累加// 每1秒计算一次滴速if(time_count1000){// 滴速计算公式60秒内的滴数 检测到的滴数 * 60drop_speeddrop_count*60;// 串口打印数据printf(液滴总数%d 滴\r\n,drop_count);printf(当前滴速%.1f 滴/分钟\r\n,drop_speed);printf(\r\n);// 重置计时time_count0;// 重置计数如需累计总滴数注释此行drop_count0;}delay_ms(1);}}// 系统总初始化GPIO串口延时voidSystem_Init(void){delay_init();// 延时初始化USART1_Init();// 串口初始化GPIO_Init();// GPIO初始化Alarm_Off();// 关闭报警}// 液滴检测函数红外对管信号判断voidDrop_Check(void){// 红外接收管无液滴为高电平有液滴为低电平if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)0drop_flag0){drop_flag1;// 标志位置1防止重复计数drop_count;// 液滴计数1printf(检测到液滴\r\n);}// 液滴离开重置标志位if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)1){drop_flag0;}}// 报警判断函数滴速异常/输液完成触发报警voidAlarm_Check(void){// 条件1滴速为0输液完成// 条件2滴速超过120滴/分钟过快异常if(drop_speed0||drop_speed120){Alarm_On();}else{Alarm_Off();}}// 报警开启蜂鸣器响LED亮voidAlarm_On(void){GPIO_SetBits(GPIOB,GPIO_Pin_0);// 蜂鸣器开GPIO_SetBits(GPIOB,GPIO_Pin_1);// LED亮}// 报警关闭蜂鸣器停LED灭voidAlarm_Off(void){GPIO_ResetBits(GPIOB,GPIO_Pin_0);// 蜂鸣器关GPIO_ResetBits(GPIOB,GPIO_Pin_1);// LED灭}2. 创建文件名gpio.c#includegpio.h// GPIO初始化PA0输入PB0/PB1推挽输出voidGPIO_Init(void){GPIO_InitTypeDef GPIO_InitStruct;// 开启GPIOA、GPIOB时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);// PA0红外接收输入GPIO_InitStruct.GPIO_PinGPIO_Pin_0;GPIO_InitStruct.GPIO_ModeGPIO_Mode_IN_FLOATING;// 浮空输入GPIO_Init(GPIOA,GPIO_InitStruct);// PB0蜂鸣器输出PB1LED输出GPIO_InitStruct.GPIO_PinGPIO_Pin_0|GPIO_Pin_1;GPIO_InitStruct.GPIO_ModeGPIO_Mode_Out_PP;// 推挽输出GPIO_InitStruct.GPIO_SpeedGPIO_Speed_50MHz;// 速度50MHzGPIO_Init(GPIOB,GPIO_InitStruct);}3. 创建文件名gpio.h#ifndef__GPIO_H#define__GPIO_H#includestm32f10x.hvoidGPIO_Init(void);#endif4. 创建文件名usart.c#includeusart.h// 串口1初始化波特率115200voidUSART1_Init(void){GPIO_InitTypeDef GPIO_InitStruct;USART_InitTypeDef USART_InitStruct;NVIC_InitTypeDef NVIC_InitStruct;// 开启时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA,ENABLE);// PA9TX 复用推挽输出GPIO_InitStruct.GPIO_PinGPIO_Pin_9;GPIO_InitStruct.GPIO_ModeGPIO_Mode_AF_PP;GPIO_InitStruct.GPIO_SpeedGPIO_Speed_50MHz;GPIO_Init(GPIOA,GPIO_InitStruct);// PA10RX 浮空输入GPIO_InitStruct.GPIO_PinGPIO_Pin_10;GPIO_InitStruct.GPIO_ModeGPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA,GPIO_InitStruct);// 串口配置USART_InitStruct.USART_BaudRate115200;USART_InitStruct.USART_WordLengthUSART_WordLength_8b;USART_InitStruct.USART_StopBitsUSART_StopBits_1;USART_InitStruct.USART_ParityUSART_Parity_No;USART_InitStruct.USART_HardwareFlowControlUSART_HardwareFlowControl_None;USART_InitStruct.USART_ModeUSART_Mode_Rx|USART_Mode_Tx;USART_Init(USART1,USART_InitStruct);// 使能串口USART_Cmd(USART1,ENABLE);}// 重定向printf函数实现串口打印intfputc(intch,FILE*f){USART_SendData(USART1,(uint8_t)ch);while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)RESET);returnch;}5. 创建文件名usart.h#ifndef__USART_H#define__USART_H#includestm32f10x.h#includestdio.hvoidUSART1_Init(void);#endif6. 创建文件名delay.c#includedelay.h// 延时初始化voiddelay_init(void){SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);SysTick-CTRL~SysTick_CTRL_ENABLE_Msk;}// 毫秒延时voiddelay_ms(uint32_tms){uint32_ti;SysTick-LOAD9000;SysTick-CTRL|SysTick_CTRL_ENABLE_Msk;for(i0;ims;i){while(!(SysTick-CTRL(116)));}SysTick-CTRL~SysTick_CTRL_ENABLE_Msk;}// 微秒延时voiddelay_us(uint32_tus){uint32_ti;SysTick-LOAD9;SysTick-CTRL|SysTick_CTRL_ENABLE_Msk;for(i0;ius;i){while(!(SysTick-CTRL(116)));}SysTick-CTRL~SysTick_CTRL_ENABLE_Msk;}7. 创建文件名delay.h#ifndef__DELAY_H#define__DELAY_H#includestm32f10x.hvoiddelay_init(void);voiddelay_ms(uint32_tms);voiddelay_us(uint32_tus);#endif8. 创建文件名stm32f10x_it.c#includestm32f10x_it.hvoidNMI_Handler(void){}voidHardFault_Handler(void){while(1){}}voidMemManage_Handler(void){while(1){}}voidBusFault_Handler(void){while(1){}}voidUsageFault_Handler(void){while(1){}}voidSVC_Handler(void){}voidDebugMon_Handler(void){}voidPendSV_Handler(void){}voidSysTick_Handler(void){}9. 创建文件名stm32f10x_it.h#ifndef__STM32F10X_IT_H#define__STM32F10X_IT_H#includestm32f10x.h#endif七、代码编译与下载步骤1添加文件到工程打开Keil5打开生成的工程在Project中新建分组将上述所有.c和.h文件添加到工程配置头文件路径步骤2编译工程点击Build按钮无报错、无警告即为编译成功若报错检查文件路径、引脚定义、拼写错误步骤3程序下载连接ST-Link下载器与STM32开发板Keil中配置下载器为ST-Link Debugger点击Load按钮下载程序到单片机八、实物调试与功能验证步骤1硬件连接检查检查所有接线是否与接线表一致红外对管对准输液管滴壶无遮挡蜂鸣器、LED接线无短路步骤2串口调试打开串口调试助手波特率选择115200系统上电串口打印启动信息用手遮挡红外对管模拟液滴串口打印检测到液滴步骤3功能测试正常滴速红外对管检测到液滴串口实时显示滴速无报警输液完成无液滴输入滴速为0蜂鸣器响、LED亮滴速过快快速遮挡红外对管滴速超过120触发报警九、常见问题解决串口无数据输出检查USB转TTL接线TX接PA10RX接PA9检查波特率是否为115200检查共地是否连接液滴不计数红外对管正负极接反接收管输出引脚未接PA0红外对管距离过远蜂鸣器不报警蜂鸣器正负极接反PB0引脚配置错误报警条件未触发程序无法下载下载器接线错误开发板未上电芯片选择错误十、项目扩展功能添加OLED屏幕实时显示滴速、液滴总数添加蓝牙模块实现手机APP远程监控添加按键设置滴速阈值添加存储模块记录输液数据

相关文章:

STM32实战:基于STM32F103的智能输液监控系统(液滴检测+报警)

文章目录 一、项目概述二、硬件电路连接三、开发环境准备四、STM32CubeMX配置步骤1:新建工程步骤2:系统时钟配置步骤3:GPIO引脚配置步骤4:串口配置步骤5:工程生成 五、系统工作流程图六、完整代码实现1. 创建文件名&am…...

ESP32-C3蓝牙开发避坑指南:从零到一搞懂ESP-IDF里的那些BLE示例(保姆级梳理)

ESP32-C3蓝牙开发实战指南:从协议栈到项目落地的全流程解析 第一次打开ESP-IDF的蓝牙示例目录时,那种扑面而来的压迫感至今记忆犹新——上百个示例文件像迷宫般展开,每个都声称能解决特定问题,却没人告诉我该从哪里开始。作为从ST…...

信号与系统期中突击:45分钟搞定10道选择题的实战复盘与高频考点解析

信号与系统期中突击:45分钟搞定10道选择题的实战复盘与高频考点解析 刚考完信号与系统期中考试的同学,大概率都经历过这样的场景:45分钟倒计时开始,面前是10道看似熟悉却又处处埋坑的选择题。作为一门融合数学推导与工程思维的硬核…...

别再只用`uvicorn main:app`了!这5个实战配置技巧让你的FastAPI服务性能翻倍

别再只用uvicorn main:app了!这5个实战配置技巧让你的FastAPI服务性能翻倍 当你的FastAPI应用从开发环境走向生产环境时,简单的uvicorn main:app命令已经无法满足性能和安全需求。本文将深入探讨5个关键配置技巧,帮助你在真实流量场景下实现服…...

量化交易实战:从MACD到配对交易,构建稳健策略工具箱

1. 项目概述:一个量化交易策略的实战工具箱如果你对金融市场感兴趣,并且相信数据和技术的力量能够带来超越直觉的收益,那么“量化交易”这个词对你来说一定不陌生。它听起来高深莫测,仿佛是高盛、文艺复兴科技这些巨头公司的专利&…...

别再傻等!Vue项目里html2canvas截图慢的3个实战优化技巧

Vue项目中html2canvas性能优化的3个进阶技巧 最近在重构一个可视化大屏项目时,遇到了html2canvas截图卡顿的棘手问题。当用户点击不同分辨率模块进行截图时,等待时间长达5-8秒,控制台不断弹出警告。经过两周的排查和优化,最终将截…...

RISC-V向量扩展VMXDOTP技术解析与AI加速应用

1. RISC-V向量扩展VMXDOTP技术解析在AI计算硬件领域,我们正面临一个关键转折点。现代Transformer模型已经彻底改变了传统神经网络的计算模式——从规整的矩阵乘加运算转向了注意力机制、归一化和数据相关控制流的复杂交织。这种转变对硬件加速器提出了前所未有的灵活…...

Touchpoint:基于无障碍API的跨平台桌面自动化Python库详解

1. 项目概述:为AI智能体装上“眼睛”和“手”如果你正在探索如何让AI智能体(比如Claude、Cursor、GitHub Copilot)真正地“使用”你的电脑,像人类一样操作桌面应用,那么你很可能已经遇到了一个核心难题:如何…...

Twinny:免费离线的AI代码补全工具部署与调优指南

1. 项目概述:当AI代码助手遇上本地化如果你是一名开发者,最近可能已经对GitHub Copilot、Cursor这类AI编程助手产生了依赖。它们确实能极大地提升编码效率,但随之而来的,是每月不菲的订阅费用、对网络环境的依赖,以及将…...

自动驾驶仿真训练平台SIMSCALE的技术解析与应用实践

1. 项目背景与核心价值去年参与某自动驾驶研发项目时,我们团队遇到了真实路测成本高、极端场景覆盖难的问题。当时每天要花费数万元进行车队路测,但遇到暴雨天气或特殊交通状况时,数据采集效率直线下降。正是这种困境让我开始关注仿真技术在自…...

量子计算与高性能计算融合架构解析

1. 量子计算与高性能计算融合的架构演进量子计算与高性能计算(HPC)的融合正在重塑计算科学的边界。作为一名长期跟踪量子计算发展的技术从业者,我见证了从早期量子算法理论到如今实用化量子-HPC混合架构的完整演进过程。这种融合不是简单的硬…...

3秒安全弹出USB设备:告别Windows设备占用难题的高效解决方案

3秒安全弹出USB设备:告别Windows设备占用难题的高效解决方案 【免费下载链接】USB-Disk-Ejector A program that allows you to quickly remove drives in Windows. It can eject USB disks, Firewire disks and memory cards. It is a quick, flexible, portable a…...

事件驱动AI智能体开发:基于inngest/agent-kit构建可靠应用

1. 项目概述:为什么我们需要一个“事件驱动”的智能体开发框架? 最近在折腾AI应用开发,特别是想把大语言模型(LLM)的能力真正嵌入到业务流程里,而不是简单地做个聊天机器人。相信很多同行都遇到过类似的困…...

别再傻傻分不清了!一文搞懂SAR成像的条带、聚束、扫描模式到底怎么选

合成孔径雷达成像模式实战指南:如何根据任务需求精准选择最优方案 第一次接触合成孔径雷达(SAR)成像时,我被各种专业术语和模式选择搞得晕头转向。直到在一次洪灾监测项目中,因为模式选择不当导致关键区域分辨率不足,才真正明白不…...

别再只ifconfig了!深入Linux网络驱动:PHY寄存器访问与状态监控全解析

深入Linux网络驱动:PHY寄存器访问与状态监控实战指南 在Linux网络开发中,大多数开发者对网络接口的操作停留在ifconfig或ip link这样的表层命令。然而当遇到网络抖动、协商失败或驱动兼容性问题时,这些工具提供的信息往往显得力不从心。本文将…...

MAX9705 Class D音频放大器低EMI设计解析

1. MAX9705 Class D音频放大器设计解析在便携式音频设备设计中,工程师们始终面临着一个核心矛盾:如何在有限的空间和功耗预算下,实现高保真音频输出同时满足严格的电磁兼容要求。传统Class AB放大器虽然电磁干扰(EMI)特性良好,但效…...

多核处理器在嵌入式与通信领域的优化实践

1. 多核处理器在嵌入式与通信领域的价值突破十年前我刚入行嵌入式开发时,处理器的性能提升主要依赖制程工艺改进和主频提升。但自从2010年后,行业明显转向了多核架构的发展路线。这种转变在嵌入式与通信领域尤为明显——我们既要应对视频分析、5G信号处理…...

C语言第3讲:分支和循环

大家好!这篇把分支和循环上下两讲全部整合,从基础语法到实战猜数字小游戏,一篇吃透 C 语言最核心的逻辑结构,新手必看、必练、必收藏!📑 完整目录if 语句关系操作符条件操作符逻辑操作符:&&…...

Elasticsearch 9.4 为 Elastic AI 生态系统的下一阶段提供支持:Dell AI Data Platform(与 NVIDIA 合作)

作者:来自 Elastic Sunnie Weber AI 正在快速发展。企业级采用必须有目的地同步推进。 过去一年有一点已经变得非常清晰:企业并不需要更多 AI 炒作,他们需要的是一条通往生产环境的路径 —— 能够将基础设施、数据与智能连接起来,…...

基于RAG的本地代码知识库构建:CodeQAI部署与实战指南

1. 项目概述:当AI代码助手遇见本地知识库最近在折腾一个挺有意思的项目,叫fynnfluegge/codeqai。简单来说,它不是一个传统的代码生成工具,而是一个能让你用自然语言“盘问”自己代码库的智能助手。想象一下,你接手了一…...

Wasker:将Wasm编译为原生ELF,让操作系统直接成为运行时

1. 项目概述:Wasker,一个让操作系统成为Wasm运行时的编译器 如果你和我一样,对WebAssembly(Wasm)的潜力感到兴奋,但又对“运行时”这个中间层带来的性能开销和部署复杂性感到头疼,那么Wasker这个…...

高精度人体3D重建技术:从单张照片到虚拟模型

1. 项目背景与核心价值在数字内容创作领域,高精度人体重建技术一直是计算机视觉和图形学的圣杯级课题。传统方案往往需要在专业摄影棚配备数十台高清相机阵列,通过多视角拍摄获取三维点云数据。这种方案不仅设备成本高达数百万,后期处理流程也…...

FPGA与EtherSound在专业音频设备中的低延迟实现

1. FPGA与EtherSound技术概述在专业音频设备开发领域,实时性和信号保真度是两大核心诉求。传统基于通用处理器的架构往往难以同时满足这两点要求,而FPGA(现场可编程门阵列)因其独特的硬件可编程特性和并行计算能力,正逐…...

TabTune:统一表格模型微调与推理的开源框架

1. 项目概述TabTune是一个专门针对表格数据(Tabular Data)设计的开源工具库,旨在为各类表格基础模型(Table Foundation Models)提供统一的微调(Fine-tuning)和推理(Inference&#x…...

wall-vault:构建高可用AI代理骨干网络,实现密钥管理与智能故障转移

1. 项目概述:一个为AI工作流打造的“永不掉线”中枢如果你和我一样,重度依赖像OpenClaw这样的AI代理框架进行日常开发、写作或自动化,那你一定经历过那种“断线”的恐慌。深夜,一个API密钥配额耗尽,或者服务商突发故障…...

终极免费电路板查看器:OpenBoardView让.brd文件分析变得如此简单

终极免费电路板查看器:OpenBoardView让.brd文件分析变得如此简单 【免费下载链接】OpenBoardView View .brd files 项目地址: https://gitcode.com/gh_mirrors/op/OpenBoardView 还在为查看电路板设计文件而烦恼吗?OpenBoardView是一款功能强大的…...

深入紫光FPGA视频流:手把手解析纯Verilog实现的DDR3图像缓存架构与HDMI输出时序

紫光FPGA视频流处理:纯Verilog实现DDR3缓存与HDMI输出的核心架构解析 在FPGA视频处理系统中,图像缓存与输出时序控制往往是决定系统性能的关键环节。本文将聚焦紫光同创PGL100G系列FPGA,深入剖析两个核心技术模块:基于纯Verilog实…...

Silk v3解码器:3分钟解决微信QQ音频格式转换难题

Silk v3解码器:3分钟解决微信QQ音频格式转换难题 【免费下载链接】silk-v3-decoder [Skype Silk Codec SDK]Decode silk v3 audio files (like wechat amr, aud files, qq slk files) and convert to other format (like mp3). Batch conversion support. 项目地址…...

基于Godot与C#的开源进化模拟游戏Thrive开发全解析

1. 项目概述:一个基于科学的进化模拟游戏 如果你对生命如何从单细胞演化到复杂多细胞生物体的过程感到好奇,或者你一直想亲手“设计”一个属于自己的生态系统,那么 Thrive 这款游戏可能就是你一直在寻找的答案。作为一名长期关注模拟与策略游…...

基于Windows UI自动化实现Antigravity IDE AI辅助开发流程自动确认

1. 项目概述:告别手动点击,让AI开发流程自动流转如果你和我一样,在日常开发中重度依赖像Antigravity IDE这类集成了AI Agent的开发环境,那你肯定对下面这个场景深恶痛绝:你正全神贯注地构思一个复杂功能,让…...