[DIY] 智慧家庭氣象觀測站
作者:Aven 日期:2016-07-03 00:17
這樣的需求,首選的工具當然就是用 Arduino 來擔綱囉,以下是演員陣容:
▼ 主要控制板 Arduino UNO。
▼ 溫溼度偵測元件 DHT11。
▼ 因為只要顯示溫溼度等資訊,所以 LCD 選擇便宜的 1602 就足夠使用。
▼ 這是LCD背面接腳,會選擇 I2C 是因為只要 4 條杜邦線就可以完成連接。
▼ 如果想要能透過網路連線查詢即時狀態,則需要再加一張 W5100 Ethernet 擴充板。
▼ 所有演員大集合,準備開工拜拜。
單機版家庭氣象觀測站
▼ 單機板家庭氣象站接線圖,第一次畫不太熟練,找不到 DHT11 元件 拿 RHT03 充當
▼ 實際接線圖,接得有點混亂,請多包涵
▼ 單機版程式碼
#include <LiquidCrystal_I2C.h> #include <dht11.h> #include <Wire.h> LiquidCrystal_I2C lcd(0x27, 16, 2); dht11 DHT11; const byte dataPin = 2; void setup() { // put your setup code here, to run once: lcd.init(); lcd.backlight(); } void loop() { // put your main code here, to run repeatedly: int chk = DHT11.read(dataPin); if(chk == 0) { lcd.setCursor(4,0); lcd.print("Temp"); lcd.setCursor(0,1); lcd.print("Humidity"); lcd.setCursor(9,0); lcd.print((float)DHT11.temperature, 2); lcd.print((char) 0xDF); lcd.print("C"); lcd.setCursor(9,1); lcd.print((float)DHT11.humidity, 2); lcd.print("%"); } else { lcd.clear(); lcd.print("Error code:"); lcd.print(chk); } delay(5000); }
▼ 開機後,會將 DHT11 偵測出來的溫溼度數據顯示在 LCD 畫面
網路版家庭氣象觀測站
單機板似乎只能單機作業眼見為憑,還不如加上網路功能,讓遠端也能透過網路監看家裡的溫溼度狀況,所以以前述的單機板為基礎,我們再加上一片 W5100 Ethernet 擴充板,即可升級為網路版家庭氣象站。
▼ 在 Arduino UNO 上再堆疊一片 W5100,即可擁有網路版的功能。
▼ 網路版程式碼
#include <LiquidCrystal_I2C.h> #include <dht11.h> #include <Wire.h> #include <SPI.h> #include <Ethernet.h> LiquidCrystal_I2C lcd(0x27, 16, 2); byte mac[] = { 0xF0, 0x7B, 0xCB, 0x4B, 0x7C, 0x9F }; dht11 DHT11; const byte dataPin = 2; EthernetServer server(80); void setup() { // put your setup code here, to run once: lcd.init(); lcd.backlight(); Ethernet.begin(mac); } void loop() { // put your main code here, to run repeatedly: char buffer[5] = ""; int chk = DHT11.read(dataPin); IPAddress ip = Ethernet.localIP(); EthernetClient client = server.available(); if (client) { while (client.connected()) { if (client.available()) { client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println(); client.println("<!doctype html>"); client.println("<html>"); client.println("<meta charset="utf-8" />"); client.println("<meta http-equiv='Refresh' CONTENT='30'>"); client.println("<title>智慧家庭氣象觀測站"); client.println("</head>"); client.print("溫度:"); client.print(dtostrf(DHT11.temperature, 5, 2, buffer)); client.print("°C<br>"); client.print("溼度:"); client.print(dtostrf(DHT11.humidity, 5, 2, buffer)); client.print("%"); client.println("</body>"); break; } } delay(1); client.stop(); } lcd.setCursor(0,0); lcd.print(ip); if(chk == 0) { lcd.setCursor(0,1); lcd.print(dtostrf(DHT11.temperature, 5, 2, buffer)); lcd.print((char) 0xDF); lcd.print("C"); lcd.setCursor(8,1); lcd.print(dtostrf(DHT11.humidity, 5, 2, buffer)); lcd.print("%"); } else { lcd.clear(); lcd.print("Error code:"); lcd.print(chk); } delay(5000); }
▼ 開機後,W5100 會啟動 DHCP 功能取得一組可用的 IP,並顯示在 LCD 上,第二列才會顯示目前的溫度及溼度。
▼ 有了 IP,可以方便透過瀏覽器讀取目前的溫溼度狀態。
▼ 透過 VPN 連線,甚至可以在辦公室遠端連線回來查看家裡的溫溼度資訊。
後記
這樣的實作花費大概台幣 500 元上下就能擁有,程式碼也很簡單易學,後續可延伸的方向:1.透過 MRTG 功能可以定時記錄家裡溫溼度的變化。2.改成無線網路,讓偵測點不受限於網路線。3.增加繼電器,可以設定條件自動開啟或關閉家電,例如設定溫度達 25 度自動開啟電風扇,溼度達 80% 開啟除溼機等等,當然也可透過網路遠端控制開關。4.增加其他監控功能,例如瓦斯偵測、PM2.5偵測等等,這樣的 DIY 只要有創意就會有樂趣。
備註:為讓顯示順利,程式碼中的"<"字元皆使用全形符號,使用時請自行替換。