InitKit 开发之——DHT11温湿度传感器

【STM32】DHT11温湿度模块传感器详解&代码 DHT11温湿度模块传感器 阅读详情

之前画InitKit开发板都时候,画上了DHT11温湿度传感器,这样就可以实现手机APP查看环境温湿度的功能。最近刚好空了下来就写了一下关于DHT11的测试代码。

------------------------------------------------------------分割---------------------------------------------------------------------------------------

实验环境:

硬件:InitKit开发板,DHT11温湿度传感器,0.91寸OLED(IIC接口)

软件:MDK5,串口助手

PS:关于软件MDK5安装可以看这篇https://blog.youkuaiyun.com/initdev/article/details/80704205

DHT11电路原理图:(DAT脚接一个1K的上拉电阻就可以了)

实物图:(请无视无关的连接)                                        

PS:电路设计的时候,DHT11的数据脚连接到stm32的PB1上了。话不多说,直接上代码。

------------------------------------------------------------分割---------------------------------------------------------------------------------------

dht11.c部分

#include "dht11.h"

/*----------------------------------------------------------------------------/
/  InitKit  -  DHT11 						                 (C)Lin, 2018
/-----------------------------------------------------------------------------/
/ 本程序只供学习使用,未经作者许可,不得用于其它任何用途
/ 测试验证环境InitKit V1.0 开发板
/ RGB LED 驱动代码
/ Copyright (C) 2018, Lin, all right reserved.
/
/ * 修改日期:
/ * 版本:V1.0
/ * Copyright(C) InitDev 2018-2028
/
/-----------------------------------------------------------------------------/
修改记录
/
/---------------------------------------------------------------------------*/

uint8_t dht11Init(void)
{
    GPIO_InitTypeDef  GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(DHT11_DQ_Rcc, ENABLE);

    GPIO_InitStructure.GPIO_Pin = DHT11_DQ_Pin;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(DHT11_DQ_Port, &GPIO_InitStructure);
    GPIO_SetBits(DHT11_DQ_Port,DHT11_DQ_Pin);

    dht11Rst(); 
    
//    memset((uint8_t *)&temphumTypedef, 0, sizeof(tpTypedef_t)); 
    
    return dht11Check(); 
}
static void DHT11_IO_IN(void)
{
	 GPIO_InitTypeDef GPIO_InitStruct;
	 GPIO_InitStruct.GPIO_Pin = DHT11_DQ_Pin;
	 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
	 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;
	 GPIO_Init(DHT11_DQ_Port, &GPIO_InitStruct);
}

static void DHT11_IO_OUT(void)
{
	 GPIO_InitTypeDef GPIO_InitStruct;
	 GPIO_InitStruct.GPIO_Pin = DHT11_DQ_Pin;
	 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
	 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;
	 GPIO_Init(DHT11_DQ_Port, &GPIO_InitStruct);
}	

//Reset DHT11
static void dht11Rst(void)
{
    DHT11_IO_OUT(); 			            //SET OUTPUT
    DHT11_DQ_OUT=0; 			            //GPIOA.0=0
    delay_ms(20);    			            //Pull down Least 18ms
    DHT11_DQ_OUT=1; 			            //GPIOA.0=1
    delay_us(30);     			          //Pull up 20~40us
}

static uint8_t dht11Check(void)
{
    uint8_t retry=0;
    DHT11_IO_IN();                                              //SET INPUT
    while (DHT11_DQ_IN && (retry<100))                          //DHT11 Pull down 40~80us
    {
        retry++;
        delay_us(1);
    }

    if(retry >= 100)
    {
        return 1;
    }
    else
    {
        retry=0;
    }

    while (!DHT11_DQ_IN&& (retry < 100))		    //DHT11 Pull up 40~80us
    {
        retry++;
        delay_us(1);
    }

    if(retry >= 100)
    {
        return 1;	                        //check error
    }        

    return 0;
}

static uint8_t dht11ReadBit(void)
{
    uint8_t retry=0;
    while(DHT11_DQ_IN && (retry<100))                           //wait become Low level
    {
        retry++;
        delay_us(1);
    }

    retry = 0;
    while(!DHT11_DQ_IN && (retry < 100))		    //wait become High level
    {
        retry++;
        delay_us(1);
    }

    delay_us(30);//wait 40us

    if(DHT11_DQ_IN)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

static uint8_t dht11ReadByte(void)
{
    uint8_t i,dat;
    dat=0;
    for (i=0; i<8; i++)
    {
        dat<<=1;
        dat |= dht11ReadBit();
    }

    return dat;
}

//
//返回0有效,1无效
uint8_t dht11Read(uint8_t *temperature, uint8_t *humidity)
{
    uint8_t buf[5];
    uint8_t i;
    dht11Rst(); 
    if(0 == dht11Check()) 
    {
        for(i=0; i<5; i++)
        {
            buf[i] = dht11ReadByte();
        }
        if(buf[4] == (buf[0]+buf[1]+buf[2]+buf[3]))//根据校验位判断数据有效性
        {
             *humidity = buf[0];
            *temperature = buf[2];
        }
    }
    else
    {
        return 1;
    }
    return 0;
}

下面是dht11.h部分

#ifndef __DHT11_H
#define __DHT11_H

#include "main.h"

/*----------------------------------------------------------------------------/
/  InitKit  -  DHT11 						                 (C)Lin, 2018
/-----------------------------------------------------------------------------/
/ 本程序只供学习使用,未经作者许可,不得用于其它任何用途
/ 测试验证环境InitKit V1.0 开发板
/ RGB LED 驱动代码
/ Copyright (C) 2018, Lin, all right reserved.
/
/ * 修改日期:
/ * 版本:V1.0
/ * Copyright(C) InitDev 2018-2028
/
/-----------------------------------------------------------------------------/
修改记录
/
/---------------------------------------------------------------------------*/

/* DHT11端口与管脚定义 */
#define DHT11_DQ_Port	GPIOB
#define DHT11_DQ_Rcc	RCC_APB2Periph_GPIOB
#define DHT11_DQ_Pin	GPIO_Pin_1
									 
#define	DHT11_DQ_OUT  PBout(1) 
#define	DHT11_DQ_IN   PBin(1)   

/* Function declaration */
uint8_t dht11Init(void); //Init DHT11
uint8_t dht11Read(uint8_t *temperature, uint8_t *humidity);

static uint8_t dht11ReadByte(void);//Read One Byte
static uint8_t dht11ReadBit(void);//Read One Bit
static uint8_t dht11Check(void);//Chack DHT11
static void dht11Rst(void);//Reset DHT11    

#endif

使用时,在dht11.h中的DHT11管脚定义部分即可使用。当然,头文件需要支持uint8_t,PBout(x)之类的定义。

下面贴出部分示例代码,方便大家熟悉如何使用。

int main()
{
	delay_init();  	  //时钟初始化
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断分组配置
	UART1_Init(115200);
//	Esp_Uart_Init();
	OLED_Init();
	delay_ms(1);
	printf("//*********** InitKit V1.0 ************/\r\n");
	printf("/**** Usart1 port bound: 115200 ******/\r\n");
	printf("/**** Usart3 port bound: 115200 ******/\r\n");
	printf("/**** by linjianbo  time: 20180724 ***/\r\n");
	printf("start test.............................\r\n");
//TEST
	while(dht11Init());
//TEST	
	OLED_ShowString(0,0,"Temp:",8);
	OLED_ShowString(0,2,"Humi:",8);
	while(1)
	{
		while(dht11Read(&Systemp,&Syshumidity)==1);
		sep_send_buff[0] = Systemp/100+0x30;
		sep_send_buff[1] = Systemp%100/10+0x30;
		sep_send_buff[2] = Systemp%10+0x30;
		sep_send_buff[3] = 'C';
		printf("Tempture:%s\r\n",sep_send_buff);
		OLED_ShowString(5*8,0,sep_send_buff,8);
		
		sep_send_buff[0] = Syshumidity/100+0x30;
		sep_send_buff[1] = Syshumidity%100/10+0x30;
		sep_send_buff[2] = Syshumidity%10+0x30;
		sep_send_buff[3] = '%';
		printf("humidity:%s\r\n",sep_send_buff);
		OLED_ShowString(5*8,2,sep_send_buff,8);
		delay_ms(500);
	}
}

实际运行效果:

串口助手显示

OLED显示效果

有问题的或者对这方面感兴趣的小伙伴欢迎关注的公众号,一起学习,一起进步。

 

DHT11温湿度传感器实验 文章目录DHT11技术性能特征数据发送流程 DHT11 单总线数据格式 双向传输 数据分小数部分和整数部分 一次完整的数据传输40bit 高位先出 数据格式:8bit湿度整数 + 8bit湿度小数数据 + 8bit 温度整数+ 8bit温度小数数据 + 8bit校验和 技术性能特征 工作电压范围:3.3V - 5.5V 工作电流:平均0.5mA 输出:单总线数字信号 测量范围:湿度20-90% 温度0~50℃ 精度:湿度±5% 温度±2℃ 分辨率:湿度1% 温度1℃ 数据发送流程 主机拉低数据线 保持t 阅读详情

相关推荐

STM32F103C8T6温湿度DHT11驱动篇

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

weixin_51248645的博客 1万+

DHT11使用详解

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

菜菜的博客 5万+

Landsat 9 数据预处理第一步:在ENVI里正确加载影像的保姆级指南(含MTL文件处理)

本文详细介绍了Landsat 9数据在ENVI中的预处理流程,重点讲解了MTL文件的关键修改与正确加载方法,帮助遥感新手快速掌握数据加载技巧。通过辐射定标、大气校正等步骤,确保数据达到分析就绪状态,适用于土地覆盖分类等高级应用。

weixin_29201313的博客 208

温湿度传感器DHT11的使用

DHTDAT和单片机引脚相连。 1、VDD 供电3.3~5.5V DC 2、DATA 串行数据,单总线 3、NC 空脚 4、GND 接地,电源负极 单总线传送数据位定义 DATA用于微处理器与DHT11之间的通讯和同步,采用单总线数据格式,一次传送40位数据,高位先出。 数据格式: 8bit湿度整数数据+8bit湿度小数数据+8bit温度整数数据+8bit温度小数数据+8bit校验位。 注:其中湿度小数部分为0。 校验位数据定义 “8bit湿度整数数据+8bit湿度小数数据+8bit温度整数数据+8bit

CrystalTri的博客 5230

基因家族的鉴定-基于Windows系统上的HMMER

基因家族的鉴定-基于Windows系统上的HMMER。

liangjinghui123的博客 3256

非标准包 game.rgss3a 的打开方法 | 2023 年实测

生活笔记

陌雨’的博客 1万+

STM32使用温湿度DHT11基于HAL库开发

这里是使用STM32F103C6T6单片机通过串口打印DHT11采集的温湿度信息。

qq_53014952的博客 9069

【2025年五一数学建模竞赛】A题 完整论文 模型建立与求解

2025年五一数学建模竞赛 A题:基于历史数据与模式识别的道路车流量推测模型研究

Magnolia_He的博客 3783

stm32-DHT11原理及代码解读

DHT11,原理及源码分析。

qq_52900974的博客 4938

STorM BGC V1.31硬件+SimpleBGC固件:从零搭建三轴云台开发环境(Keil+JLink避坑指南)

本文详细介绍了如何从零搭建STorM BGC V1.31硬件+SimpleBGC固件的三轴云台开发环境,涵盖硬件连接、Keil+JLink开发工具配置、固件编译与烧录等关键步骤,并提供了常见问题的解决方案和调试技巧,帮助开发者快速上手三轴云台开发。

weixin_28693683的博客 381

UE5实现建筑剖切效果

UE5实现建筑剖切效果

专注GIS开发 8464

STM32学习之传感器篇——DHT11温湿度传感器

1、DHT11传感器简介 DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性和卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准...

qq_42930154的博客 2万+

AWR2243的等效相位中心与虚拟通道

在俯仰维方向上,不重合的虚拟通道有8个,排序为1:4,9:12。每个虚拟阵元之间的间隔为lambda/2。实际y轴方向虚拟阵列只跨越了8*lambda/2的距离。等效相位中心与虚拟通道类似,只是每个相位中心之间间隔为lambda/4,实际y轴方向等效相位中心只跨越了8*lambda/4=7.59mm的距离

qq_50974341的博客 1983

DHT11温湿度传感器编程详解

DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,采用专用的数字模块采集技术和温湿度传感技术,无需复杂的电路处理。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。

m0_60790717的博客 6009

【异常】OpenClaw调用火山引擎大模型提示词 Agent failed before reply: All models failed (6): volcengine/kimi-k2-5-26

摘要: 本文针对OpenClaw调用火山引擎大模型服务时触发的全量熔断报错(All models failed)提供全链路排查方案。报错核心为服务熔断(cooldown)和模型不可用(model_not_found),主要源于账号权限、API凭证失效或模型标识错误。解决方案按优先级分步实施:1)校验账号状态与AK/SK有效性;2)核对官方模型标识;3)重启服务解除熔断;4)修复配置文件;5)通过原生API测试定位网络或服务端问题。日志分析(openclaw logs)可快速识别HTTP状态码(如401/40

奶爸的编程之路,也就一周冷个三天 838

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

基于stm32单片机的DHT11温湿度模块使用

对于温湿度模块来说,DHT11算是很经典的了,使用起来比较简单,但相对的功能上也没有那么强大。DHT11的湿度测量精度范围为20-90%RH(相对湿度),温度测量精度范围为0-50°C。但需要注意的是,DHT11的精度可能会受到环境因素的影响,如温度变化、湿度变化、气流等。因此,在使用DHT11进行测量时,应该尽量选择稳定的环境条件,以提高测量的准确度。DTH11有三个引脚的,也有四个引脚的,通常4个引脚的NC那个引脚也用不到,所以3个引脚的就够我们使用了。

weixin_64335315的博客 1万+

OV9734 DATASHEET,完整规格书

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

STM32学习记录:DHT11温湿度传感器

DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器电容式感湿元件和NTC测温元件。DHT产品实物图(图片来源于网络)

Dust_Fear的博客 4841

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

DHT11通用驱动

DHT11数字湿温度传感器采用单总线数据格式。即,单个数据引脚端口完成输 入输出双向传输。其数据包由5Byte(40Bit)组成。数据分小数部分和整数部分,具 体格式在下面说明。 一次完整的数据传输为40bit,高位先出。 数据格式:8bit湿度整数数据+8bit湿度小数数据 +8bit温度整数数据+8bit温度小数数据 +8bit校验和 校验和数据为前四个字节相加。 传感器数据输出的是未编码的二进制数据。数据(湿度、温度、整数、小数)之间 应该分开处理。如果,某次从传感器中读取如下5Byte数据: byt

weixin_46090853的博客 2018

DHT11温湿度传感器驱动程序

DHT11温湿度传感器驱动程序

qq_44823010的博客 2376

STM32驱动DHT11

1、开发平台 使用野火STM32H750开发板 无RTOS 使用HAL库进行开发 硬件连接: SDA---->PA12 2、DHT11介绍 起始信号: 从机响应信号: 传输: 贴上代码: dht11.h #ifndef __dht11_h #define __dht11_h #include "main.h" /*底层接口*/ #define __DHT11_GPIO_INI...

qq_42312125的博客 5954

STM32单片机DHT11数字温湿度监测

STM32单片机DHT11数字温湿度监测OLED显示。

weichen_78的博客 4730

DHT11温湿度传感器模块

DHT11温湿度传感器模块

m0_74131461的博客 4217

DHT11温湿度模块调试

DHT11温湿度模块调试 引脚定义 1.VDD(3.3~5.5VDC)------> STM32 3.3V 2.DATA ------> STM32 PE9 3.NC 4.GND ------> STM32 GND 主函数调用 //DHT11初始化 DHT11_Init(); //温湿度采集 dht11State = DHT11_Read_Data(&tempTH, &humiRH); 头文件 #ifndef _CHT11_H #define _CHT11_H #in

qq_39486659的博客 2409

(STM32笔记3)DHT11实验

实验任务:开机的时候先检测是否有 DHT11 存在,如果没有,则提示错误。只有在检测到 DHT11 之后才开始读取温湿度值,并显示在 LCD 上,如果发现了 DHT11,则程序每隔 100ms 左右读一次数据,并把温湿度显示在 LCD 上。同样我们也是用 DS0 来指示程序正在运行。 main函数 #include "led.h" #include "delay.h" #include "key.h" #include "sys.h" #include "lcd.h" #include "usart.

weixin_52451652的博客 1188

【学习记录】DHT11驱动移植

DHT11驱动移植

liarsup的博客 475

第一章 DHT11温湿度传感器的使用

第一章 DHT11温湿度传感器的使用

qq_44645742的博客 1万+
上一篇: KEIL5添加STC芯片库
下一篇: Multisim 13.0.1 安装教程
Initdev
博客等级 码龄9年 198粉丝 12原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值