网上有很多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
}
三个文件保存在同一个文件夹即可。