基于STM32的智能病房监控系统设计
摘要:随着物联网技术的快速发展,智能医疗系统逐渐成为医疗行业的重要组成部分。本文设计了一种基于STM32F103C8T6单片机的智能病房监控系统,该系统能够实时监测病房内的环境参数(如温湿度、烟雾浓度、光照强度)以及病人的生理参数(如心率、血氧饱和度)。通过MAX30101心率血氧传感器、DHT11温湿度传感器、MQ-2烟雾传感器、光照传感器等模块采集数据,并利用OLED显示屏展示实时数据。同时,系统通过WiFi模块将数据上传至APP调试器进行远程监控,并能够通过界面按钮控制风扇、蜂鸣器和舵机的动作,实现病房环境的智能调控。本文详细介绍了系统的硬件设计、软件实现以及测试结果,验证了系统的可靠性和实用性。
关键词:STM32;智能病房;监控系统;传感器;WiFi模块
Abstract: With the rapid development of the Internet of Things technology, intelligent medical systems have gradually become an important part of the medical industry. This paper designs an intelligent ward monitoring system based on the STM32F103C8T6 microcontroller. The system can monitor the environmental parameters (such as temperature and humidity, smoke concentration, and light intensity) in the ward as well as the physiological parameters (such as heart rate and blood oxygen saturation) of the patient in real time. Data is collected through modules such as the MAX30101 heart rate and blood oxygen sensor, DHT11 temperature and humidity sensor, MQ-2 smoke sensor, and light sensor, and displayed in real time on an OLED display. At the same time, the system uploads data to an APP debugger for remote monitoring via a WiFi module and can control the actions of fans, buzzers, and servos through interface buttons to achieve intelligent regulation of the ward environment. This paper introduces the hardware design, software implementation, and test results of the system in detail, verifying the reliability and practicality of the system.
Keywords: STM32; Intelligent Ward; Monitoring System; Sensor; WiFi Module
一、引言
随着人口老龄化的加剧和医疗技术的不断进步,医疗系统对病房监控的要求也越来越高。传统的病房监控系统大多采用有线连接,布线复杂且维护成本高,同时无法实现远程监控和智能调控。而基于STM32的智能病房监控系统则能够很好地解决这些问题,通过物联网技术实现数据的无线传输和远程监控,同时根据采集到的数据自动调控病房环境,为病人提供一个更加舒适、安全的治疗环境。
二、系统总体设计
2.1 系统功能需求
本系统需要实现以下功能:
- 实时监测病房内的温湿度、烟雾浓度、光照强度等环境参数。
- 实时监测病人的心率、血氧饱和度等生理参数。
- 通过OLED显示屏展示实时数据。
- 将采集到的数据通过WiFi模块上传至APP调试器进行远程监控。
- 根据环境参数和生理参数自动调控病房环境,如控制风扇通风、舵机开闭窗帘等。
2.2 系统总体架构
本系统采用STM32F103C8T6单片机作为主控芯片,通过多个传感器模块采集数据,并通过WiFi模块将数据上传至APP调试器。系统总体架构如图2-1所示。
<img src="https://example.com/system_architecture.png" />
(示例图片链接,实际使用时请替换为真实图片)
三、硬件设计
3.1 主控芯片
STM32F103C8T6是一款基于ARM Cortex-M3内核的32位微控制器,具有丰富的外设资源和强大的处理能力,能够满足本系统对数据处理和实时控制的需求。
3.2 心率血氧传感器模块
MAX30101是一款集成了LED、光电检测器、低噪声模拟前端和16位ADC的高度集成心率血氧传感器。通过该传感器,系统可以实时监测病人的心率和血氧饱和度。MAX30101模块通过I2C接口与STM32单片机通信,实现数据的采集和传输。
3.3 温湿度传感器模块
DHT11是一款含有数字信号输出的温湿度传感器,包括一个电阻式感湿元件和一个NTC测温元件。该传感器具有响应快、抗干扰能力强、性价比高等优点。DHT11模块通过单总线数字信号与STM32单片机通信,实现温湿度数据的采集。
3.4 烟雾传感器模块
MQ-2是一款常用的烟雾传感器,可以检测多种可燃性气体和烟雾。该传感器具有灵敏度高、稳定性好、响应速度快等特点。MQ-2模块通过模拟信号输出与STM32单片机连接,实现烟雾浓度的采集。
3.5 光照传感器模块
光照传感器模块采用光敏电阻作为检测元件,能够检测环境光照强度的变化。该模块通过模拟信号输出与STM32单片机连接,实现光照数据的采集。
3.6 蜂鸣器模块
蜂鸣器模块用于心率、血氧和烟雾异常报警提醒。当系统检测到心率、血氧或烟雾浓度异常时,蜂鸣器将发出报警声音,提醒医护人员及时处理。
3.7 风扇模块
风扇模块用于检测到烟雾过大时开启通风,以降低病房内的烟雾浓度。该模块通过继电器模块与STM32单片机连接,实现风扇的开关控制。
3.8 舵机模块
舵机模块用于检测到光照过低时启动打开窗帘,否则关闭窗帘。该模块通过PWM信号与STM32单片机连接,实现窗帘的开闭控制。
3.9 OLED显示屏模块
OLED显示屏用于显示各项参数数值,包括温湿度、心率、血氧、烟雾浓度和光照强度等。该显示屏采用I2C接口与STM32单片机通信,实现数据的显示。
3.10 WiFi模块
WiFi模块用于将温度、湿度、心率、血氧、烟雾和光照等数据上传至APP调试器进行远程监控。本系统采用ESP8266 WiFi模块,该模块具有体积小、功耗低、传输速度快等特点。ESP8266模块通过UART接口与STM32单片机连接,实现数据的无线传输。
四、软件设计
4.1 主程序设计
主程序主要负责系统的初始化、数据采集、数据处理、数据显示和数据上传等功能。程序流程图如图4-1所示。
<img src="https://example.com/main_program_flowchart.png" />
(示例图片链接,实际使用时请替换为真实图片)
4.2 数据采集程序设计
数据采集程序负责从各个传感器模块采集数据。首先初始化传感器模块,配置相关参数。然后读取传感器数据,并进行滤波处理。最后将采集到的数据存储在相应的变量中,供后续处理使用。
4.3 数据处理程序设计
数据处理程序负责对采集到的数据进行处理和分析。首先对采集到的数据进行校验,确保数据的准确性。然后根据实际需求对数据进行进一步的处理和分析,如计算平均值、判断异常值等。最后将处理后的数据存储在相应的变量中,供后续显示和上传使用。
4.4 数据显示程序设计
数据显示程序负责将采集到的数据通过OLED显示屏进行实时显示。首先初始化OLED显示屏模块,配置相关参数。然后读取需要显示的数据,并按照一定的格式进行显示。最后不断刷新显示内容,确保数据的实时性。
4.5 数据上传程序设计
数据上传程序负责将采集到的数据通过WiFi模块上传至APP调试器进行远程监控。首先初始化WiFi模块,配置相关参数并连接到WiFi网络。然后建立与APP调试器的连接,并按照一定的协议格式发送数据。最后不断发送数据,确保数据的实时性和完整性。
4.6 控制程序设计
控制程序负责根据采集到的数据自动调控病房环境。首先判断当前的环境参数和生理参数是否满足预设的条件。如果满足条件,则通过相应的控制模块执行相应的动作,如控制风扇通风、舵机开闭窗帘等。同时,系统还能够通过界面按钮手动控制风扇、蜂鸣器和舵机的动作。
五、系统测试与验证
为了验证系统的可靠性和实用性,对系统进行了详细的测试和验证。测试内容包括功能测试、性能测试和稳定性测试等。
5.1 功能测试
功能测试主要验证系统是否满足设计要求的功能需求。测试结果表明,系统能够实时监测病房内的环境参数和病人的生理参数,并通过OLED显示屏进行实时显示。同时,系统还能够通过WiFi模块将数据上传至APP调试器进行远程监控,并能够通过界面按钮控制风扇、蜂鸣器和舵机的动作。
5.2 性能测试
性能测试主要验证系统的数据采集精度、数据传输速度和系统响应时间等性能指标。测试结果表明,系统的数据采集精度较高,数据传输速度较快,系统响应时间较短,能够满足实际应用的需求。
5.3 稳定性测试
稳定性测试主要验证系统在长时间运行过程中的稳定性和可靠性。测试结果表明,系统在长时间运行过程中运行稳定,无异常情况发生,能够满足实际应用的需求。
六、结论
本文设计了一种基于STM32F103C8T6单片机的智能病房监控系统,该系统通过多个传感器模块采集数据,并通过WiFi模块将数据上传至APP调试器进行远程监控。同时,系统能够根据采集到的数据自动调控病房环境,如控制风扇通风、舵机开闭窗帘等,为病人提供一个更加舒适、安全的治疗环境。经过详细的测试和验证,证明了系统的可靠性和实用性。
随着物联网技术的不断发展,智能病房监控系统
/**
******************************************************************************
* @file misc.c
* @author MCD Application Team
* @version V3.5.0
* @date 11-March-2011
* @brief This file provides all the miscellaneous firmware functions (add-on
* to CMSIS functions).
******************************************************************************
* @attention
*
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
*
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "misc.h"
/** @addtogroup STM32F10x_StdPeriph_Driver
* @{
*/
/** @defgroup MISC
* @brief MISC driver modules
* @{
*/
/** @defgroup MISC_Private_TypesDefinitions
* @{
*/
/**
* @}
*/
/** @defgroup MISC_Private_Defines
* @{
*/
#define AIRCR_VECTKEY_MASK ((uint32_t)0x05FA0000)
/**
* @}
*/
/** @defgroup MISC_Private_Macros
* @{
*/
/**
* @}
*/
/** @defgroup MISC_Private_Variables
* @{
*/
/**
* @}
*/
/** @defgroup MISC_Private_FunctionPrototypes
* @{
*/
/**
* @}
*/
/** @defgroup MISC_Private_Functions
* @{
*/
/**
* @brief Configures the priority grouping: pre-emption priority and subpriority.
* @param NVIC_PriorityGroup: specifies the priority grouping bits length.
* This parameter can be one of the following values:
* @arg NVIC_PriorityGroup_0: 0 bits for pre-emption priority
* 4 bits for subpriority
* @arg NVIC_PriorityGroup_1: 1 bits for pre-emption priority
* 3 bits for subpriority
* @arg NVIC_PriorityGroup_2: 2 bits for pre-emption priority
* 2 bits for subpriority
* @arg NVIC_PriorityGroup_3: 3 bits for pre-emption priority
* 1 bits for subpriority
* @arg NVIC_PriorityGroup_4: 4 bits for pre-emption priority
* 0 bits for subpriority
* @retval None
*/
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)
{
/* Check the parameters */
assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup));
/* Set the PRIGROUP[10:8] bits according to NVIC_PriorityGroup value */
SCB->AIRCR = AIRCR_VECTKEY_MASK | NVIC_PriorityGroup;
}
/**
* @brief Initializes the NVIC peripheral according to the specified
* parameters in the NVIC_InitStruct.
* @param NVIC_InitStruct: pointer to a NVIC_InitTypeDef structure that contains
* the configuration information for the specified NVIC peripheral.
* @retval None
*/
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)
{
uint32_t tmppriority = 0x00, tmppre = 0x00, tmpsub = 0x0F;
/* Check the parameters */
assert_param(IS_FUNCTIONAL_STATE(NVIC_InitStruct->NVIC_IRQChannelCmd));
assert_param(IS_NVIC_PREEMPTION_PRIORITY(NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority));
assert_param(IS_NVIC_SUB_PRIORITY(NVIC_InitStruct->NVIC_IRQChannelSubPriority));
if (NVIC_InitStruct->NVIC_IRQChannelCmd != DISABLE)
{
/* Compute the Corresponding IRQ Priority --------------------------------*/
tmppriority = (0x700 - ((SCB->AIRCR) & (uint32_t)0x700))>> 0x08;
tmppre = (0x4 - tmppriority);
tmpsub = tmpsub >> tmppriority;
tmppriority = (uint32_t)NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority << tmppre;
tmppriority |= NVIC_InitStruct->NVIC_IRQChannelSubPriority & tmpsub;
tmppriority = tmppriority << 0x04;
NVIC->IP[NVIC_InitStruct->NVIC_IRQChannel] = tmppriority;
/* Enable the Selected IRQ Channels --------------------------------------*/
NVIC->ISER[NVIC_InitStruct->NVIC_IRQChannel >> 0x05] =
(uint32_t)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1F);
}
else
{
/* Disable the Selected IRQ Channels -------------------------------------*/
NVIC->ICER[NVIC_InitStruct->NVIC_IRQChannel >> 0x05] =
(uint32_t)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1F);
}
}
/**
* @brief Sets the vector table location and Offset.
* @param NVIC_VectTab: specifies if the vector table is in RAM or FLASH memory.
* This parameter can be one of the following values:
* @arg NVIC_VectTab_RAM
* @arg NVIC_VectTab_FLASH
* @param Offset: Vector Table base offset field. This value must be a multiple
* of 0x200.
* @retval None
*/
void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset)
{
/* Check the parameters */
assert_param(IS_NVIC_VECTTAB(NVIC_VectTab));
assert_param(IS_NVIC_OFFSET(Offset));
SCB->VTOR = NVIC_VectTab | (Offset & (uint32_t)0x1FFFFF80);
}
/**
* @brief Selects the condition for the system to enter low power mode.
* @param LowPowerMode: Specifies the new mode for the system to enter low power mode.
* This parameter can be one of the following values:
* @arg NVIC_LP_SEVONPEND
* @arg NVIC_LP_SLEEPDEEP
* @arg NVIC_LP_SLEEPONEXIT
* @param NewState: new state of LP condition. This parameter can be: ENABLE or DISABLE.
* @retval None
*/
void NVIC_SystemLPConfig(uint8_t LowPowerMode, FunctionalState NewState)
{
/* Check the parameters */
assert_param(IS_NVIC_LP(LowPowerMode));
assert_param(IS_FUNCTIONAL_STATE(NewState));
if (NewState != DISABLE)
{
SCB->SCR |= LowPowerMode;
}
else
{
SCB->SCR &= (uint32_t)(~(uint32_t)LowPowerMode);
}
}
/**
* @brief Configures the SysTick clock source.
* @param SysTick_CLKSource: specifies the SysTick clock source.
* This parameter can be one of the following values:
* @arg SysTick_CLKSource_HCLK_Div8: AHB clock divided by 8 selected as SysTick clock source.
* @arg SysTick_CLKSource_HCLK: AHB clock selected as SysTick clock source.
* @retval None
*/
void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)
{
/* Check the parameters */
assert_param(IS_SYSTICK_CLK_SOURCE(SysTick_CLKSource));
if (SysTick_CLKSource == SysTick_CLKSource_HCLK)
{
SysTick->CTRL |= SysTick_CLKSource_HCLK;
}
else
{
SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8;
}
}
/**
* @}
*/
/**
* @}
*/
/**
* @}
*/
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/