1. 程式人生 > >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
}

三個檔案儲存在同一個資料夾即可。