STM32读取DHT11温湿度传感器数据的完整指南
创作时间:
作者:
@小白创作中心
STM32读取DHT11温湿度传感器数据的完整指南
引用
CSDN
1.
https://blog.csdn.net/weixin_42854045/article/details/141497679
本文将详细介绍如何使用STM32微控制器读取DHT11温湿度传感器的数据。内容包括硬件配置、驱动代码以及主程序的实现,适合从事嵌入式系统开发的技术人员参考。
一、硬件配置
在开始编程之前,需要正确配置STM32的GPIO引脚和定时器。以下是具体的配置步骤:
二、软件实现
1. 延时函数
使用TIM3定时器实现微秒级延时:
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);
}
2. DHT11引脚控制
定义输出和输入模式:
void Dht11_DATA_OUT(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
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);
}
void Dht11_DATA_IN(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pin = GPIO_PIN_12;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
3. DHT11驱动函数
实现复位、状态检查、数据读取等功能:
void DHT11_Rst(void)
{
Dht11_DATA_OUT();
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET);
HAL_Delay(20);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET);
Delay_us(30);
}
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;
else
retry=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;
}
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;
else
return 0;
}
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;
}
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];
}
}
else
return 1;
return 0;
}
4. 主程序
在main.c中实现数据读取和显示:
#include <stdio.h>
#include <string.h>
#include "dht11.h"
uint8_t temperature = 1;
uint8_t humidity = 1;
char* CntState = "No Connect!\r\n";
uint8_t aTxBuffer[50];
int main()
{
DHT11_Rst();
while(DHT11_Check())
{
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);
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);
}
}
三、其他
更多详细信息可以参考教程:DHT11温湿度传感器与STM32的连接与使用
热门推荐
唐宋时期的茶马互市:那些年我们一起走过的茶马古道
昌都茶马古道:冬日探险游必打卡!
1至100年是什么婚?结婚几年分别叫什么婚
皱眉、薅头发、托腮会变丑?班味儿太重怎么破?试试这几点→
《僵尸先生》热潮下的游戏设计灵感
连花清瘟胶囊:秋冬防疫必备
连花清瘟获国家推荐:甲流克星?
连花清瘟胶囊:从“网红”到“常青树”的抗疫之路
出生时辰真的能决定你的性格吗?
无人机战场新纪元:从侦察预警到精确打击
闽南四果汤:传统消暑甜品的制作与文化
四果汤制作教程:17步详解传统台湾甜品
白菊茶的功效与副作用:从清热解毒到明目养肝
蒲公英怎么晒干做成茶:一场自然与健康的邂逅
最新研究:每天这个时间段喝咖啡,心脏更健康!
权威指南:每天摄入多少咖啡因是安全的?
常见食品添加剂有哪些?哪些是对孩子有害的?哪些是无害的?
创可贴使用全攻略:从选购到使用,这些细节你都知道吗?
临川牛杂:从地方小吃到“中国名小吃”的文化传承
临川菜梗:宋神宗御批“天下一绝”的百年传承
云南白药创可贴:你真的会用吗?
如何使用PE修改密码(通过PE系统快速重置密码)
电脑被锁定如何解锁?
空气加湿器有用吗?如何选购适合的空气加湿器?
国家家电三包规定细则详解
临海紫阳街景点简介:古桥、古井、古宅,带您走进活的历史画卷
为什么食品防腐剂苯甲酸钠被很多国家禁止了?我国很多食品还在用
维生素C钠过量对人体的影响及应对措施
仙人球繁殖方法?如何播种?促使仙人球开花的方法?
金冠仙人球花期全解析:从生长到开花的全方位养护指南