基于物联网技术的智慧病房管理系统(二)—— RTOS、AHT20 与 按钮功能实现

这里 RTOS 代码修改,AHT20 驱动代码移植可以参考前面博客内容:

  1. STM32 —— IIC 读取 ATH20(DTH20)温度传感器

  2. STM32 —— RT-Thread Nano 移植

这里主要介绍使用和按键相关内容

温湿度获取代码设计

首先我们需要引入温湿度驱动头文件:

#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);printf(".");rt_thread_delay(100);printf(".");printf("\r\n");}

RTOS 进程设计

首先新建 app_rt_thread.c 文件,然后引入头文件:

#include "rtthread.h"
#include "main.h"
#include "i2c.h"
#include "usart.h"
#include "gpio.h"
#include "stdio.h"
#include "AHT20.h"

然后我们需要设计进程,这里主进程先设置为串口发送,子进程设置两个,一个是获取温度参数,另一个是控制 PC13 引脚上的板载 LED ,后续会根据系统进程对进行设计:

//初始化线程函数
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);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");}
}

这里直接给出完整代码如下:

点击查看完整 app_rt_thread.c 代码
#include "rtthread.h"
#include "main.h"
#include "i2c.h"
#include "usart.h"
#include "gpio.h"
#include "stdio.h"
#include "AHT20.h"struct rt_thread led1_thread;
struct rt_thread usart1_thread;
rt_uint8_t rt_led1_thread_stack[128];
rt_uint8_t rt_usart1_thread_stack[256];
void led1_task_entry(void *parameter);
void usart1_task_entry(void *parameter);int fputc(int ch,FILE *f)
{HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,0xFFFF);    //等待发送结束    while(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_TC)!=SET){}        return ch;
}//初始化线程函数
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);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");}
}

然后我们在主函数中引入 RT-Thread 必要的头文件并引用函数:

#include "rtthread.h"extern void MX_RT_Thread_Init(void);
extern void MX_RT_Thread_Process(void);

最后我们直接在主函数中对进程进行初始化,并运行即可,这里直接给出完整主函数:

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 */MX_RT_Thread_Init(); // 初始化线程/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){MX_RT_Thread_Process();    // 执行主进程/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}

按钮的使用与消抖

首先我们设计按钮在 PA3 引脚,然后在设置 PA4 引脚上外接一个 LED ,这里先令按钮按下反转 PA4 引脚电平,即按下小灯泡点亮,再次按下,小灯泡熄灭,这里直接设计为一个新进程:

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&&(KEY1==0)){HAL_Delay(10);//去抖动key_up=0;if(KEY1==0)return KEY1_PRES;}else if(KEY1==1)key_up=1;return 0;//无按键按下
}

这样我们就完成了对 RTOS 移植,AHT20 温湿度数据获取和按键功能的实现。

基于物联网技术的智慧病房管理系统(二)—— RTOS、AHT20 与 按钮功能实现相关推荐

  1. 基于物联网技术的智慧病房管理系统

    目录 前言 一.功能设计 二.基本配置 1.选择芯片型号 2.RCC配置 3.SYS配置 4.USART1 与 DMA 配置 5.I2C配置 6.TIME3配置 7.DMA配置 8.TIM2 与 PW ...

  2. 基于物联网技术的智慧病房管理系统(一)—— 系统配置

    基于物联网技术的智慧病房管理系统(一)-- 系统分析与配置 系统要求 设计一个基于物联网技术的智慧病房管理系统.假设医院住院部的一层病房(走廊两边病房平行分布),病房数量最多60间,每间病房3个床位, ...

  3. 基于物联网技术的智慧病房管理系统(三)——定时开关灯与信息获取

    基于物联网技术的智慧病房管理系统(三)-- 定时开关灯与信息获取 这里我们主要实现能够定时开关灯,并且能够获取如下信息: 病人按下紧急呼叫信号 定时获取病人脉搏血氧数据 定时开关灯 这里要求我们能够实 ...

  4. 基于嵌入式物联网技术的智慧病房方案设计

    文章目录 前言 一.系统设计要求 二.系统硬件设计 单片机控制电路 AHT20模块 心率脉搏采集模块 MOBUS通信模块 三.系统功能分析与STM32F103基本配置 基本配置如下 四 主要代码设计 ...

  5. 基于物联网技术的智慧教室重点设备监控系统设计与实现

    完整文件下载,关注:码视野,回复关键字:2001 一.引言 1.1 研究背景和意义 随着新技术的广泛应用,物联网作为新一代信息技术,在各个领域中的应用也越来越广泛.在教育领域中,物联网已经成为教育发展 ...

  6. 基于springboot+Vue的智慧酒店管理系统

    真正的大师,永远都怀着一颗学徒的心! 一.项目简介 基于springboot+Vue的智慧酒店管理系统 二.实现功能 支持多端 支持用户管理 支持酒店前台管理 支持酒店管理 支持订单管理 支持系统管理 ...

  7. rfid档案管理-基于RFID技术的智能档案管理系统—铨顺宏fuwit

    基于RFID技术的智能档案管理系统 1.行业概述 随着企事业单位的发展,各种信息档案资料数量逐日增多,档案的种类日趋多样化,纸质信息存储出现迅速膨胀:而传统的档案管理方式与技术手段所导致的问题也是日益 ...

  8. 基于RFID技术的智能仓储管理系统解决方案—铨顺宏

    一.行业背景 简单.静态的传统仓储管理模式普遍存的物资库存量巨大.物资跟踪困难.资金和物资周转效率较低.人力成本偏高.物流管理的信息和手段落后等缺点,已不能适应新的仓储管理需求.破除传统的仓储管理模式 ...

  9. ChatGPT直出1.5w字论文查重率才30% - 基于物联网技术的智能家居控制系统设计与实现

    文章目录 ChatGPT直出1.5w字论文查重率才30% - 基于物联网技术的智能家居控制系统设计与实现 一.绪论 1.1 研究背景与意义 1.2 国内外研究现状分析 1.3 研究内容与目标 1.4 ...

最新文章

  1. 聊聊数据库中的那些锁
  2. jboss1.7_快速指南:剖析JBoss BPM跨进程通信
  3. 华为鸿蒙系统明年公测,华为终于发布新系统,即将与安卓系统告别,这批机型可以申请公测...
  4. 销售自己使用过的小汽车纳多少增值税
  5. 学习Java,容易被你忽略的小细节(2)
  6. drools。drools_Drools Planner重命名为OptaPlanner:宣布www.optaplanner.org
  7. vb外部调用autocad_AutoCAD教程之图块的各种相关操作和概念
  8. SQL Server 2005远程连接连不上的解决办法收藏 Microsoft给的方法
  9. 前出塞数据挖掘的一些必须了解的概念
  10. adafruit1306_Adafruit的2015年最佳开源可穿戴设备
  11. 餐饮店楼梯空间的设计方案
  12. android 标题栏 fragment,切换Fragment 并更换标题栏
  13. 1.4 PuTTY和Xshell远程连接与密钥认证登录
  14. 对于Y=Hx的H细节的一些讨论
  15. 从调试数据分析USB通信协议——UVC摄像头【UVC类设备】(五)
  16. 手把手教你微信小程序开发
  17. wordpress插件_顶级WordPress反垃圾邮件插件
  18. Selenium自动化测试工具的介绍与使用
  19. LINUX内核编译选项-5
  20. IDEA中Git的配置及其使用(图文结合,步骤详解)

热门文章

  1. 图像视频编辑工具箱MMEditing使用示例:图像生成(generation)
  2. 【XMind】如何用XMind8绘制流程图?
  3. 安卓系统的电视机_小伙买的键盘主机大家都说鸡肋,把它改成安卓电视盒真香...
  4. 【C++】日期计算器
  5. 烂怂if-else代码优化方案 | 京东云技术团队
  6. 中纪委“点名”《哪吒》:这个人最该被问责
  7. 京瓷m1025维修模式进不去_复印机怎么进入维修模式?夏普、施乐、理光、京瓷、东芝维修大全...
  8. 大数据5v指的是什么?——以沃尔玛为例
  9. neutron之DVR(distributed virtual router)学习笔记
  10. Facebook广告投放的那些事之手把手教你从0单到1500单