基于FreeRTOS实现温湿度识别

2023-05-16

实验说明:本实验主要利用freeRTOS创建多任务实现温湿度检测与点亮LED,并在串口上输出相应温湿度和LED亮灭情况;

一.实验用材

1.DHT11温湿度传感器模块

 

2.stm32f103c8t6最小系统板

 二.实验现象

 

 三.实验主要代码

main.c 

#include "FreeRTOS.h"
#include "task.h"
/* 开发板硬件bsp头文件 */
#include "bsp_led.h"
#include "usart.h"
#include "dht11.h"
#include "sys.h"
#include "delay.h"

 /* 创建任务句柄 */
static TaskHandle_t AppTaskCreate_Handle;
static TaskHandle_t LED1_Task_Handle;
static TaskHandle_t LED2_Task_Handle;


static void AppTaskCreate(void);/* 用于创建任务 */

static void LED1_Task(void* pvParameters);/* LED1_Task任务实现 */
static void LED2_Task(void* pvParameters);/* LED2_Task任务实现 */

static void BSP_Init(void);/* 用于初始化板载相关资源 */

/*****************************************************************
  * @brief  主函数
  * @param  无
  * @retval 无
  * @note   第一步:开发板硬件初始化 
            第二步:创建APP应用任务
            第三步:启动FreeRTOS,开始多任务调度
  ****************************************************************/
int main(void)
{	
  BaseType_t xReturn = pdPASS;/* 定义一个创建信息返回值,默认为pdPASS */

  /* 开发板硬件初始化 */
  BSP_Init();
	
  printf("FreeRTOS-动态创建多任务实验!\r\n");
   /* 创建AppTaskCreate任务 */
  xReturn = xTaskCreate((TaskFunction_t )AppTaskCreate,  /* 任务入口函数 */
                        (const char*    )"AppTaskCreate",/* 任务名字 */
                        (uint16_t       )512,  /* 任务栈大小 */
                        (void*          )NULL,/* 任务入口函数参数 */
                        (UBaseType_t    )1, /* 任务的优先级 */
                        (TaskHandle_t*  )&AppTaskCreate_Handle);/* 任务控制块指针 */ 
  /* 启动任务调度 */           
  if(pdPASS == xReturn)
  {
    vTaskStartScheduler();   /* 启动任务,开启调度 */
  
  }
  else
    return -1;  
  
  while(1);   /* 正常不会执行到这里 */    
}


/***********************************************************************
  * @ 函数名  : AppTaskCreate
  * @ 功能说明: 为了方便管理,所有的任务创建函数都放在这个函数里面
  * @ 参数    : 无  
  * @ 返回值  : 无
  **********************************************************************/
static void AppTaskCreate(void)
{
  BaseType_t xReturn = pdPASS;/* 定义一个创建信息返回值,默认为pdPASS */
  
  taskENTER_CRITICAL();           //进入临界区
  
  /* 创建LED_Task任务 */
  xReturn = xTaskCreate((TaskFunction_t )LED1_Task, /* 任务入口函数 */
                        (const char*    )"LED1_Task",/* 任务名字 */
                        (uint16_t       )512,   /* 任务栈大小 */
                        (void*          )NULL,	/* 任务入口函数参数 */
                        (UBaseType_t    )2,	    /* 任务的优先级 */
                        (TaskHandle_t*  )&LED1_Task_Handle);/* 任务控制块指针 */
  if(pdPASS == xReturn)
    printf("创建LED1_Task任务成功!\r\n");
  
	/* 创建LED_Task任务 */
  xReturn = xTaskCreate((TaskFunction_t )LED2_Task, /* 任务入口函数 */
                        (const char*    )"LED2_Task",/* 任务名字 */
                        (uint16_t       )512,   /* 任务栈大小 */
                        (void*          )NULL,	/* 任务入口函数参数 */
                        (UBaseType_t    )4,	    /* 任务的优先级 */
                        (TaskHandle_t*  )&LED2_Task_Handle);/* 任务控制块指针 */
  if(pdPASS == xReturn)
    printf("创建LED2_Task任务成功!\r\n");
  
  vTaskDelete(AppTaskCreate_Handle); //删除AppTaskCreate任务
  
  taskEXIT_CRITICAL();            //退出临界区
}



/**********************************************************************
  * @ 函数名  : LED_Task
  * @ 功能说明: LED_Task任务主体
  * @ 参数    :   
  * @ 返回值  : 无
  ********************************************************************/
static void LED1_Task(void* parameter)
{	
    while (1)
    {
        LED1_ON;
        vTaskDelay(500);   /* 延时500个tick */
        printf("LED1_Task Running,LED1_ON\r\n");
        
        LED1_OFF;     
        vTaskDelay(500);   /* 延时500个tick */		 		
        printf("LED1_Task Running,LED1_OFF\r\n");
    }
}


static void LED2_Task(void* parameter)
{	
	 u8 temp,humi;
    while(DHT11_Init()) 
	 {		 
		 printf("传感器设置错误\r\n");
		 LED2_TOGGLE;
		 vTaskDelay(500); 
	 }	
	
	while(1)
	{
		 LED2_TOGGLE;
	    DHT11_Read_Data(&temp,&humi);
		 printf("temp:%d  humi:%d \n",temp,humi);
		 printf("..................\n");
		 vTaskDelay(500);
		
	}
}
/***********************************************************************
  * @ 函数名  : BSP_Init
  * @ 功能说明: 板级外设初始化,所有板子上的初始化均可放在这个函数里面
  * @ 参数    :   
  * @ 返回值  : 无
  *********************************************************************/
static void BSP_Init(void)
{
	/*
	 * STM32中断优先级分组为4,即4bit都用来表示抢占优先级,范围为:0~15
	 * 优先级分组只需要分组一次即可,以后如果有其他的任务需要用到中断,
	 * 都统一用这个优先级分组,千万不要再分组,切忌。
	 */
	NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 );
	
	/* LED 初始化 */
	LED_GPIO_Config();

	uart_init(115200);
	
	delay_init();
  
}

/********************************END OF FILE****************************/

dht11.c 

#include "dht11.h"
#include "delay.h"
      
//复位DHT11
void DHT11_Rst(void)	   
{                 
	DHT11_IO_OUT(); 	//SET OUTPUT
    DHT11_DQ_OUT=0; 	//拉低DQ
    delay_ms(20);    	//拉低至少18ms
    DHT11_DQ_OUT=1; 	//DQ=1 
	delay_us(30);     	//主机拉高20~40us
}
//等待DHT11的回应
//返回1:未检测到DHT11的存在
//返回0:存在
u8 DHT11_Check(void) 	   
{   
	u8 retry=0;
	DHT11_IO_IN();//SET INPUT	 
    while (DHT11_DQ_IN&&retry<100)//DHT11会拉低40~80us
	{
		retry++;
		delay_us(1);
	};	 
	if(retry>=100)return 1;
	else retry=0;
    while (!DHT11_DQ_IN&&retry<100)//DHT11拉低后会再次拉高40~80us
	{
		retry++;
		delay_us(1);
	};
	if(retry>=100)return 1;	    
	return 0;
}
//从DHT11读取一个位
//返回值:1/0
u8 DHT11_Read_Bit(void) 			 
{
 	u8 retry=0;
	while(DHT11_DQ_IN&&retry<100)//等待变为低电平
	{
		retry++;
		delay_us(1);
	}
	retry=0;
	while(!DHT11_DQ_IN&&retry<100)//等待变高电平
	{
		retry++;
		delay_us(1);
	}
	delay_us(40);//等待40us
	if(DHT11_DQ_IN)return 1;
	else return 0;		   
}
//从DHT11读取一个字节
//返回值:读到的数据
u8 DHT11_Read_Byte(void)    
{        
    u8 i,dat;
    dat=0;
	for (i=0;i<8;i++) 
	{
   		dat<<=1; 
	    dat|=DHT11_Read_Bit();
    }						    
    return dat;
}
//从DHT11读取一次数据
//temp:温度值(范围:0~50°)
//humi:湿度值(范围:20%~90%)
//返回值:0,正常;1,读取失败
u8 DHT11_Read_Data(u8 *temp,u8 *humi)    
{        
 	u8 buf[5];
	u8 i;
	DHT11_Rst();
	if(DHT11_Check()==0)
	{
		for(i=0;i<5;i++)//读取40位数据
		{
			buf[i]=DHT11_Read_Byte();
		}
		if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
		{
			*humi=buf[0];
			*temp=buf[2];
		}
	}else return 1;
	return 0;	    
}
//初始化DHT11的IO口 DQ 同时检测DHT11的存在
//返回1:不存在
//返回0:存在    	 
u8 DHT11_Init(void)
{	 
 	GPIO_InitTypeDef  GPIO_InitStructure;
 	
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	 //使能PG端口时钟
	
 	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;				 //PG11端口配置
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
 	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 	GPIO_Init(GPIOA, &GPIO_InitStructure);				 //初始化IO口
 	GPIO_SetBits(GPIOA,GPIO_Pin_0);						 //PG11 输出高
			    
	DHT11_Rst();  //复位DHT11
	return DHT11_Check();//等待DHT11的回应
} 

dht11.h 

#ifndef __DHT11_H
#define __DHT11_H 
#include "sys.h"   
 
//IO方向设置
#define DHT11_IO_IN()  {GPIOA->CRL&=0XFFFFFFF0;GPIOA->CRL|=8<<0;}
#define DHT11_IO_OUT() {GPIOA->CRL&=0XFFFFFFF0;GPIOA->CRL|=3<<0;}
IO操作函数											   
#define	DHT11_DQ_OUT PAout(0) //数据端口	PA0 
#define	DHT11_DQ_IN  PAin(0)  //数据端口	PA0 


u8 DHT11_Init(void);//初始化DHT11
u8 DHT11_Read_Data(u8 *temp,u8 *humi);//读取温湿度
u8 DHT11_Read_Byte(void);//读出一个字节
u8 DHT11_Read_Bit(void);//读出一个位
u8 DHT11_Check(void);//检测是否存在DHT11
void DHT11_Rst(void);//复位DHT11    
#endif

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于FreeRTOS实现温湿度识别 的相关文章

  • 初识AJAX基础(一)

    1 初识AJAX 1 概要 google suggest A xff1a 通过发送请求到服务器上获取相关数据 B xff1a 发送方式 xff1a 通过URL 超链接 表单验证 C xff1a 将请求的数据发送给服务器获得相关数据 它是浏览
  • 使用nvm切换node方法,以及在nvm中的注意事项

    利用nvm随意下载nodejs版本 使用nvm去切换nodejs版本过程中出现的乱码情况分析 1 nvm安装路径错误导致nodejs下载路径有误 xff0c 无法正常打开 xff08 建议删除 xff0c 重新安装时使用默认路径安装 xff
  • nodejs中对es6语法规范讲解

    1 var的弊端及let关键字 1 var声明的变量有预解析 xff08 变量提升 xff09 xff0c 造成 逻辑混乱 xff0c 可以先使用 xff0c 后声明 2 var可以重复定义同一个变量 xff0c 逻辑错误 xff0c 第二
  • nodejs中解构语法

    1 解构语法 1 对象解构 存在意义 xff1a 简化代码 注意点 xff1a 1 在进行完全解构时 xff0c 属性值内花括号中的属性值的顺序可以随意颠倒 2 解构之后起重命名 let name itsName 61 obj 解构之后重命
  • 使用pt-query-digest分析mysql

    最近在看 高性能MySQL xff0c 作者们背靠Percona向我展示了以前从不知道的一些关于MySQL的知识以及各种分析优化工具 xff0c 比如这里要说的pt query digest 什么是pt query digest pt qu
  • node.js对es6语法学习

    1 es6模板字符串的使用 xff08 模板语法 xff09 console log 96 obj newname 是 obj name 的另外一个名字 xff0c 还有就是她今年18岁啦 96 es6 提供一个语法表示一个字符串 xff0
  • ES6中的箭头函数

    1 箭头函数 ES6 允许使用 箭头 xff08 61 gt xff09 简化函数的定义 注意点 xff1a 1 形参个数如果为1个 xff0c 可以省略小括号不写 2 如果函数体里面只有一个语句 xff0c 可以省略大括号不写 并且他会默
  • ES6this指向丢失问题+利用class类创建对象

    1 在dom操作中使用箭头函数可以规避this指向丢失问题 lt DOCTYPE html gt lt html lang 61 34 en 34 gt lt head gt lt meta charset 61 34 UTF 8 34 g
  • nodeJS继承中的子类constructor的写法+静态属性和静态方法+nodejs中的全局对象

    1 继承中的子类constructor的写法 xff1a 在ES6中使用继承时 xff0c constructor中必须调用super 方法 其本质是在调用父类的constructor方法 通过这样的方式来达到属性继承的效果 xff0c 解
  • ES6中process对象

    process对象 了解 console log process argv 返回一个数组 xff0c 前两个值是 node 命令所在位置 xff0c 被执行 JS 文件的路径 xff0c 若你执行命令时还有带有参数 xff0c 依次会填充到
  • nodeJS模块化开发

    1 模块的使用 1 1 为什么要模块化 了解 在计算机程序的开发过程中 xff0c 随着程序代码越写越多 xff0c 在一个文件里代码就会越来越长 xff0c 越来越不容易维护 为了编写可维护的代码 xff0c 我们把很多函数分组 xff0
  • nodejs中Buffer数据类型

    一 Buffer数据类型 JavaScript 语言自身只有字符串数据类型 xff0c 没有二进制数据类型 但在处理像文件流时 xff08 文件读写操作 xff09 xff0c 必须使用到二进制数据 因此在 Node js 中 xff0c
  • nodejs中fs文件系统内置模块

    一 fs文件系统模块 Node js 的 API 内置有两个模块 xff1a path 和 fs xff0c 我们使用 JavaScript 代码编写程序运行在 Node js 环境中就可以操作文件 1 1 同步读取文件信息 同步读取 xf
  • nodeJS中回调地域案例(Callback Hell)

    nodeJS中回调地域案例思考题 需求 xff1a 现在存在三个文件 1 txt 2 txt 3 txt 每个文件里面有一个字符 使用 xff1a fs readFile 异步 顺序读取 1 txt 2 txt 3 txt 里面的内容 xf
  • nodejs中对IP地址和端口的区分(基础了解)

    IP地址和端口的区分 ip地址 xff1a 标识网络上不同的设备 xff08 可连接网络的设备 xff08 电脑 手表 冰箱 智能设备等等 xff09 xff09 端口号 xff1a 标识同一台设备上的不同的网络进程 xff08 网络进程指
  • linux常用命令

    具体看自己的存放路径 重启Nginx usr local nginx sbin nginx s reload 重启PHP service php fpm restart linux查看目录下各个文件大小的命令 xff1a du h max
  • nodejs中http内置模块使用

    一 http模块 服务器获取数据原理 xff1a 前置知识点 xff1a IP地址 端口 http请求大致过程 先做粗略了解 xff0c 后面细讲 1 1 http核心模块的使用 四个步骤 xff1a 1 导入http模块 2 定义服务器程
  • nodeJS中npm简介与使用方法

    一 npm简介 npm 全称为 Node Package Manager xff0c 是一个基于 Node js 的包管理器 xff0c 也是整个 Node js 社区最流行 支持的第三方模块最多的包管理器 npm的初衷 xff1a Jav
  • nodeJS中利用第三方内置模块实现数字转大写功能

    一 案例制作 实现一个 xff0c 数字转大写的功能 如 xff1a 123 转 壹佰贰拾叁 在 nzh npm npmjs com 上查询npm文档引入第三方模块 找对应可能用上的包 xff0c 参考文档 xff0c 进行安装 xff0c
  • nodeJS编译环境下使用yarn工具的安装与使用方法

    一 yarn安装与使用 Yarn 是于 2016 年 10 月 由 Facebook Google Exponent 和 Tilde 联合推出了一个新的 JS 包管理工具 xff0c 旨在取代 npm 这种包管理工具 官网 xff1a Do

随机推荐

  • nodejs不支持ES6模块化规范的解决方案

    一 nodejs不支持ES6模块化规范的解决方案 在项目目录下新建src文件夹 xff0c src文件夹下新建m1 js模块和app js模块 xff1a m1 js模块中到处数据 xff1a export let name 61 34 n
  • yarn /nmp全局安装后,命令不生效

    yarn 全局安装后 xff0c 命令不生效 解决方法如下文章 nmp全局安装后 xff0c 命令不生效 xff08 通过链接查询解决办法 16条消息 安装Babel提示babel 不是内部或外部命令 xff0c 也不是可运行的程序 或批处
  • nodeJS中使用promise实现文件读取、写入的案例

    31 使用promise实现之前文件读取的案例 在引用util模块采用 xff1a 遵循常见的错误优先的回调风格的函数 xff08 也就是将 err value 61 gt 回调作为最后一个参数 xff09 xff0c 并返回一个返回 pr
  • nodeJS中对Promise模块介绍

    1 Promise 简介 Promise 是异步编程的一种解决方案 xff0c 比传统的解决方案 回调函数和事件 更合理和更强大 它由社区最早提出和实现 xff0c ES6 将其写进了语言标准 xff0c 统一了用法 xff0c 原生提供了
  • nodeJS中promise对象对结果简便输出办法(建议使用异步终极方案 async+await)

    一 promise对象利用all 方法实现简洁输出 const fs 61 require 34 fs 34 const path 61 require 34 path 34 const util 61 require 34 util 34
  • Http协议简介(底层原理讲解)

    一 Http协议简介 HTTP协议就是超文本传输协议 HyperText Transfer Protocol 通俗理解是浏览器和web服务器传输数据格式的协议 HTTP协议是一个应用层协议 HTTP协议是基于TCP协议的 xff0c 发送数
  • ThinkPHP代码生成器快速开发框架:ThinkPHP+VUE+APIdoc+Restful+Oauth2.0+代码生成器+系统基础功能(用户管理、菜单管理、角色管理、权限管理、字典管理、部门管理)

    Wedo快速开发框架 https github com weidong100 Wedo 根据数据表 xff0c 快速生成控制器 模型 VUE界面 接口文档 xff01 系统组成 xff1a PHP框架使用ThinkPHP5 xff0c 官网
  • Echarts3 主题设置

    前言 现在此感谢百度Echarts团队提供的这款优秀的开源产品 Echarts是一款原生js写的图表类库 xff0c Echarts能为我们打造一款数据可视化平台提供了良好的图表支持 在如今的前端开发中 xff0c 站点样式主题css 是要
  • 谷歌浏览器开发者工具的使用(掌握!)

    谷歌浏览器开发者工具的使用 xff08 掌握 xff01 xff09 元素 Elements 用于查看或修改HTML元素的属性 CSS属性 监听事件 断点等 控制台 Console 控制台一般用于执行一次性代码 查看JavaScript对象
  • nodeJS中ajax技术

    一 AJAX技术简介 AJAX 即 Asynchronous JavaScript and XML xff08 异步的 JavaScript 与 XML 技术 xff09 xff0c 指的是一套综合了多项技术的浏览器端网页开发技术 AJAX
  • 【无标题】

    一 使用ajax发送post请求 xff1a lt script gt let obtn 61 document getElementById 34 obtn 34 let odiv 61 document getElementById 3
  • jQuery 中 ajax 方法使用(测试get和post请求方式)

    一 jQuery 中 ajax 方法使用 async xff1a 默认设置下 xff0c 所有请求均为异步请求 contentType xff1a 发送信息至服务器时内容编码类型 xff0c 默认为 34 application x www
  • nodeJS中JWT身份认证使用方法与意义

    1 jwt认证机制的工作原理 xff1a 客户端登入提交账号密码 xff0c 服务器端验证通过将用户信息对象经过加密之后生成token字符串 xff0c 服务器进行第一次响应 xff0c 将生成的token字符串相应给客户端保存在local
  • 尚硅谷react课程-day01

    1 初识react 注意 1 引入库的顺序要先引入react核心库在引入react dom库 xff0c 最后引入babel库 2 script标签嵌套的JS代码的开始标签中要添加type 61 34 text babel 34 确保配置j
  • 尚硅谷react课程-day02

    目录 1 函数式组件 2 原型链 3 原型链查找机制 4 类式组件 5 利用react类定义虚拟dom方法对模块中HTML标签内容的修改 实现点击文字部分内容发生改变 5 类方法中的this指向问题 6 bind 方法 7 对于react三
  • 尚硅谷react课程-day03

    目录 1 对类组件中方法总结 xff1a 2 组件实例第二大属性prop方法 2 1 react中prop方法解构赋值 3 对porps传递的数据进行限制 4 类式组件中构造器与props关系 1 对类组件中方法总结 xff1a 1 cla
  • 配置树莓派4B+Ubuntu-22.04.2+Intel Realsense T265

    准备 xff1a 树莓派4b Ubuntu 22 04 2 T265 开始玩树莓派和T265时配置环境配置了半天 xff0c 各种报错 xff0c 在不熟悉这些的情况下想要配置一个稳定不报错的系统就只有不断的尝试 xff0c 再重装了10次
  • 节点基础~节点操作

    一 创建和添加节点 1 创建节点 document createElement 方法创建由tagName指定的 HTM元素 因为这些元素原先不存在 xff0c 是根据我们的需求动态生成的 xff0c 所以我们也称为动态创建元素节点 2 添加
  • workerman-chat启动后,前台无法访问

    去阿里云的安全组 xff0c 添加规则 xff1a 55151和7272 启动GatewayWorker的命令 xff0c 注意 xff1a 这个需要在linux服务器 xff0c 到api文件夹下运行 xff08 就是有think文件 x
  • 基于FreeRTOS实现温湿度识别

    实验说明 xff1a 本实验主要利用freeRTOS创建多任务实现温湿度检测与点亮LED xff0c 并在串口上输出相应温湿度和LED亮灭情况 xff1b 一 实验用材 1 DHT11温湿度传感器模块 2 stm32f103c8t6最小系统