DHT11温湿度传感模块

文字信息来源

温湿度传感器 温湿度芯片 温湿度变送器模块 气体传感器 流量传感器 广州奥松电子股份有限公司 (aosong.com)

1.DHT11简介     

概述:DHT11是广州奥松有限公司生产的一款湿温度一体化的数字传感器。 该传感器包括一个电阻式测湿元件和一个NTC测温元件,并与一个高性能8位 单片机相连接。通过单片机等微处理器简单的电路连接就能够实时的采集本地湿 度和温度。DHT11 与单片机之间能采用简单的单总线进行通信,仅仅需要一个 I/O 口。传感器内部湿度和温度数据40Bit 的数据一次性传给单片机,数据采用 校验和方式进行校验,有效的保证数据传输的准确性。DHT11功耗很低,5V电 源电压下,工作平均最大电流0.5mA。

性能指标和特性如下:

  • 工作电压范围:3.5V-5.5V
  • 工作电流 :平均0.5mA
  • 湿度测量范围:20-90%RH
  • 温度测量范围:0-50℃
  • 湿度分辨率 :1%RH 8位
  • 温度分辨率 :1℃ 8 位
  • 采样周期 :1S
  • 单总线结构
  • 与TTL兼容(5V)

管脚排列如下:

2.应用电路连接说明

        DHT11数字湿温度传感器连接方法极为简单。第一脚接电源正,第四脚接电源地端。 数据端为第二脚。可直接接主机(单片机)的I/O口。为提高稳定性,建议在数据端和电源 正之间接一只4.7K的上拉电阻。第三脚为空脚,此管脚悬空不用。

3.DHT11数据结构

         DHT11数字湿温度传感器采用单总线数据格式。即,单个数据引脚端口完成输 入输出双向传输。其数据包由5Byte(40Bit)组成。数据分小数部分和整数部分,具 体格式在下面说明。

4.DHT11的传输时序

4.1 DHT11 开始发送数据流程

4.2 主机复位信号和DHT11响应信号

4.3 数字‘0’信号表示方法

4.4 数字‘1’信号表示方法

5.原理图

6.代码

DHT22.c

#include "stm32f10x.h"                  // Device header
#include "DHT22.h"
#include "Delay.h"


//DHT22引脚输出模式
void DHT22_GPIO_OUT(void)
{
	GPIO_InitTypeDef  GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = DHP_GPIO_Pin;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(DHP_GPIO_PORT, &GPIO_InitStructure);
}

//DHT22引脚输入模式
void DHT22_GPIO_IN(void)
{
	GPIO_InitTypeDef  GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_InitStructure.GPIO_Pin = DHP_GPIO_Pin;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(DHP_GPIO_PORT, &GPIO_InitStructure);
}


//写引脚的高低电平
void DHT22_W_SCL(uint8_t BitValue)
{
	 GPIO_WriteBit(DHP_GPIO_PORT, DHP_GPIO_Pin, (BitAction)BitValue);
}

//读引脚电平
uint8_t DHT22_R_SCL(void)
{
	 return GPIO_ReadInputDataBit(DHP_GPIO_PORT, DHP_GPIO_Pin);
}

//复位DHT22
void DHT22_Rst(void)
{
	DHT22_GPIO_OUT(); 	//SET OUTPUT
	DHT22_W_SCL(0);
	Delay_ms(20);		//主机拉低至少18ms
	DHT22_W_SCL(1);
	Delay_us(30);		//主机拉高20~40us				  
}

//等待DHT22响应
//返回1:未检测到DHT22的存在
//返回0:存在
uint8_t DHT22_Check(void)
{
	uint8_t retry = 0;
	DHT22_GPIO_IN();//SET INPUT
	while (DHT22_R_SCL() && retry < 100)     //DHT11会拉低40~80us
	{
		retry ++;
		Delay_us(1);
	}
	if(retry >= 100)
	{
		 return 1;
	}
	else
	{
		retry = 0;
	}
	while (!DHT22_R_SCL() && retry < 100)     //DHT11拉低后会再次拉高40~80us
	{
		retry ++;
		Delay_us(1);
	}
	if(retry >= 100) return 1;
	return 0;
}

//初始化DHT22 同时检测是否存在
//返回1:不存在
//返回0:存在
uint8_t DHT22_Init(void)
{
	RCC_APB2PeriphClockCmd(DHP_GPIO_CLK, ENABLE);    //使能外设时钟
	
	DHT22_GPIO_OUT();
	
	GPIO_SetBits(DHP_GPIO_PORT, DHP_GPIO_Pin);       //默认引脚高电平
	
	DHT22_Rst();	//复位DHT22
	return  DHT22_Check();//等待DHT11的回应
}

//从DHT22读取一个wei
//返回值:1/0
uint8_t DHT22_ReadBit(void)
{
	uint8_t retry = 0;
	while (DHT22_R_SCL() && retry < 100)     //等待变为低电平
	{
		retry ++;
		Delay_us(1);
	}
	retry =0;
	while (!DHT22_R_SCL() && retry < 100)     //等待变高电平
	{
		retry ++;
		Delay_us(1);
	}
	Delay_us(40); //等待40us
	if (DHT22_R_SCL()) return 1;
	else return 0;
}


//读取一个字节
uint8_t DHT22_ReadByte(void)
{
	uint8_t i, data;
	data = 0;
	for (i = 0; i < 8; i++){
		data <<= 1;
		data |= DHT22_ReadBit();
	}
	return data;
}

//读取数据
//1 成功,0失败
uint8_t DHT22_ReadData(float *Temp, float *Humi)
{
	uint8_t buf[5];
	uint8_t i;
	DHT22_Rst();
	if(!DHT22_Check())      //DHT22存在
	{
		 for (i = 0; i < 5; i ++)
		{
			 buf[i] = DHT22_ReadByte();
		}
		if(buf[0] + buf[1] + buf[2] + buf[3] == buf[4])
		{
			*Humi = buf[0] + buf[1] / 10.0;
			*Temp = buf[2] + buf[3] / 10.0;			
		}
	}
	else return 0;
	return 1;
}

DHT22.h

#ifndef __DHT22_H_
#define __DHT22_H_



//DHT引脚宏定义
#define DHP_GPIO_Pin		GPIO_Pin_3
#define DHP_GPIO_PORT		GPIOA
#define DHP_GPIO_CLK		RCC_APB2Periph_GPIOA


uint8_t DHT22_Init(void);
uint8_t DHT22_ReadData(float *Temp, float *Humi);

#endif

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "LED.h"
#include "DHT22.h"

uint8_t flag;
float Temp, Humi;

int main(void)
{
	OLED_Init();
	LED_Init();
	while (DHT22_Init())
	{
		 OLED_Printf(0, 32, OLED_8X16, "DHT11 Error \r\n");
	}
	
	
	OLED_ShowString(0, 0, "Temp:      C", OLED_8X16);
	OLED_ShowString(0, 16, "Humi:      %", OLED_8X16);

	
	OLED_Update();
	
	while(1)
	{
		DHT22_ReadData(&Temp, &Humi);
//		OLED_ShowNum(0, 32, flag, 2, OLED_8X16);

		OLED_ShowFloatNum(40, 0, Temp, 2, 1, OLED_8X16);
		OLED_ShowFloatNum(40, 16, Humi, 2, 1, OLED_8X16);
		OLED_Update();

	}
}

oled模块代码为江科大oled部分代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值