智慧病房管理系统
一、緒論
1.項目背景
為解決因國家政策開放后,部分中老年人因抵抗力下降且疫情迅速傳播導致的醫院人數爆滿的問題,現基于stm32開發板以及物聯網嵌入式開發等相關技術,研發一款智慧病房項目,可以實時監控病人的生命體征和身體情況,以及病人緊急呼叫和方便管理的定時開關等系統,從而達到減輕醫務人員壓力的目的。
2.項目需求
設計一個基于物聯網技術的智慧病房管理系統。假設醫院住院部的一層病房(走廊兩邊病房平行分布),病房數量最多60間,每間病房3個床位,編號從1~180號。每間病房可采用的設備如下:STM32F103開發板1塊,房間溫濕度采集模塊1套(I2C接口,AHT20模塊),房間自動燈光開關控制器(以PWM方式控制,每天早上7點漸亮,晚上22點漸滅),病人脈搏&血氧檢測儀3套(UART接口輸出脈搏+血氧的數字值),床頭緊急呼叫按鍵開關3個(按下呼叫)。每間病房的STM32F103開發板通過UART轉485接口,以mobus組網方式,連接到護士監控室的PC電腦上(上位機)。PC電腦上可接收每間病房的溫濕度數據(周期為5分鐘)、床頭緊急呼叫信號、病人脈搏血氧數據(正常狀態下30分鐘一次采集;當脈搏超過120或血氧值低于90時切換到危重狀態下,實時采集),顯示在屏幕上并且保存到MySQL數據庫里。
注意:考慮到硬件設備不齊全,聯網資源不具備,只須撰寫較為完整,合理的系統設計方案,不須編程實現整個系統。各模塊接口協議,通信參數(如任務周期數、串口波特率、modbus數據格式均可以自定義,合理即可),主要模塊實現代碼可以利用之前課程作業的完成代碼進行闡述。
3.設計要求:
1、寫出系統設計方案,畫出系統功能圖
2、畫出病房stm32f103控制模塊的電路原理圖。
3、設計各功能模塊的模擬實現軟件,給出主要源代碼
4、總結本系統方案的技術優勢和代碼特點
二、設計方案及系統功能圖
1.每間病房的STM32F103開發板通過UART轉485接口,以mobus組網方式,連接到護士監控室的PC電腦上:這需要得功能是UART轉485接口并與modbus進行通信。
2.PC 電腦上可接收每間病房的溫濕度數據(周期為 5 分鐘):這需要使用I2C完成AHT20模塊也就是溫濕度讀取模塊。
3.床頭緊急呼叫信號:這需要完成的功能是按鍵消息得接收。
4.病人脈搏血氧數據:這需要完成的是血氧和心率采集模塊。
三、實驗過程
1.CubeMX基本配置
RCC配置
SYS配置
USART1 與 DMA 配置
I2C配置
TIM3配置
TM2與 PWM配置
NVIC配置
GPIO配置
時鐘配置
RTOS 配置
引入 RT-Thread
外部按鈕配置
2.源代碼
溫濕度檢測模塊:
在這里需要引入溫度驅動頭文件:
#include “AHT20.h”
其次我們進行溫度模塊的初始化
MX_GPIO_Init();
MX_I2C1_Init();
MX_USART1_UART_Init();
uint32_t CT_data[2]={0,0}; // 用于獲取溫濕度數據
volatile int c1,t1;
rt_thread_delay(50);
AHT20_Init();
rt_thread_delay(2500);
調用驅動函數
while(1)
{
AHT20_Read_CTdata_crc(CT_data); //經過CRC校驗,讀取AHT20的溫度和濕度數據 推薦每隔大于1S讀一次
c1 = CT_data[0]*1000/1024/1024; //計算得到濕度值c1(放大了10倍)
t1 = CT_data[1]*2000/1024/1024-500;//計算得到溫度值t1(放大了10倍)
printf(“正在檢測”);
rt_thread_delay(100);
printf(“.”);
rt_thread_delay(100);
printf(“.”);
rt_thread_delay(100);
printf(“.”);
rt_thread_delay(100);
printf(“.”);
rt_thread_delay(100);
printf(“.”);
rt_thread_delay(100);
printf(“.”);
rt_thread_delay(100);
printf(“.”);
rt_thread_delay(100);
printf(“.”);
rt_thread_delay(100);
printf(“.”);
rt_thread_delay(100);
printf(“.”);
printf(“\r\n”);
printf(“溫度:%d%d.%d”,t1/100,(t1/10)%10,t1%10); // 這里需要對溫度進行計算后才能得到我們需要的溫度值
printf(“濕度:%d%d.%d”,c1/100,(c1/10)%10,c1%10); // 這里同樣需要對適度進行計算
printf(“\r\n”);
printf(“等待”);
rt_thread_delay(100);
printf(“.”);
rt_thread_delay(100);
printf(“.”);
rt_thread_delay(100);
printf(“.”);
rt_thread_delay(100);
printf(“.”);
rt_thread_delay(100);
printf(“.”);
rt_thread_delay(100);
printf(“.”);
rt_thread_delay(100);
printf(“.”);
rt_thread_delay(100);
printf(“.”);
rt_thread_delay(100);
printf(“.”);
rt_thread_delay(100);
printf(“.”);
printf(“\r\n”);
}
RTOS 進程設計
引入頭文件
#include “rtthread.h”
#include “main.h”
#include “i2c.h”
#include “usart.h”
#include “gpio.h”
#include “stdio.h”
#include “AHT20.h”
設計進程
//初始化線程函數
void MX_RT_Thread_Init(void)
{
//初始化LED1線程
rt_thread_init(&led1_thread,“led1”,led1_task_entry,RT_NULL,&rt_led1_thread_stack[0],sizeof(rt_led1_thread_stack),3,20);
//開啟線程調度
rt_thread_startup(&led1_thread);
//初始化USART1線程
rt_thread_init(&usart1_thread,“usart1”,usart1_task_entry,RT_NULL,&rt_usart1_thread_stack[0],sizeof(rt_usart1_thread_stack),3,20);
//開啟線程調度
rt_thread_startup(&usart1_thread);
}
//主任務
void MX_RT_Thread_Process(void)
{
printf(“Hello RT_Thread!!!\r\n”);
rt_thread_delay(2000);
}
//LED1任務
void led1_task_entry(void *parameter)
{
while(1)
{
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13, GPIO_PIN_RESET);
rt_thread_delay(500);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13, GPIO_PIN_SET);
rt_thread_delay(500);
}
}
//讀取溫度任務
void usart1_task_entry(void *parameter)
{
MX_GPIO_Init();
MX_I2C1_Init();
MX_USART1_UART_Init();
uint32_t CT_data[2]={0,0}; //
volatile int c1,t1;
rt_thread_delay(50);
AHT20_Init();
rt_thread_delay(2500);
}
主函數
int main(void)
{
/* USER CODE BEGIN 1 /
/ USER CODE END 1 /
/ MCU Configuration--------------------------------------------------------/
/ Reset of all peripherals, Initializes the Flash interface and the Systick. /
HAL_Init();
/ USER CODE BEGIN Init /
/ USER CODE END Init /
/ Configure the system clock /
SystemClock_Config();
/ USER CODE BEGIN SysInit /
/ USER CODE END SysInit /
/ Initialize all configured peripherals /
MX_GPIO_Init();
MX_DMA_Init();
MX_I2C1_Init();
MX_TIM3_Init();
MX_USART1_UART_Init();
MX_TIM2_Init();
/ USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop /
/ USER CODE BEGIN WHILE */
while (1)
{
}
/* USER CODE END 3 */
}
按鈕操作:
struct rt_thread btnclick_thread;
rt_uint8_t rt_btnclick_thread_stack[128];
void btnclick_task_entry(void *parameter);
void btnclick_task_entry(void *parameter){
while(1){
switch(KEY_Scan(0))
{
case KEY1_PRES:
HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_4);
break;
default:
break;
}
}
}
初始化線程:
rt_thread_init(&btnclick_thread,“btnclick”,btnclick_task_entry,RT_NULL,&rt_btnclick_thread_stack[0],sizeof(rt_btnclick_thread_stack),3,20);
//開啟線程調度
rt_thread_startup(&btnclick_thread);
按鍵消抖:
#define KEY1 HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_3) //讀取按鍵1
#define KEY1_PRES 1 //KEY1按下
uint8_t KEY_Scan(uint8_t mode)
{
static uint8_t key_up=1;//按鍵松開標志位
if(key_up&&(KEY10))
{
HAL_Delay(10);//去抖動
key_up=0;
if(KEY10)return KEY1_PRES;
}
else if(KEY1==1)key_up=1;
return 0;//無按鍵按下
}
定時開關燈模塊:
首先設置占空比
unit16_t pwm=0;
然后打開pwm通道:
HAL_TIM__PwM__start(&htim3,TIM_CHANNEL_1);
然后通過內部時鐘讀取來控制led燈的亮滅
HAL_RTC_GetDate(&hrtc,&GetData,RTC_FORMAT_BIN);
(GetTime. Hours7 && pwm < 500 )
pwm++;
__HAL_TIM_Setcompare(&htim3,TIM_CHANNEL_1,pwm);
HAL_Delay(1);
}
while (GetTime. Hours22 &&pwm )
{
pwm–;
__HAL_TIM_setcompare(&htim3,TIM_CHANNEL_1,pwm);
HAL_Delay(1);
}
緊急呼叫模塊:
通過設置一個按鈕和一個led燈,當按鈕按下時反轉led燈的電平,由按鈕來控制led燈的亮滅,從而達到緊急呼叫的作用。
struct rt_thread btnclick_thread;
rt_uint8_t rt_btnclick_thread_stack[128];
void btnclick_task_entry(void *parameter);
void btnclick_task_entry(void *parameter){
while(1){
switch(KEY_Scan(0))
{
case KEY1_PRES:
HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_4);
break;
default:
break;
}
}
}
五、總結
本系統的硬件部分由AHT20溫濕度采集設備和脈搏血樣檢測儀組成,實現了對房間燈光的定時控制,對病房的溫濕度采集和緊急呼叫模塊的功能。,本系統是基于stm32的智慧病房系統,STM32的優勢在于:高性能;低成本;低功耗;拓展性強。由于stm32開發板的拓展性強,因此還可以添加其他功能,如實時監測病人體溫等。
本次實驗運用了本學期嵌入式課程所學到的很多重要內容,例如RTC的使用,串口通信等,但由于本項目是設計方案,并不能切實完成系統設計,因此在功能設計以及代碼部分仍然有許多可改進的地方。雖然未做出一個完整的系統,但本次項目也鍛煉了我的綜合實踐能力,使我本學期所學得到了充分運用。
總結
- 上一篇: 中兴2018届应届生在线编程测验0829
- 下一篇: linux设置开机自动运行脚本的方法