基于 DHT11 的溫濕度檢測(原理圖+代碼)


原標題:基于 DHT11 的溫濕度檢測(原理圖+代碼)
基于 DHT11 的溫濕度檢測系統
基于 DHT11 的溫濕度檢測系統是一種成本效益高且易于實現的方案,廣泛應用于環境監測、智能家居、農業大棚等領域。它能夠實時獲取當前環境的溫度和濕度數據,并通過微控制器進行處理和顯示。本設計將詳細闡述其工作原理、核心元器件的選擇與功能、完整的硬件電路圖以及相應的軟件代碼實現。
1. DHT11 溫濕度傳感器介紹
1.1 DHT11 傳感器概述
DHT11 是一款常用的數字溫濕度復合傳感器,由一顆經過校準的數字信號輸出的溫濕度傳感器和一個單片機連接。它采用專有的數字信號采集技術和溫濕度傳感技術,確保了產品的高可靠性與長期穩定性。DHT11 具有響應速度快、抗干擾能力強、性價比高等特點。
1.2 DHT11 工作原理
DHT11 內部集成了一個電容式濕度傳感器和一個 NTC(負溫度系數)熱敏電阻。
濕度測量: DHT11 采用電容式濕度傳感器。傳感器的濕度敏感材料在吸收水蒸氣后,介電常數會發生變化,導致電容值隨之變化。DHT11 內部的 ASIC(專用集成電路)會將這個電容值的變化轉換為數字信號輸出。
溫度測量: 溫度測量則利用 NTC 熱敏電阻的特性。NTC 熱敏電阻的電阻值會隨著溫度的升高而降低。DHT11 內部的 ADC(模數轉換器)會將熱敏電阻的模擬電壓信號轉換為數字信號,進而得到溫度值。
DHT11 傳感器與微控制器之間采用單總線通信方式。傳感器每次數據傳輸 40 位數據,高位在前,包括 16 位濕度數據(整數部分 8 位,小數部分 8 位)、16 位溫度數據(整數部分 8 位,小數部分 8 位)以及 8 位校驗和。校驗和用于驗證數據傳輸的正確性,即濕度整數部分 + 濕度小數部分 + 溫度整數部分 + 溫度小數部分 = 校驗和。
1.3 DHT11 主要參數
供電電壓: 3.3V - 5.5V
測量范圍:
濕度:20% - 90% RH (±5% RH)
溫度:0°C - 50°C (±2°C)
分辨率:
濕度:1% RH
溫度:1°C
響應時間: 2秒
功耗: 測量時約 2.5mA,待機時 100μA - 150μA
引腳定義:
VCC:供電電源
DATA:數據引腳(需要接上拉電阻)
NC:空引腳
GND:接地
2. 系統硬件設計與元器件選型
一個完整的基于 DHT11 的溫濕度檢測系統通常包括微控制器、DHT11 傳感器、顯示模塊以及必要的輔助電路。
2.1 微控制器(MCU)
微控制器是整個系統的核心,負責控制 DHT11 傳感器的數據讀取、處理、以及將數據顯示到屏幕上。
優選元器件型號: STMicroelectronics STM32F103C8T6 或 Arduino UNO (基于 ATmega328P)。
為什么選擇:
STM32F103C8T6: 這是一款基于 ARM Cortex-M3 內核的 32 位微控制器,具有高性能、低功耗和豐富的外設資源,如多個定時器、UART、SPI、I2C、ADC 等。它適用于需要更高處理能力和更復雜功能的項目,且其開發生態系統成熟,資料豐富。
Arduino UNO (ATmega328P): 對于初學者和簡單的項目,Arduino UNO 是一個極好的選擇。它基于 ATmega328P 8 位 AVR 微控制器,易于上手,擁有龐大的社區支持和豐富的庫函數,簡化了開發過程。其集成開發環境 (IDE) 使得編程和上傳代碼變得非常方便。
元器件功能: 微控制器負責發送啟動信號給 DHT11,等待并接收 DHT11 返回的溫濕度數據。接收到數據后,它會進行數據解析和校驗。如果校驗通過,則將溫濕度值轉換為易于理解的格式,并驅動顯示模塊進行顯示。此外,它還可以根據需要進行數據存儲、通過串口發送數據到上位機等。
2.2 顯示模塊
顯示模塊用于直觀地顯示測量到的溫度和濕度數據。
優選元器件型號: LCD1602 液晶顯示屏 或 OLED 0.96 寸顯示屏 (SSD1306)。
為什么選擇:
LCD1602: 這是一種經典的字符型液晶顯示屏,價格低廉,易于驅動,適合顯示簡單的文本信息。它通常采用并行或 I2C 接口與微控制器連接。對于只顯示溫度和濕度數值的應用來說,LCD1602 足以滿足需求。
OLED 0.96 寸顯示屏 (SSD1306): OLED 顯示屏具有自發光、高對比度、寬視角、低功耗的優點,顯示效果更佳。0.96 寸的尺寸小巧,適合集成到緊湊型設備中。它通常采用 I2C 或 SPI 接口,其中 I2C 接口連接線更少,更方便。
元器件功能: 接收微控制器發送的待顯示數據(如溫度值、濕度值),并在屏幕上以字符或圖形的形式顯示出來,為用戶提供直觀的反饋。
2.3 DHT11 溫濕度傳感器
優選元器件型號: AM2302 (DHT22) 或 DHT11。
為什么選擇:
DHT11: 對于成本敏感或對精度要求不高的應用,DHT11 是一個經濟實惠的選擇。它足夠用于日常環境監測。
AM2302 (DHT22): 如果對測量精度和范圍有更高要求,AM2302 (DHT22) 是更好的選擇。它的測量精度更高(溫度 ±0.5°C,濕度 ±2% RH),測量范圍更廣(溫度 -40°C ~ 80°C,濕度 0% ~ 99.9% RH),但價格略高于 DHT11。兩者在通信協議上高度相似,代碼兼容性好。
元器件功能: 作為核心傳感器,負責實時采集環境的溫度和濕度數據,并通過單總線協議將數字信號傳輸給微控制器。
2.4 上拉電阻
優選元器件型號: 10kΩ 電阻。
為什么選擇: DHT11 的 DATA 引腳需要連接一個上拉電阻,通常為 4.7kΩ 到 10kΩ 之間。這是因為 DHT11 的數據線在不傳輸數據時是高電平,通過上拉電阻可以確保在數據線空閑時保持高電平狀態,避免信號浮動,提高通信的穩定性。
元器件功能: 提供一個穩定的高電平,確保 DHT11 的 DATA 引腳在空閑狀態下保持高電平,便于微控制器和傳感器之間的正常通信。
2.5 其他輔助元器件
面包板或 PCB: 用于搭建電路和固定元器件。
跳線: 用于連接各個元器件。
電源: 提供系統所需的工作電壓,通常為 5V 或 3.3V。
2.6 系統硬件電路圖
下圖展示了基于 Arduino UNO 和 DHT11 以及 LCD1602 的典型連接方式。如果使用 STM32,引腳連接方式類似,但需要根據 STM32 的具體 GPIO 定義進行調整。
+-------------------+
| Arduino UNO |
| |
| 5V <-----> VCC (DHT11)
| GND <-----> GND (DHT11)
| Digital Pin X <-> DATA (DHT11) --+-- 10kΩ Resistor --+-- 5V
| |
| 5V <-----> VCC (LCD1602)
| GND <-----> GND (LCD1602)
| Digital Pin Y <-> RS (LCD1602)
| Digital Pin Z <-> EN (LCD1602)
| Digital Pin A <-> D4 (LCD1602)
| Digital Pin B <-> D5 (LCD1602)
| Digital Pin C <-> D6 (LCD1602)
| Digital Pin D <-> D7 (LCD1602)
| PWM Pin <-> Backlight (LCD1602) (可選,通過電位器或數字引腳控制亮度)
| A0 <-> RW (LCD1602) (GND或VCC,根據LCD模塊確定)
| A1 <-> VO (LCD1602) (連接電位器,調節對比度)
+-------------------+
注釋:
DHT11 DATA 引腳的上拉電阻: DHT11 的 DATA 引腳必須連接一個 10kΩ 的上拉電阻到 VCC。這對于確保單總線通信的正確性至關重要。
LCD1602 連接:
如果使用 I2C 模塊的 LCD1602,則只需要連接 SDA 和 SCL 到 Arduino 的相應 I2C 引腳(UNO 上通常是 A4 和 A5),以及 VCC 和 GND。這將大大簡化布線。
圖示為并聯模式下的連接,需要較多的 GPIO 引腳。
引腳分配: 數字引腳 X, Y, Z, A, B, C, D 均為示例,具體連接時請根據 Arduino UNO 的可用數字引腳進行選擇,并在代碼中相應配置。
3. 系統軟件設計與代碼實現
軟件部分主要包括 DHT11 傳感器的數據讀取、解析、錯誤校驗以及數據顯示。這里以 Arduino 平臺為例進行說明,因為它對 DHT11 和 LCD1602 都有成熟的庫支持,非常便于開發。
3.1 引入必要的庫文件
在 Arduino IDE 中,您需要安裝 DHT sensor library
和 LiquidCrystal
(或 LiquidCrystal_I2C
如果使用 I2C LCD) 庫。
打開 Arduino IDE。
點擊
工具
->管理庫...
。搜索
DHT sensor library
并安裝 Adafruit 公司提供的庫。搜索
LiquidCrystal
(如果使用并聯 LCD) 或LiquidCrystal_I2C
(如果使用 I2C LCD) 并安裝。
3.2 代碼示例(基于 Arduino UNO + DHT11 + I2C LCD1602)
此代碼示例假設您使用 I2C 接口的 LCD1602,這樣可以節省大量的 GPIO 引腳。
#include <Wire.h>
// 引入I2C通信庫#include <LiquidCrystal_I2C.h>
// 引入I2C LCD庫#include <DHT.h>
// 引入DHT傳感器庫
// 定義DHT11傳感器連接的數字引腳#define DHTPIN 2
// 將DHT11的數據引腳連接到Arduino的數字引腳2
// 定義DHT傳感器的類型 (DHT11, DHT22, DHT21)#define DHTTYPE DHT11
// 如果使用DHT22,請改為DHT22// 初始化DHT傳感器對象DHT dht(DHTPIN, DHTTYPE);
// 初始化I2C LCD1602對象
// 第一個參數是LCD的I2C地址,通常為0x27或0x3F,具體取決于您的LCD模塊
// 第二個參數是LCD的列數,第三個參數是LCD的行數LiquidCrystal_I2C lcd(0x27, 16, 2);
// 假設I2C地址為0x27,16列2行void setup() {
Serial.begin(9600);
// 啟動串口通信,用于調試輸出
Serial.println("DHT11 I2C LCD 溫濕度檢測系統啟動...");
dht.begin(); // 初始化DHT傳感器
lcd.init(); // 初始化LCD
lcd.backlight(); // 打開LCD背光
// 在LCD上顯示歡迎信息
lcd.setCursor(0, 0); // 設置光標到第一行第一列
lcd.print("正在初始化...");
lcd.setCursor(0, 1); // 設置光標到第二行第一列
lcd.print("請稍候...");
delay(2000); // 延時2秒
lcd.clear(); // 清空LCD屏幕}void loop() { // DHT11傳感器兩次讀數之間至少需要2秒間隔,
否則可能會讀到錯誤數據
delay(2000); // 讀取濕度數據
float h = dht.readHumidity(); // 讀取溫度數據(攝氏度)
float t = dht.readTemperature(); // 讀取溫度數據(華氏度)
// float f = dht.readTemperature(true); // 如果需要華氏度
// 檢查是否成功讀取數據
if (isnan(h) || isnan(t)) {
Serial.println("DHT傳感器讀取失敗!請檢查接線。");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("讀取失敗!");
lcd.setCursor(0, 1);
lcd.print("請檢查DHT11!"); return; // 退出當前循環,等待下次重試
} // 華氏度到攝氏度的轉換示例 (如果需要)
// float hic = dht.computeHeatIndex(t, h, false);
// float hif = dht.computeHeatIndex(f, h, true);
Serial.print("濕度: ");
Serial.print(h);
Serial.print(" % ");
Serial.print("溫度: ");
Serial.print(t);
Serial.println(" *C "); // 在LCD上顯示數據
lcd.setCursor(0, 0); // 設置光標到第一行第一列
lcd.print("濕度: ");
lcd.print(h, 1); // 顯示濕度,保留一位小數
lcd.print("% "); // 添加單位和空格,覆蓋可能殘留的字符
lcd.setCursor(0, 1); // 設置光標到第二行第一列
lcd.print("溫度: ");
lcd.print(t, 1); // 顯示溫度,保留一位小數
lcd.print((char)223); // 顯示度數符號 '°'
lcd.print("C "); // 添加單位和空格,覆蓋可能殘留的字符}
3.3 代碼詳解
#include <Wire.h>
: 包含了 Arduino I2C 通信庫,I2C LCD 模塊需要使用此庫進行通信。#include <LiquidCrystal_I2C.h>
: 包含了 I2C LCD 顯示屏的庫,提供了方便的函數來控制 LCD 顯示內容。#include <DHT.h>
: 包含了 DHT 傳感器庫,提供了讀取 DHT11/DHT22 等傳感器數據的接口。#define DHTPIN 2
: 定義了 DHT11 傳感器數據引腳連接到 Arduino 的數字引腳 2。您可以根據實際接線修改此值。#define DHTTYPE DHT11
: 定義了所使用的 DHT 傳感器類型為 DHT11。如果您使用的是 DHT22,請將其修改為DHT22
。DHT dht(DHTPIN, DHTTYPE);
: 創建一個DHT
對象,用于與 DHT 傳感器進行通信。LiquidCrystal_I2C lcd(0x27, 16, 2);
: 創建一個LiquidCrystal_I2C
對象,用于控制 LCD 顯示屏。0x27
是 I2C LCD 模塊的默認地址,有些模塊可能是0x3F
。如果您的 LCD 不顯示,請嘗試更改此地址。16
表示 LCD 有 16 列。2
表示 LCD 有 2 行。void setup()
函數:Serial.begin(9600);
: 初始化串口通信,波特率為 9600 bps。這允許您通過 Arduino IDE 的串口監視器查看調試信息。dht.begin();
: 初始化 DHT 傳感器。lcd.init();
: 初始化 LCD 屏幕。lcd.backlight();
: 打開 LCD 的背光。lcd.setCursor(0, 0);
和lcd.print();
: 在 LCD 上顯示初始歡迎信息。void loop()
函數:delay(2000);
: 這是非常重要的。DHT11 傳感器在兩次讀數之間需要至少 2 秒的間隔,否則可能會返回無效數據。float h = dht.readHumidity();
: 讀取濕度值并存儲在h
變量中。float t = dht.readTemperature();
: 讀取溫度值(攝氏度)并存儲在t
變量中。if (isnan(h) || isnan(t))
: 檢查讀取到的數據是否為無效數字(Not-a-Number)。如果dht.readHumidity()
或dht.readTemperature()
返回NaN
,則表示讀取失敗,通常是由于接線錯誤或傳感器故障。Serial.print(...)
和Serial.println(...)
: 將溫濕度數據打印到串口監視器,方便調試。lcd.setCursor(...)
和lcd.print(...)
: 將溫濕度數據顯示到 LCD 屏幕上。lcd.print(h, 1);
:h
是浮點數,, 1
表示保留一位小數。lcd.print((char)223);
:(char)223
是 LCD 字符集中表示度數符號°
的 ASCII 值。
4. 系統測試與調試
在完成硬件連接和代碼上傳后,您需要進行測試和調試以確保系統正常工作。
檢查接線: 仔細核對所有元器件的接線是否正確,特別是 DHT11 的 DATA 引腳是否連接了上拉電阻。
上傳代碼: 將上述代碼通過 Arduino IDE 上傳到您的 Arduino UNO 板。
串口監視器: 打開 Arduino IDE 的串口監視器(工具 -> 串口監視器),觀察是否有溫濕度數據輸出,以及是否有錯誤信息。
LCD 顯示: 檢查 LCD 屏幕是否正常顯示溫濕度數據。如果顯示亂碼或無顯示,請檢查 I2C 地址是否正確(對于 I2C LCD),或并聯連接是否正確(對于并聯 LCD)??梢試L試調整 LCD 上的電位器來調節對比度。
數據準確性: 將 DHT11 傳感器暴露在不同溫度和濕度的環境中,觀察數據的變化是否符合預期。例如,用手握住傳感器會使溫度升高。
5. 優化與擴展
數據存儲與分析: 可以將溫濕度數據存儲到 SD 卡,或通過網絡(例如 ESP8266/ESP32 Wi-Fi 模塊)上傳到云平臺,進行長期的數據記錄和分析。
報警功能: 根據預設的閾值,當溫度或濕度超出范圍時,可以觸發蜂鳴器、LED 燈或發送短信/郵件進行報警。
供電優化: 對于電池供電的應用,可以考慮使用更低功耗的微控制器和傳感器,并優化代碼以進入低功耗模式。
用戶界面: 可以添加按鍵,實現切換顯示模式(例如顯示最大/最小值)、校準等功能。
多傳感器: 如果需要監測多個區域的溫濕度,可以連接多個 DHT11 傳感器,但需要注意每個 DHT11 都需要獨立的 GPIO 引腳和數據讀取邏輯。
顯示升級: 如果需要更豐富的圖形界面,可以考慮使用 TFT 彩色顯示屏,但其驅動會更復雜。
6. 總結
基于 DHT11 的溫濕度檢測系統是一個典型的嵌入式應用案例,它結合了傳感器技術、微控制器編程和人機交互。通過本設計,您不僅可以實現一個實用的溫濕度監測設備,還能深入理解傳感器數據采集、數字通信協議、微控制器編程以及外部設備驅動等核心概念。選擇合適的元器件并理解其工作原理是構建穩定可靠系統的關鍵。此系統易于構建和擴展,為進一步的物聯網項目奠定了基礎。
責任編輯:David
【免責聲明】
1、本文內容、數據、圖表等來源于網絡引用或其他公開資料,版權歸屬原作者、原發表出處。若版權所有方對本文的引用持有異議,請聯系拍明芯城(marketing@iczoom.com),本方將及時處理。
2、本文的引用僅供讀者交流學習使用,不涉及商業目的。
3、本文內容僅代表作者觀點,拍明芯城不對內容的準確性、可靠性或完整性提供明示或暗示的保證。讀者閱讀本文后做出的決定或行為,是基于自主意愿和獨立判斷做出的,請讀者明確相關結果。
4、如需轉載本方擁有版權的文章,請聯系拍明芯城(marketing@iczoom.com)注明“轉載原因”。未經允許私自轉載拍明芯城將保留追究其法律責任的權利。
拍明芯城擁有對此聲明的最終解釋權。