12、stm32通过dht11读取温湿度

devtools/2024/9/23 9:11:33/

 一、配置

 

二、代码

 dht11.c

/** dht11.c**  Created on: Aug 19, 2024*      Author: Administrator*/#include "main.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"
/**TIM3定时器实现us级延时*/
void Delay_us(uint16_t delay)
{__HAL_TIM_DISABLE(&htim3);__HAL_TIM_SET_COUNTER(&htim3,0);__HAL_TIM_ENABLE(&htim3);uint16_t curCnt=0;while(1){curCnt=__HAL_TIM_GET_COUNTER(&htim3);if(curCnt>=delay)break;}__HAL_TIM_DISABLE(&htim3);
}/** 更改DHT11引脚方向*/
// 输出output
void Dht11_DATA_OUT(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};/*Configure GPIO pin : PB12 */GPIO_InitStruct.Pin = GPIO_PIN_12;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_PULLUP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}// 输入input
void Dht11_DATA_IN(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};/*Configure GPIO pin : PB12 */GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pin = GPIO_PIN_12;GPIO_InitStruct.Pull = GPIO_PULLUP;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
/** DHT11驱动*/
//复位DHT11
void DHT11_Rst(void)
{Dht11_DATA_OUT();                                          //设置为输出HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET);     //拉低引脚HAL_Delay(20);                                             //延迟20msHAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET);       //拉高引脚Delay_us(30);                                              //延迟30us
}//等待DHT11回应
//返回值:1代表未检测到存在,0代表检测到存在
uint8_t DHT11_Check(void)
{uint8_t retry=0;Dht11_DATA_IN();                                           //设置为输入while(GPIO_PIN_SET==HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_12) && retry<100){retry++;Delay_us(1);}if(retry>=100)return 1;elseretry=0;while(GPIO_PIN_RESET==HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_12) && retry<100){retry++;Delay_us(1);}if(retry>=100)return 1;return 0;
}//从DHT11读取一个位
//返回值:1/0
uint8_t DHT11_Read_Bit(void)
{uint8_t retry=0;while(GPIO_PIN_SET==HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_12) && retry<100){retry++;Delay_us(1);}retry=0;while(GPIO_PIN_RESET==HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_12) && retry<100){retry++;Delay_us(1);}Delay_us(40);if(GPIO_PIN_SET==HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_12))return 1;elsereturn 0;
}//从DHT11读取一个字节
//返回值:读取到的字节数据(8位)
uint8_t DHT11_Read_Byte(void)
{uint8_t dat=0;for(uint8_t i=0;i<8;i++){dat <<= 1;dat |= DHT11_Read_Bit();}return dat;
}//从DHT11读取一次数据
//humi:湿度值,temp:温度值
//返回值:0代表正常,1代表读取失败
uint8_t DHT11_Read_Data(uint8_t* humi,uint8_t* temp)
{uint8_t buf[5];DHT11_Rst();if(DHT11_Check() == 0){for(uint8_t i=0;i<5;i++)buf[i]=DHT11_Read_Byte();if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4]){*humi=buf[0];       //这里省略小数部分*temp=buf[2];}}elsereturn 1;return 0;
}

dht11.h

/** dht11.h**  Created on: Aug 19, 2024*      Author: Administrator*/#ifndef INC_DHT11_H_
#define INC_DHT11_H_void Delay_us(uint16_t delay);                   //通过TIM3定时器微秒级延时
void Dht11_DATA_OUT(void);                       //设置数据交互口为输出
void Dht11_DATA_IN(void);                        //设置数据交互口为输入
void DHT11_Rst(void);                            //复位DHT11
uint8_t DHT11_Check(void);                       //DHT11状态反馈
uint8_t DHT11_Read_Bit(void);                    //读DHT11一位数据
uint8_t DHT11_Read_Byte(void);                   //读DHT11一字节数据
uint8_t DHT11_Read_Data(uint8_t* humi,uint8_t* temp);     //DHT11数据显示#endif /* INC_DHT11_H_ */

main.c

/* USER CODE BEGIN Includes */
#include <stdio.h>                      //sprintf函数头文件
#include <string.h>                     //strlen函数头文件
#include "dht11.h"
/* USER CODE END Includes *//* USER CODE BEGIN 1 */uint8_t temperature = 1;                     //温度值uint8_t humidity = 1;                        //湿度值char* CntState = "No Connect!\r\n";          //连接状态uint8_t aTxBuffer[50];                       //打印信息/* USER CODE END 1 *//* USER CODE BEGIN 2 */DHT11_Rst();                                   //复位DHT11while(DHT11_Check())                           //检测DHT11连接{HAL_UART_Transmit(&huart1, (uint8_t *)CntState, strlen(CntState), 200);CntState = "Fail!\r\n";HAL_UART_Transmit(&huart1, (uint8_t *)CntState, strlen(CntState), 200);HAL_Delay(500);}CntState = "Success!\r\n";HAL_UART_Transmit(&huart1, (uint8_t *)CntState, strlen(CntState), 200);/* USER CODE END 2 *//* USER CODE BEGIN WHILE */while (1){DHT11_Read_Data(&humidity,&temperature);                        //检测出温湿度的值sprintf(aTxBuffer,"temperature : %d ^C    ""humidity : %d %% \r\n", temperature,humidity);         //打印温湿度的值HAL_UART_Transmit(&huart1,aTxBuffer,strlen((const char*)aTxBuffer),200);HAL_Delay(500);/* USER CODE END WHILE */

 三、其他

参考教程 http://t.csdnimg.cn/pDPY5


http://www.ppmy.cn/devtools/99778.html

相关文章

Linux磁盘实用指令

目录 磁盘实用指令 磁盘实用指令 显示opt目录下的文件和目录 。 筛选出第一个符号为-的。 wc指令统计数目。 将符号-改为d就可以统计目录数目。 添加一个大写的r就可以递归的显示子目录了。 再与之前同理筛选出文件即可。 包括子文件夹的话加个大写的r即可 。 没有是因为默认情…

JVM(Java虚拟机) - 深入了解Java中的GC命令:如何优化垃圾回收

作者&#xff1a;逍遥Sean 简介&#xff1a;一个主修Java的Web网站\游戏服务器后端开发者 主页&#xff1a;https://blog.csdn.net/Ureliable 觉得博主文章不错的话&#xff0c;可以三连支持一下~ 如有疑问和建议&#xff0c;请私信或评论留言&#xff01; 前言 Java中的垃圾回…

React Hook Form:指南与示例

表单是用户与网站和Web应用程序交互的重要组成部分。验证用户通过表单提交的数据是开发者的一项关键职责。 React Hook Form是一个帮助在React中验证表单的库。它是一个没有其他依赖项的精简库&#xff0c;性能优越&#xff0c;使用简单&#xff0c;开发者可以比使用其他表单库…

坚鹏讲人才第13期:个人数字化转型——个人与时代的共赢之选

坚鹏讲人才第13期&#xff1a;个人数字化转型——个人与时代的共赢之选 在这个日新月异的时代&#xff0c;数字化转型已经成为当今时代的必然趋势&#xff0c;它不仅改变了我们的生活方式&#xff0c;也正在改变着各行各业的运营模式。数字化时代&#xff0c;不仅需要数字化企…

Java | Leetcode Java题解之第373题查找和最小的K对数字

题目&#xff1a; 题解&#xff1a; class Solution {public List<List<Integer>> kSmallestPairs(int[] nums1, int[] nums2, int k) {int m nums1.length;int n nums2.length;/*二分查找第 k 小的数对和的大小*/int left nums1[0] nums2[0];int right nums…

ProtoBuf简要介绍与快速上手使用(C++版)

文章目录 一、 初识ProtoBuf1. 序列化和反序列化概念2. ProtoBuf是什么3. ProtoBuf的使用特点 二、 讲解说明三、 快速上手1. 创建 .proto 文件2. 编译 contacts.proto 文件&#xff0c;生成C文件3. 序列化与反序列化的使用4. 小结 ProtoBuf 使用流程 一、 初识ProtoBuf 1. 序…

curl 无法访问 download.docker.com 的问题的解决方法

一. 问题 在按照 Docker Standalone | SigNoz 中的说明安装SigNoz之时出现下面的输出&#xff1a; $ ./install.sh &#x1f44b; Thank you for trying out SigNoz! &#x1f7e1; Running installer with non-sudo permissions.In case of any failure or prompt, please…

深入理解二叉树层级遍历与应用:从基础到进阶

深入理解二叉树层级遍历与应用&#xff1a;从基础到进阶 在数据结构与算法的学习中&#xff0c;二叉树的遍历是一个关键主题&#xff0c;尤其是层级遍历&#xff08;广度优先搜索&#xff0c;BFS&#xff09;。本文将深入探讨二叉树的层级遍历&#xff0c;并在此基础上进行扩展…