2018年7月20日 星期五

Arduino:DHT11溫溼度量測與LCD顯示

幫自家儍花哥購入了很多、很多的學習模組,也正因為模組實在是瞎拚過多了,儍花哥一時半刻消化不完,所以儍花父子兵分兩路同時進行模組的功能演練。

[演練功能]
1. 測量溫濕度並將量測得知的溫濕度顯示於序列監控視窗中。
2. 測量溫濕度並將量測得知的溫濕度顯示於LCD模組中。


[模組材料]
1. Arduino Nanox 1
2. Nano 擴張板 x 1
3. DHT11溫溼度測量模組 x1
4. LCD模組 2004A x1
5. I2C匯流排 x1(簡化LCD模組控制線路)
6. 杜邦連接線 x 7條




[[DHT11溫濕度測量模組]]

* Supply voltage: 3.3 ~ 5.5V DC
* Output: single-bus digital signal
* Measuring range: Humidity 20-90% RH, Temperature 0 ~ 50 ℃
* Accuracy: Humidity + -5% RH, temperature + -2 ℃
* Resolution: Humidity 1% RH, temperature 1 ℃
* Long-term stability: <± 1% RH / Year


[[LCD模組]]
  • 此次實驗的顯示模組採用 2004A,此款LCD模組是最基本、常見的字元型LCD,使用的電壓為5V,4行顯示,每行可顯示20個字元。
  • 為了簡化顯示模組配線,另配合I2C匯流排來通訊傳輸,因此最終的LCD顯示模組只有四隻接腳,分別為Vcc、GND、SDA、SCL。
  • I2C匯流排能夠讓兩個裝置之間以穩定、高速、雙向的方式只使用兩條線來進行通訊,一條時脈線(SCL)和一條數據線(SDA),所以I2C匯流排所使用的通訊協定也被稱之為「雙線」通訊協定。


演練一:利用DHT11模組測量溫濕度,並將量測得知的溫濕度顯示於序列監控視窗中
#include <DHT.h>   //https://github.com/adafruit/DHT-sensor-library

#define DHTPIN 3 //設定DHT的接腳
#define DHTTYPE  DHT11 //DHT 11 定義DHT的類型為DHT11
DHT myDHT(DHTPIN, DHTTYPE);  //建立溫溼度模組物件

void setup() {
Serial.begin(9600);   
delay(500);
Serial.println("溫溼度測試\n");   
delay(3000);             
}

void loop() {
//讀取濕度
float h = myDHT.readHumidity();
//讀取攝氏溫度
float t = myDHT.readTemperature();
//讀取華氏溫度
float f = myDHT.readTemperature(true);
//輸出溫溼度資訊
Serial.print("濕度 = ");   
Serial.print(h);   
Serial.print("% ");   
Serial.print("攝氏 = ");   
Serial.print(t);   
Serial.print("C ; 華氏 = ");
Serial.print(f);
Serial.println("F");   
delay(2000);  
}

演練二:利用DHT11模組測量溫濕度,並將量測得知的溫濕度顯示於LCD模組中
#include <DHT.h>    //https://github.com/adafruit/DHT-sensor-library
#define DHTPIN 3 //設定DHT的接腳
#define DHTTYPE  DHT11 //DHT 11 定義DHT的類型為DHT11
DHT myDHT(DHTPIN, DHTTYPE);  //建立溫溼度模組物件

#include <LCD.h>
#include <LiquidCrystal_I2C.h>
// 設定 LCD I2C 位址
// addr, en,rw,rs,d4,d5,d6,d7,bl,blpol
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

void setup() {
// 初始化 LCD,一行 20 的字元,共 4 行,預設開啟背光
lcd.begin(20, 4);
// 輸出啟動訊息
lcd.setCursor(0, 0); // 設定游標位置在第一行行首
lcd.print("SYSTEM START!!");
delay(500);
lcd.clear(); //顯示清除             
lcd.print("DHT Sensor Test ...");
myDHT.read();
delay(2000);
}

void loop() {
//讀取濕度
float h = myDHT.readHumidity();
//讀取攝氏溫度
float t = myDHT.readTemperature();
//讀取華氏溫度
float f = myDHT.readTemperature(true);

//輸出溫溼度資訊
lcd.setCursor(0, 1); // 設定游標位置在第二行行首
lcd.print("Humidity: ");
lcd.setCursor(10, 1); // 設定游標位置在第二行,11的位置
lcd.print(h);
lcd.print(" %");
lcd.setCursor(0, 2); // 設定游標位置在第三行行首
lcd.print("Temp : ");
lcd.setCursor(7, 2); // 設定游標位置在第三行,8的位置
lcd.print(t);
lcd.print(" C");
lcd.setCursor(7,3); // 設定游標位置在第三行,8的位置
lcd.print(f);
lcd.print(" F");
delay(2000);  
}