网上有很多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 }
三个文件保存在同一个文件夹即可。
Arduino 温湿度传感器DHT11模块实验
时间: 2024-10-28 21:30:07