首页 > 代码库 > Arduino 温湿度传感器DHT11模块实验

Arduino 温湿度传感器DHT11模块实验

网上有很多DHT11的测试,试了N个程序,总是不得要领,各种报错,最后终于找到一套可用的库。

首先是DHT11.h文件

#ifndef __DHT11_H__
#define __DHT11_H__

#include <Arduino.h>

//DHT11 IO设置
#define DHT11_DQ 2

#define DHT11_DQ_0 digitalWrite(DHT11_DQ,LOW)
#define DHT11_DQ_1 digitalWrite(DHT11_DQ,HIGH)

//函数或者变量声明
extern void DHT11_Init();
extern unsigned char DHT11_Read_Byte();
extern void DHT11_Read();

extern unsigned char HUMI_Buffer_Int;
extern unsigned char TEM_Buffer_Int;

#endif

其次是DHT11.cpp文件

#include "DHT11.h"

//定义变量
unsigned char HUMI_Buffer_Int = 0;
unsigned char TEM_Buffer_Int = 0;
 
//****************************************************
//初始化DHT11
//****************************************************
void DHT11_Init()
{
	pinMode(DHT11_DQ,OUTPUT);

	DHT11_DQ_0;                      //拉低总线,发开始信号;
	delay(30);                       //延时要大于 18ms,以便 DHT11 能检测到开始信号;
	DHT11_DQ_1;
	delayMicroseconds(40);           //等待 DHT11 响应;
	pinMode(DHT11_DQ,INPUT);
	while(digitalRead(DHT11_DQ) == HIGH);
	delayMicroseconds(80);           //DHT11 发出响应,拉低总线 80us;
	if(digitalRead(DHT11_DQ) == LOW);
	delayMicroseconds(80);           //DHT11 拉高总线 80us 后开始发送数据;
}

//****************************************************
//读一个字节DHT11数据
//****************************************************
unsigned char DHT11_Read_Byte()
{
	unsigned char i,dat = 0;
	unsigned int j;

	pinMode(DHT11_DQ,INPUT);

	for( i=0; i<8; i++)
	{
		if(digitalRead(DHT11_DQ) == LOW)
		{
			while(digitalRead(DHT11_DQ) == LOW);   //等待 50us;
			delayMicroseconds(30);     //判断高电平的持续时间,以判定数据是‘0’还是‘1’;
			if(digitalRead(DHT11_DQ) == HIGH)
				dat |= (1<<(7-i));     //高位在前,低位在后;
			while(digitalRead(DHT11_DQ) == HIGH);  //数据‘1’,等待下一位的接收;
		}
	}
	return dat;
}

//****************************************************
//读取温湿度值,存放在TEM_Buffer和HUMI_Buffer
//****************************************************
void DHT11_Read()
{
	DHT11_Init();

	HUMI_Buffer_Int = DHT11_Read_Byte(); //读取湿度的整数值
	DHT11_Read_Byte();                   //读取湿度的小数值
	TEM_Buffer_Int = DHT11_Read_Byte();  //读取温度的整数值
	DHT11_Read_Byte();                   //读取温度的小数值
	DHT11_Read_Byte();                   //读取校验和
	delayMicroseconds(50);               //DHT11拉低总线50us

	pinMode(DHT11_DQ,OUTPUT);
	DHT11_DQ_1;                          //释放总线	


}

最后是主程序文件

#include <Arduino.h>
#include "DHT11.h"


void setup()                //Arduino程序初始化程序放在这里,只在开机时候运行一次
{							
	Serial.begin(9600);     //设置通讯的波特率为9600
	DHT11_Read();           //读取温湿度值
	delay(200);             //等待传感器稳定	
}

void loop()                 //Arduino程序的主程序部分,循环运行内部程序
{
	DHT11_Read();           //读取温湿度值
	Serial.print("HUMI = ");
	Serial.print(HUMI_Buffer_Int);
	Serial.println(" %RH");

	Serial.print("TMEP = ");
	Serial.print(TEM_Buffer_Int);
	Serial.println(" C");
	delay(1000);            //延时1s
}

三个文件保存在同一个文件夹即可。