目录
前言
设计一个基于物联网技术的智慧病房管理系统。假设医院住院部的一层病房(走廊两边病房平行分布),病房数量最多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数据库里。
一、功能设计
1.使用 I2C 读取 AHT20 模块
2.TIM 定时器与 PWM 呼吸灯
3.按键信息接收与消抖
4.UART 转 485 接口与 modbus 通信
5.MAX30102 模块心率与血氧测量
二、基本配置
1.选择芯片型号
2.RCC配置
3.SYS配置
4.USART1 与 DMA 配置
5.I2C配置
6.TIME3配置
7.DMA配置
8.TIM2 与 PWM 配置
9.NVIC配置
10.GPIO配置
11.时钟配置
12.引脚配置
三、RTOS 与模块驱动、代码配置
RTOS 配置
选择引入 RT-Thread 轻量便捷 :
外部按钮配置
四、RTOS、AHT20 与 按钮功能实现
1.温湿度获取代码设计
首先我们需要引入温湿度驱动头文件:
#include "AHT20.h"
然后我们需要在进程中对温湿度传感器进行初始化,这里在初始化之后,不能立即获取温湿度,需要等待 2 秒或以上,确保数据正确性:
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);
然后我们需要获取经过 CRC 验证的温湿度数据,这里直接调用驱动函数即可:
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