2022年8月23日 星期二

DHT11 傳感器與 NodeMCU 接口

 

介紹

DHT11溫濕度傳感器

DHT11溫濕度傳感器

DHT11 傳感器通過一根導線連續測量並提供濕度和溫度值。

它可以在 0 到 50°C 的範圍內測量相對濕度的百分比(20 到 90% RH)和攝氏度的溫度。

它有4個引腳;其中之一用於串行形式的數據通信。

不同 TON 和 TOFF 的脈衝被解碼為邏輯 1 或邏輯 0 或開始脈衝或幀結束。

有關 DHT11 傳感器及其使用方法的更多信息,請參閱傳感器和模塊主題中的主題DHT11 傳感器

接口圖

NodeMCU 與 DHT11 的接口

NodeMCU與DHT11接口

 

例子

讓我們將 DHT11 與 NodeMCU 連接,並從 DHT11 中讀取溫度和濕度的值。

我們可以用 Lua 腳本或 C/C++ 語言為 NodeMCU DevKit 編寫代碼。我們使用 ESPlorer IDE 用 Lua 腳本編寫代碼,使用 Arduino IDE 用 C/C++ 編寫代碼。要了解更多信息,請參閱 使用 ESPlorer IDE 開始使用 NodeMCU(對 NodeMCU 使用 Lua 腳本)和使用 Arduino IDE 開始使用 NodeMCU(對 NodeMCU 使用基於 C 語言的 Arduino 草圖)。

基於 NodeMCU LUA 的 DHT 模塊功能

讓我們看看 NodeMCU 的基於 LUA 的功能,可用於 DHT 模塊讀取溫度和濕度。

 

dht.read()

該功能用於讀取各種DHT傳感器的數據,包括DHT11、21、22、33、44型濕度溫度傳感器。

句法: dht.read(pin)

參數:

pin要讀取 DHT 傳感器輸出的引腳號。不支持 0 引腳編號 (D0)。

回報:

status它返回 dht.OK、dht.ERROR_CHECKSUM、dht.ERROR_TIMEOUT 中的一種狀態。

temp:溫度

humi:濕度

temp_dec:溫度小數

humi_dec:濕度小數

 

注意:返回變量的數據類型取決於固件支持的數據類型。即如果固件支持浮動,那麼它將返回浮點值,否則它將返回一個整數。

此外,我們可以使用dht11.read() 該函數僅從 dht11 讀取輸出,也可以使用函數從 dht11dht.readxx()以外的 DHT 模塊讀取輸出,即 xx 將為 22、33 等。這些函數具有相同的語法、參數和返回值。

讓我們編寫 Lua 腳本從 dht11 讀取溫度和濕度

DHT11 的 Lua 腳本

pin = 1

status, temp, humi, temp_dec, humi_dec = dht.read(pin)--read dht11 from pin

if status == dht.OK then    --check status is ok and print temperature and humidity
print(string.format("DHT Temperature:%d.%03d;Humidity:%d.%03d",
math.floor(temp),
temp_dec,
math.floor(humi),
humi_dec
    ))
elseif status == dht.ERROR_CHECKSUM then    --else print either status
print( "DHT Checksum error." )
elseif status == dht.ERROR_TIMEOUT then
print( "DHT timed out." )
end

ESPlorer 串行輸出窗口

ESPlorer 用於 DHT11 溫度和濕度測量的串行監視器輸出窗口

 

DHt11 的 ESPlorer 串行監視器窗口

 

DHT11 的 Arduino 草圖

在這裡,我們將使用來自 GitHub 的 Mark Ruys 的 DHT11 庫。

從這裡下載這個庫

提取庫並將文件夾添加到 Arduino IDE 的庫文件夾路徑中。

有關如何將自定義庫添加到 Arduino IDE 並使用其中的示例的信息,請參閱基礎部分中的 庫到 Arduino IDE

將庫添加到 Arduino IDE 後,打開 IDE 並從添加的庫中打開名為 DHT_Test 的示例草圖。

更改草圖中的 DHT11 引腳。您可以參考下面給出的草圖進行更改。

 

從 DHT11 讀取溫度和濕度的草圖

#include "DHT.h"

DHT dht;

void setup()
{
  Serial.begin(9600);
  Serial.println();
  Serial.println("Status\tHumidity (%)\tTemperature (C)\t(F)");
  dht.setup(D1); 	/* D1 is used for data communication */
}

void loop()
{
  delay(dht.getMinimumSamplingPeriod()); /* Delay of amount equal to sampling period */
  float humidity = dht.getHumidity();/* Get humidity value */
  float temperature = dht.getTemperature();/* Get temperature value */
  Serial.print(dht.getStatusString());/* Print status of communication */
  Serial.print("\t");
  Serial.print(humidity, 1);
  Serial.print("\t\t");
  Serial.print(temperature, 1);
  Serial.print("\t\t");
  Serial.println(dht.toFahrenheit(temperature), 1);/* Convert temperature to Fahrenheit units */
}

Arduino 串行輸出窗口

Arduino串口監視器輸出窗口DHT11溫濕度測量

 

來自 DHT11 的 Arduino 串行監視器窗口

 


資料來源:https://www.electronicwings.com/nodemcu/dht11-sensor-interfacing-with-nodemcu

沒有留言: