1. 首頁
  2. »
  3. arduino
  4. Arduino 實作出簡易溫濕度計,DHT11 入門與整合 1602LCD (附原始碼)

Arduino 實作出簡易溫濕度計,DHT11 入門與整合 1602LCD (附原始碼)

2021/05/23

梅問題-Arduino 簡易實作出溫濕度計,DHT11 入門與整合 1602LCD (附原始碼)
  有關環境數值的偵測,溫濕度是最常見的應用,而用DHT11來偵測溫度和濕度,也是Arduino的入門範例之一,只要利用DHT的函式庫,真的很簡單!DHT22也適用哦!市面上目前大家能找到的DHT11有兩種:一種是單純DHT11沒背板的,一種是有焊背板的。差別在於焊了背板就可以省掉加電阻這個麻煩,也少一個腳位,方便很多,傑森基本上都用有背板的,所以這次的範例也是介紹有背板的DHT11。


至於DHT11的函式庫選擇也很多,傑森用的是常見的Adafruit DHT Sensor Library,只要從Arduino IDE的程式管理員就能下載。
梅問題-Arduino 簡易實作出溫濕度計,DHT11 入門與整合 1602LCD (附原始碼)


不過這個函式庫需要安裝另一個Adafruit Unified Sensor Library函式庫,所以也請一併安裝哦。一樣在Arduino IDE的程式管理員就能下載。

再來就是接線囉,DHT模組只有3條線:GND、VCC,還有DATA,這次我們把DATA資料線接到PIN 9;DHT11可以用3.3V或5V,因為5V要留給LCD用,所以我們DHT就接到3.3V吧。
梅問題-Arduino 簡易實作出溫濕度計,DHT11 入門與整合 1602LCD (附原始碼)
我們先用函式庫附的範例做個簡單的測試,傑森簡化了整支程式,看起來會更簡單。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include "DHT.h"
#define DHTPIN 9
#define DHTTYPE DHT11
//#define DHTTYPE DHT22   // DHT 22 如果用的是DHT22,就用這行
//#define DHTTYPE DHT21   // DHT 21
DHT dht(DHTPIN, DHTTYPE);
void setup()
{
  Serial.begin(9600);
  Serial.println("DHTxx test!");
  dht.begin();  //初始化DHT
} // setup()
void loop()
{
  delay(1000);
  float h = dht.readHumidity();   //取得濕度
  float t = dht.readTemperature();  //取得溫度C
  //顯示在監控視窗裡
  Serial.print("Humidity: ");
  Serial.print(h);
  Serial.print(" %\t");
  Serial.print("Temperature: ");
  Serial.print(t);
  Serial.println(" C ");
} // loop()

程式很簡單,從DHT讀取數值,分別可以得到濕度和溫度,然後顯示在監控視窗中。大家可以試著對DHT哈氣,會發現濕度和溫度都會產生變化。
梅問題-Arduino 簡易實作出溫濕度計,DHT11 入門與整合 1602LCD (附原始碼)
再來就試著把溫濕度顯示到LCD中吧!有關LCD的部份,大家可以參考另一篇教學:Arduino 1602 LCD 最快速範例 ,把LCD的線也都接上吧!
梅問題-Arduino 簡易實作出溫濕度計,DHT11 入門與整合 1602LCD (附原始碼)
程式再補上LCD的部份就搞定了!主要是把文字的位置設定好,讓顯示出來漂亮一點就可以了。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <LiquidCrystal_PCF8574.h>
#include "DHT.h"
#define DHTPIN 9
#define DHTTYPE DHT11
//#define DHTTYPE DHT22   // DHT 22 如果用的是DHT22,就用這行
//#define DHTTYPE DHT21   // DHT 21
LiquidCrystal_PCF8574 lcd(0x3F);  // 設定i2c位址,一般情況就是0x27和0x3F兩種
DHT dht(DHTPIN, DHTTYPE);
void setup()
{
  Serial.begin(9600);
  Serial.println("DHTxx test!");
  dht.begin();  //初始化DHT
  lcd.begin(16, 2); // 初始化LCD
  lcd.setBacklight(255);
  lcd.clear();
  lcd.setCursor(0, 0);  //設定游標位置 (字,行)
  lcd.print("~ first line.");
  lcd.setCursor(0, 1);
  lcd.print("~* second line.");
} // setup()
void loop()
{
  delay(1000);
  float h = dht.readHumidity();   //取得濕度
  float t = dht.readTemperature();  //取得溫度C
  Serial.print("Humidity: ");
  Serial.print(h);
  Serial.print(" %\t");
  Serial.print("Temperature: ");
  Serial.print(t);
  Serial.println(" *C ");
  lcd.clear();
  lcd.setCursor(0, 0);  //設定游標位置 (字,行)
  lcd.print("RH  :");  //Relative Humidity 相對濕度簡寫
  lcd.setCursor(7, 0);
lcd.print(h); lcd.setCursor(14, 0); lcd.print("%"); lcd.setCursor(0, 1); //設定游標位置 (字,行) lcd.print("Temp:"); lcd.setCursor(7, 1);
lcd.print(t); lcd.setCursor(13, 1); lcd.print((char)223); //用特殊字元顯示符號的"度" lcd.setCursor(14, 1); lcd.print("C"); } // loop()

#完整程式下載:
http://jmaker.banner.tw/doc/dht.zip


傑森 資深軟體工程師,從事資訊教育多年,熟悉Web及App技術,目前熱衷於Arduino及樹莓派Raspberry Pi的相關研究及實作。