Arduino UNO + DHT11 + OLED:溫濕度即時顯示完整教學(含程式碼)

在物聯網(IoT)與智慧環境監測的應用中,溫濕度數據是最常被收集的環境資訊之一。而使用 Arduino UNO 搭配 DHT11 溫濕度感測器 和 128×64 OLED 顯示器,可以輕鬆打造一個即時顯示溫濕度的迷你氣象站。本教學將帶你一步步完成這個專案,無論你是 Arduino 新手還是有基礎經驗的開發者,都能順利實作。

在本篇文章中,我們將介紹 DHT11 感測器與 OLED 顯示器的基本原理,並透過 Arduino 程式碼讀取溫濕度數據,並顯示在 OLED 螢幕上。此外,我們還會教你如何安裝相關的函式庫,確保設備能夠順利運作。這個專案不僅能幫助你熟悉 Arduino 的感測與顯示應用,還可以作為進一步開發 智慧家庭、氣象站或環境監測系統 的基礎。

現在,讓我們開始這個有趣的 DIY 專案,透過 Arduino UNO 來實現溫濕度的即時監測吧!

  1. Arduino UNO x 1
  2. DHT11 x 1
  3. 128 x 64 OLED x 1
  4. 麵包板 x 1
  5. 公公杜邦線 x 數條
  6. 公母杜邦線 x 數條

推薦優良店家(UCI電子):https://s.shopee.tw/3VWLkrBsZs

DHT11模組連結:https://s.shopee.tw/706DvOrjxE

128×64 OLED連結:https://s.shopee.tw/7fLuihvQqT

DHT11 & OLED實驗材料

DHT11 溫濕度感測器與 OLED 顯示器介紹

  • DHT11 溫濕度感測器
    DHT11 是一款常見的數位溫濕度感測器,適用於各種環境監測應用。它內建溫度與濕度感測單元,並透過單線數據通訊(Single-Wire Protocol)將測量結果傳輸至 Arduino。
    DHT11 主要特點:
    • 測量範圍:
      • 溫度:0°C ~ 50°C(±2°C)
      • 濕度:20% ~ 90% RH(±5% RH)
    • 工作電壓:3.3V ~ 5V
    • 通訊方式:單線數據傳輸,適合與 Arduino 連接
    • 更新頻率:約 1 秒回傳一次數據

DHT11 的價格便宜且使用簡單,因此廣泛應用於 DIY 專案,如智慧家庭、環境監測與氣象站等。

  • 128×64 OLED 顯示器
    OLED(Organic Light-Emitting Diode)顯示器是一種自發光螢幕,具有高對比度與低功耗的特性。128×64 像素的 OLED 顯示器使用 I2C 或 SPI 通訊,可與 Arduino 進行輕量級的資料傳輸,適合顯示文字、圖形和即時數據。
    OLED 顯示器的優勢:
    • 解析度高(128×64 像素),適合顯示數據與圖形
    • 視角廣、對比度高,在低光環境下仍清晰可見
    • 低功耗,適合電池供電的物聯網專案

I2C 介面,簡化接線,減少 Arduino 的 GPIO 佔用本專案將使用 I2C 版本的 128×64 OLED,搭配 DHT11,透過 Arduino UNO 讀取環境溫濕度數據並即時顯示在螢幕上。接下來,我們將進一步說明如何接線並撰寫程式來讀取與顯示數據!

接線方式:Arduino UNO 連接 DHT11 和 128x64 OLED

DHT11_OLED_接線圖
Arduino_I2C接線說明圖
Arduino_I2C接線說明圖

安裝 Arduino 所需函式庫(DHT & Adafruit SSD1306)

安裝DHT函式庫

步驟 1:打開函式庫管理員

1. 在 Arduino IDE 內,點擊左方選單”函式庫管理員”介面後,會看到許多可用的 Arduino 函式庫。

步驟 2:搜尋並安裝 Simpledht 函式庫

1. 在右上角的搜尋框輸入 “Simpledht”。
2. 找到 “Simple DHT”,這是由 Winlin提供的函式庫,支援 DHT11、DHT22 等感測器。
3. 點擊 「安裝」(Install),等待安裝完成。

步驟 3:確認函式庫安裝成功
安裝完成後,點擊 「範例」(File > Examples),應該可以看到 Simple DHT相關的範例程式碼。如果可以開啟並編譯,代表函式庫已經安裝成功!

SimpleDHT函式庫
DHT11範例程式

安裝SSD1306函式庫

步驟 1:打開函式庫管理員

1. 在 Arduino IDE 內,點擊左方選單”函式庫管理員”介面後,會看到許多可用的 Arduino 函式庫。

步驟 2:搜尋並安裝SSD1306函式庫

1. 在右上角的搜尋框輸入 “SSD1306”。
2. 找到 “SSD1306”,這是由 Adafruit官方提供的函式庫。
3. 點擊 「安裝」(Install),等待安裝完成。

步驟 3:確認函式庫安裝成功
安裝完成後,點擊 「範例」(File > Examples),應該可以看到 SSD1306相關的範例程式碼。如果可以開啟並編譯,代表函式庫已經安裝成功!

SSD1306範例程式

安裝U8glib字型

步驟 1:打開函式庫管理員

  1. 在 Arduino IDE 內,點擊左方選單”函式庫管理員”介面後,會看到許多可用的 Arduino 函式庫。

步驟 2:搜尋並安裝 U8glib 函式庫

  1. 在右上角的搜尋框輸入 “U8glib”。
  2. 找到 “U8glib”,這是由 oliver 提供的函式庫。
  3. 點擊 「安裝」(Install),等待安裝完成。

步驟 3:確認函式庫安裝成功

安裝完成後,點擊 「範例」(File > Examples),應該可以看到 U8glib相關的範例程式碼。如果可以開啟並編譯,代表函式庫已經安裝成功!

U8glib函式庫

撰寫 Arduino 程式:讀取 DHT11 數據並在 OLED 顯示

				
					//使用 U8glib
#include "U8glib.h"
#include <SimpleDHT.h>

//OLED 初使化設定
//目前OLED常用驅動晶片有 SSD1306 或 SH1106

//SSD1306
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE | U8G_I2C_OPT_DEV_0);

//SH1106
// U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE | U8G_I2C_OPT_DEV_0);

int pinDHT11 = 7;
SimpleDHT11 dht11(pinDHT11);

byte temperature = 0;
byte humidity = 0;

void setup(void) {
  //設定字型
  u8g.setFont(u8g_font_unifont);
}
void loop(void) {
  //顯示
  u8g.firstPage();  //開始更新顯示內容
  do {
    draw();
  } while (u8g.nextPage());  //完成更新顯示內容

  delay(50);

  int err = SimpleDHTErrSuccess;
  if ((err = dht11.read(&temperature, &humidity, NULL)) != SimpleDHTErrSuccess) {
    return;
  }
}
void draw(void) {
  //輸出字串(x座標,y座標,文字)
  u8g.drawStr(0, 30, "Temture:");
  u8g.setPrintPos(75, 30);
  u8g.print(temperature);
  u8g.drawStr(92, 30, "C");
  //輸出字串(x座標,y座標,文字)
  u8g.drawStr(0, 50, "Humidity:");
  u8g.setPrintPos(75, 50);
  u8g.print(humidity);
  u8g.drawStr(92, 50, "%");
}
				
			
OLED_Size

在 SimpleDHT 範例程式中,我們將 SSD1306 和 U8glib 函式庫整合,讓 DHT11 讀取的溫濕度數據顯示在 OLED 上。

在程式的 第 40 行,u8g.drawStr(x座標, y座標, 文字); 用於設定文字在 OLED 螢幕上的顯示位置。第 41 行 則負責顯示 DHT11 讀取的溫度與濕度數據。

為了讓其他函數能夠存取這些數據,需將變數 byte temperature = 0; 和 byte humidity = 0; 移至 loop 外部,使其成為全域變數,確保程式的可讀性與模組化,讓不同函數都能使用這些數據。

上傳程式並測試結果

程式上傳至 Arduino UNO 後,系統開始讀取 DHT11 感測器的溫濕度數據,並即時在 128×64 OLED 顯示器上顯示。經過多次測試,以下是觀察到的結果:

  1. OLED 正常顯示
    當程式運行後,OLED 顯示器成功點亮,並在設定的位置顯示「溫度」與「濕度」的標籤,接著數據開始更新,確保 DHT11 正常運作。
  2. DHT11 數據回應穩定
    室溫條件下,DHT11 感測器測得的溫度約為 25°C ~ 28°C,濕度約為 50% ~ 60% RH,數值變化符合環境變動。
    感測間隔約為 1 秒更新一次,與官方規格相符。
  3. 數據更新流暢
    OLED 顯示的溫濕度數據每秒更新一次,畫面穩定無閃爍,說明 U8glib 函式庫與 DHT11 讀取機制相容良好,數據能即時刷新。

結論

透過本篇教學,我們成功使用 Arduino UNO 搭配 DHT11 溫濕度感測器 和 128×64 OLED 顯示器,實現了一個能即時顯示環境數據的簡易氣象站。從硬體接線、函式庫安裝、程式撰寫到實際測試,每個步驟都確保數據能穩定讀取並準確顯示在 OLED 上。

本專案不僅幫助初學者熟悉 Arduino 感測器應用,也提供了一個良好的基礎,讓進階使用者能進一步擴充功能。例如,可以加入 數據記錄與歷史曲線顯示,或搭配 Wi-Fi 模組(如 ESP8266)將數據傳送到雲端,打造更完整的物聯網應用。

此外,若想提升專案的實用性,可以考慮使用 DHT22 感測器 來獲取更精確的溫濕度數據,或改用 更大尺寸的 OLED 顯示器 來呈現更多資訊。這些改進都能讓專案更加多元,適用於智慧家庭、農業環境監測或教學應用。

希望這篇文章能幫助你順利完成專案,並激發你更多創意!如果你有任何問題或改進想法,歡迎在留言區討論,共同交流學習!

參考資料:

Arduino UNO官網I2C資料:https://docs.arduino.cc/learn/communication/wire/

BLOCK 網誌:https://www.block.tw/blog/oled/

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

返回頂端