【单片机】温湿度传感器 DHT11

STM32F4_DHT11数字温湿度传感器 开机的时候先检测是否有DHT11存在,如果没有,则提示错误。DHT11和DS18B20相同,传感器输出的都是未编码的二进制数字。本节我们将利用STM32F4来读取DHT11的温湿度传感器,获取环境的温度和湿度值。因此:温湿度的读取方式就是整数部分的二进制转换成十进制放在整数部分;小数部分的二进制转换成十进制放在小数部分。DHT11和MCU的一次通讯时间最大3ms,主机连续向DHT11采样的间隔建议不小于100ms。DHT11是广州奥松有限公司生产的一款温湿度一体化的数字传感器。数据分小数部分和整数部分。 阅读详情

前言

大家好,我是林白柏;

希望你看完之后,能有所收获,不足请指正!

PS:本文提到的模块都使用正点原子的stm32开发板战舰驱动,模块用的某宝现成的模块。

PS:代码为正点原子的代码,整理成自己习惯的接口


模块介绍(可跳过)

模块长这个亚子

image-20220423093916157

DHT11里面封装了一个8位MCU,单片机连接了一个电阻式感湿元件和一个NTC测温元件;

数据的采集处理都由这个8位MCU完成,使用时我们只需要从这个MCU读出数据即可;

image-20220423095019199

传感器的外围电路也比较简单,只需要对数据线DATA上拉。

image-20220423094954678

模块使用

DHT11的参数说明

  • 湿度:20-90%RH;±5%RH
  • 温度:0-50℃;±2℃
  • 采样间隔:1s

数据包格式

DHT11采用单线通信,数据包长度40bit(5bytes),数据包格式如下:

image-20220423095744473

校验和是前面4个字节的累加和,取低八位。

DHT11传输时序

发起通信

主机发送开始信号(拉低DATA线时间大于18ms),DHT11在开始信号结束后发送响应信号(拉低DATA线80us),然后延时40-50us后开始传输数据。
所以主机发送开始信号后,将io设置为输入,延时20-40us后检测DATA线电平状态,即可知道DHT11是否有响应。
image-20220423102106943
对应代码如下
定义了几个宏,方便配置IO输入/输出、读/写

#define DHT11_IO_IN()  {GPIOG->CRH&=0XFFFF0FFF;GPIOG->CRH|=8<<12;} //IO配置为输入
#define DHT11_IO_OUT() {GPIOG->CRH&=0XFFFF0FFF;GPIOG->CRH|=3<<12;} //IO配置为输出
#define	DHT11_DQ_OUT PGout(11) //写IO DHT11_DQ_OUT = 1;/DHT11_DQ_OUT = 0;
#define	DHT11_DQ_IN  PGin(11)  //读IO

发送开始信号并延时等待

static 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是否有响应信号

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-50us,结束后开始传输数据
	{
		retry++;
		delay_us(1);
	};
	if(retry>=100) { return 1;}//超时,DHT11发送响应信号后,未把DATA线拉高
	return 0;
}

DHT11发送“0”和“1”的时序

发送“0”和“1”的区别只是高电平持续时间不一样。

“0”的时序
image-20220423112717952
“1”的时序
image-20220423112738439
对应代码如下

从DHT11读取1个bit,此处不判断每个bit开始阶段的低电平时间,只判断由低电平变到高电平后,高电平时间持续是否超过40us(“0”传输时间接近40us,如果设置再长一点可能导致通讯失败);

static 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;		   
}

知道1个bit怎么读取之后,就可以读取1个byte

static u8 DHT11_Read_Byte(void)    
{        
    u8 i,dat;
    dat=0;
	for (i=0;i<8;i++) 
	{
   		dat<<=1; 
	    dat|=DHT11_Read_Bit();
    }						    
    return dat;
}

知道1个byte读取过程,也就可以读取一帧完整的数据了(数据结构体部分看下文解释)

u8 dht11_read_data( dht11_data_t * data )  //data为用户传进来的结构体指针,用于返回读取的数据
{        
 	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]) {	//数据校验
		    memcpy( data, buf, sizeof( dht11_data_t ) );//校验通过,将数据传回给用户
            #if 0
                data->humi_int      = buf[0];
                data->humi_decimals = buf[1];
                data->temp_int      = buf[2];
                data->temp_decimals = buf[3];
            #endif
		}
	} 
    else { 
        return 1;
    }
    
	return 0; 
}

这个地方用结构体表示一帧数据(不包含校验和,因为用户不需要关心校验和,能传给用户的数据肯定是校验过的),因为使用了memcpy函数拷贝(该函数需要包含头文件string.h),dht11_data_t的数据存储格式需要跟buf匹配;也可以直接对结构体成员变量赋值,这样就不用关心结构体的存储格式。

typedef struct {
    uint8_t humi_int;
    uint8_t humi_decimals;
    uint8_t temp_int;
    uint8_t temp_decimals;
}dht11_data_t;

dht11_read_data中读取数据时,数据存到buf的格式如下

image-20220423105255091

因为dht11_data_t成员变量都是uint8_t [1byte],所以为单字节对齐,跟buf是匹配的,可以直接用memcpy函数拷贝,存储格式如下

image-20220423105629307

代码:h文件

头文件声明了两个函数:初始化函数,读取函数;DHT11采样间隔为1s,所以读取间隔需要大于1s,否则会读取失败;

uint8_t dht11_init(void);// 0:suc; 1:fail
uint8_t dht11_read_data( dht11_data_t * data );// 0:suc; 1:fail; 实测读取间隔需要大于1200ms

代码使用方法

读取前,需要先定义一个保存数据的结构体,然后把结构体的地址传进给dht11_read_data函数。

int main(void){
    dht11_data_t data;
    
    dht11_init();
    
    while(1) {
        
        if( !dht11_read_data( &data ) ) {
            _LOG_DEBUG( "[dht] humi %d.%d%%, temp %d.%dC\n\n", data.humi_int, data.humi_decimals
                                                             , data.temp_int, data.temp_decimals );
        }
        else {
            _LOG_INFO("[err] dht read\n");
        }
        delay_ms(2000);
    }
}

代码获取

共用代码:https://gitee.com/sumoting1629/mcu-practice/tree/master/common

驱动代码:https://gitee.com/sumoting1629/mcu-practice/tree/master/component

51单片机DHT11温湿度传感器 DHT11是一款有已校准数字信号输出的温湿度传感器。 精度湿度+-5%RH, 温度+-2℃,量程湿度20-90%RH, 温度0~50℃。一.电路连接分析1.引脚图2.接线图DHT11 器件采用简化的单总线通信。单总线即只有一根数据线,系统中的数据交换、控制均由单总线完成。单总线通常要求外接一个约 5.1kΩ 的上拉电阻,这样,当总线闲置时,其状态为高电平。由于它们是主从结极,只有主机呼叫从机时,从机 阅读详情

相关推荐

【STM32】DHT11温湿度传感器模块

​DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性和卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。

m0_62397193的博客 4173

51单片机(DHT11温湿度传感器)

51单片机(DHT11温湿度传感器)

m0_70987863的博客 8388

51单片机基础之DHT11温湿度传感器

接线: 代码: main.c文件 /* 使用DHT11模块,检测温湿度,在lcd1602上面显示,因为1602显示不是每次都能出来,所以加了串口打印,会更加直观。 */ #include <reg51.h> #include "lcd.h" #include <intrins.h> #include <stdio.h> sbit Temp_data=P3^6; //信号引脚 unsigned int rec_dat[4]; unsigned char rec_d

编程不良人 4680

蓝桥杯嵌入式——扩展板DHT11

蓝桥杯嵌入式的DHT11学习记录

star的博客 1438

基于DHT11温湿度传感器与51单片机的项目实践指南

DHT11是一款具有高可靠性和长寿命的数字温湿度传感器。它能提供简单而有效的测量方式,用于监测和控制室内外环境的温湿度。通过内置的数字信号输出,DHT11可以方便地与各种微控制器相连,例如51单片机。51单片机拥有若干个通用输入/输出(I/O)口。在与DHT11传感器连接时,可以选择一个未被其他外设占用的I/O口作为数据线。以STC89C52RC为例,该单片机拥有4个8位的I/O口(P0, P1, P2, P3),每个端口可以作为输入或输出。当作为输出使用时,可以驱动发光二极管(LED)或驱动继电器。

weixin_34438187的博客 972

DHT11温湿度传感器单片机仿真项目完整指南

htmltable {th, td {th {pre {简介:本项目涉及嵌入式系统开发,重点关注DHT11数字温湿度传感器与单片机的集成。DHT11传感器具备单总线通信、低功耗与高精度的特点,可应用于环境监控和智能家居。项目将指导如何使用C/C++语言编写程序,实现与DHT11的数据通信、解析、校验及存储处理。仿真过程可利用Proteus或Keil uVision等软件进行,最终通过LCD显示或网络接口将数据上传至云端服务器。

weixin_42097508的博客 669

单片机——DHT11 温湿度传感器

DHT11温湿度传感器在51单片机中的应用 一、DHT11 模块参数如下: 1 可以检测周围环境的湿度和温度 2 传感器采用 DHT11 3 湿度测量范围: 20%-95%( 0 度-50 度范围)湿度测量误差: ±5% 4 温度测量范围: 0 度-50 度 温度测量误差: ±2 度 4 工作电压 3.3V-5V 5 输出形式 数字输出 6 设有固定螺栓孔,方便安装 7 小板 PCB 尺寸: 3.2cm * 1.4cm 8 电源指示灯(红色) 二、 DHT11 模块接线说明 1 VCC 外接 3.3V-5

qq_41873236的博客 6万+

UDS诊断ISO14229新手入门篇

这个命令的格式稍微复杂一点。sub-function = 0x06 用于读取某个 DTC 及其相关的环境数据,此时 parameter 为 4 个 byte,前三个 byte 用于标识我们要读取的 DTC,第四个 byte 用于标识要读取的环境数据的范围,UDS 规定使用 FF 来表示读取所有的环境数据,各厂家可以要根据自己的需求定义其他的值来代表要读取的环境数据的范围。环境数据包括 DTC 状态,优先级,发生次数,老化计数器,时间戳,里程等,厂家还可以根据自己的需求定义一些此 DTC 产生时的测量数据。

weixin_45387165的博客 1974

51单片机 DHT11温湿度传感器LCD显示+串口打印显示

第一部分:DHT11详解: DHT11是一款有已校准数字信号输出的温湿度传感器。 精度湿度±5%RH, 温度±2℃,量程湿度20-90%RH, 温度0~50℃。 **一.电路连接分析 1.引脚图** ** 这里特别注意,该实验选择P3^6引脚位DATA数据引脚,其他引脚可以修改 ** 2.实物图 二、数据分析 1.数据采集及时序分析 DHT11采用单总线通信,单总线即只有一根数据线,系统中的数...

明哥的博客 2万+

《AI大模型评测与智能测试》

第三篇“实践蓝图”(第6-7章)着眼于测试领域AI应用,重点介绍了RAG、AI Agent开发及构建端到端智能测试系统的方法。本书聚焦AI时代的“质量”核心,以“AI赋能测试”(AI For Testing)与“AI模型评测”(Testing For AI)为双轮驱动。内容不仅深入剖析如何科学度量AI大模型的内在质量,还系统讲解如何利用AI赋能传统软件测试,帮助读者贯通从模型原理、评测到应用开发的全链路知识。

酌沧 1139

Jetson设备EXT4文件系统修复实战:从superblock损坏到系统恢复

本文详细介绍了Jetson设备因异常断电等原因导致EXT4文件系统superblock损坏后的诊断与修复实战。通过从健康设备移植fsck工具、使用备份超级块等步骤,指导用户逐步恢复系统,并提供了数据备份与预防措施,帮助用户有效应对嵌入式AI开发中的存储故障。

theta的博客 592

51单片机 DHT11温湿度传感器 MQ2传感器

基于51单片机开发板的DHT11温湿度传感器和MQ2烟雾报警器,DHT11温湿度传感器和MQ2烟雾报警器的数据传入单片机后进行数据处理,通过串口发送到手机端和LCD1602显示屏显示,可以通过手机端进行阈值控制。MQ-2传感器所使用的气敏材料是在清洁空气中电导率较低的二氧化锡(SnO2)。当传感器所处环境中存在可燃气体时,传感器的电导率随空气中可燃气体浓度的增加而增大。使用简单的电路即可将电导率的变化转换为与该气体浓度相对应的输出信号。

m0_64355812的博客 1万+

手把手教你:在openEuler 22.03上离线搞定OpenSSH 9.8升级(CentOS 7.9通用)

本文详细介绍了在openEuler 22.03和CentOS 7.9系统上离线升级OpenSSH 9.8的完整流程,包括准备工作、离线包获取、安装步骤、服务管理及回滚方案。特别针对无外网环境的企业服务器,提供安全可靠的离线升级解决方案,帮助运维人员有效提升系统安全性。

weixin_30682415的博客 192

51单片机控制DHT11温湿度传感器,并使用OLED屏幕显示

51单片机控制DHT11温湿度传感器,并使用OLED屏幕显示

m0_53413766的博客 1万+

Vue3 - 详解实现网站接入钉钉扫码登录功能,钉钉授权生成登录二维码用户用手机扫描二维码登陆,支持弹框式、浏览器单独新开页显示,钉钉扫描二维码登录详细流程及示例代码,最新vue集成钉钉扫码授权登录!

vue3,nuxt3,钉钉,扫码登录,vue3钉钉扫码登陆,钉钉授权第三方WEB网站扫码登录功能,钉钉扫码登录第三方网站,单点登录,二维码不显示,报错,扫了没反应,出错,vue3钉钉扫码登录,内嵌,获取个人信息,pc网页钉钉登录,钉钉扫码登录怎么新开一页,跳页显示二维码,内嵌登录二维码,iframe新页面弹出,弹出一个小窗口显示登录二维码,登录报错,扫码没反应,解决手机点登录报错没反应,官方文档,手机扫描钉钉二维码登录网站,页面弹出一个小窗口而不是打开一个页面,vue3中使用iframe实现另开小窗口扫码登

🏆 前端领域优质创作者 3694

从SOMEIP看SOA,汽车电子电器架构的转变

从SOMEIP看SOA,汽车电子电器架构的转变

天赐好车的博客 241

STM32 单片机 读取 DHT11 温湿度传感器

DHT11是种单总线数字温湿度传感器,可通过单片机的一个IO改变输入输出方向来读取数字温湿度。相对湿度测量范围20-90%RH,相对湿度测量精度为正负%5RH,温度测量范围0-50℃,温度测量精度为正负2℃,相对来说测量精度较低。 市场上常见的DHT11模块是在DHT11芯片基础上加了4.7K上拉电阻,如下图所示,这样只需三条线就可以和STM32进行通信,DATA脚用于读取温湿度。 STM32读取DHT11温湿度传感器时首先将DATA脚设为输出并发送开始信号,开始信号为DATA脚输出18ms以上的低

远望创客学堂 1万+

【PyTorch项目实战】图像分类与识别:手写数字识别(MNIST)、普适物体识别(CIFAR-10)

主要介绍了两个经典的实战项目:(1)基于 MNIST 数据集的手写数字识别(2)基于 CIFAR-10 数据集进行图像分类

📷 图像处理践行者 | 传统算法 · 深度学习 · 多模态 | 分享实战经验与技术洞见,探索从像素到智能的无限可能。 4400

51单片机读取DHT11温湿度传感器代码

好的,这是一个简单的 51 单片机读取 DHT11 温湿度传感器的代码示例: ```c #include <reg52.h> #include <intrins.h> sbit DHT11_DQ = P3^2; // 将 DHT11 的数据线接到 P3.2 口 unsigned char a,b,c,d,e; // 定义存储温度和湿度的变量 void Delay_us(un...

weixin_35755188的博客 1594

【WRF工具】WRF 模型输出可视化工具 plotfmt

【WRF工具】WRF 模型输出可视化工具 plotfmt

WW、forever的博客 1292

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

零基础STM32单片机编程入门(十五) DHT11温湿度传感器模块实战含源码

介绍了DHT11温湿度传感器模块的原理,参数等,介绍了用STM32F103C8T6如何驱动这个温湿度模块进行温湿度数据采集

光子物联科技主要介绍STM32单片机,GD32单片机以及各种传感器模块原理以及驱动,适合学生,工程师等学习单片机嵌入式开发、传感器驱动、通信协议等。 6506

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

ESP32单片机使用DHT11温湿度传感器的实践与代码解析

本文将介绍如何使用ESP32单片机与温湿度传感器进行连接和数据读取,并通过实例代码的解析,帮助读者了解实现温湿度检测的原理和方法。将温湿度传感器与ESP32单片机进行连接时,需要按照传感器的接口规范进行连接。一般来说,我们需要将传感器的VCC引脚连接到ESP32的3.3V引脚,GND引脚接地,I2C或SPI引脚根据需要连接到ESP32的相应引脚。在选择温湿度传感器时,我们需要考虑传感器的精度、响应速度、功耗等因素。否则,我们将打印出湿度和温度值。在上述代码中,我们首先定义了DHT传感器的引脚号和类型。

qq_49516462的博客 4085

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

传感器自学笔记第八章——DHT11温湿度传感器(附带自己写的很好用的51单片机DHT11代码模板,参数列表只有一个字符数组指针)

作者:GWD 时间:2019.06.26 DHT11温湿度传感器(单总线类) 一、 学习要点: 1、(重要)单总线类传感器检测高电平while(DHT11 == 1) temp |=0x01;出错,因为要提前拉高引脚或者加下拉电阻很麻烦,不如改成while(DHT11 == 0) temp<<=1;后程序正确,即检测低电平比检测高电平靠谱; 2、printf与LCD1602等显示字...

gongweidi的博客 4876

DHT11温湿度传感器模块(STM32单片机驱动)

DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式储存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、

PrairieOne的博客 1583

Mac 上探索 ESP32-C3 单片机 以及温湿度传感器 DHT11

在点击 Finish 之前检查一下自己的🪜是否好使,也要确保插件也能走🪜,我这里的解决办法就是梯子开启。到货之后,可以先把引脚用杜邦线连接一下,先了解一下这个板子的几个接口,具体看。等待下载,下载好之后会在项目中查看到当前的库,可以点进去看一看源码。温湿度传感器上有三个引脚,我们把杜邦线插进去,然后对应连接好!,找到这个插件然后安装,之后插件栏会多一个。然后寻找相应的板子,我这里选择的是下图所示。之后选择添加到项目,然后选择项目,点击添加。写好的代码要先编译,然后烧录到单片机上。之后就可以查看日志了!

Lovely Ruby 的手账 1552
上一篇: 0.96寸ST7735的LCD 4线SPI调试小坑记录
下一篇: 【单片机】人体感应模块
该起床了1111
博客等级 码龄9年 67粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值