a片在线观看免费看视频_欧美婬片在线a_同性男男无遮挡无码视频_久久99狠狠色精品一区_《性妲己》电影在线观看_久久久99婷婷久久久久久_亚洲精品久久久久58_激情在线成人福利小电影_色婷婷久久综合五月激情网

0 賣盤信息
BOM詢價
您現在的位置: 首頁 > 技術方案 >工業控制 > 基于 DHT11 的溫濕度檢測(原理圖+代碼)

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

來源: 電路城
2021-11-17
類別:工業控制
eye 47
文章創建人 拍明

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

基于 DHT11 的溫濕度檢測系統


基于 DHT11 的溫濕度檢測系統是一種成本效益高且易于實現的方案,廣泛應用于環境監測、智能家居、農業大棚等領域。它能夠實時獲取當前環境的溫度和濕度數據,并通過微控制器進行處理和顯示。本設計將詳細闡述其工作原理、核心元器件的選擇與功能、完整的硬件電路圖以及相應的軟件代碼實現。

image.png

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 STM32F103C8T6Arduino 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 libraryLiquidCrystal (或 LiquidCrystal_I2C 如果使用 I2C LCD) 庫。

  1. 打開 Arduino IDE。

  2. 點擊 工具 -> 管理庫...。

  3. 搜索 DHT sensor library 并安裝 Adafruit 公司提供的庫。

  4. 搜索 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 代碼詳解

  1. #include <Wire.h>: 包含了 Arduino I2C 通信庫,I2C LCD 模塊需要使用此庫進行通信。

  2. #include <LiquidCrystal_I2C.h>: 包含了 I2C LCD 顯示屏的庫,提供了方便的函數來控制 LCD 顯示內容。

  3. #include <DHT.h>: 包含了 DHT 傳感器庫,提供了讀取 DHT11/DHT22 等傳感器數據的接口。

  4. #define DHTPIN 2: 定義了 DHT11 傳感器數據引腳連接到 Arduino 的數字引腳 2。您可以根據實際接線修改此值。

  5. #define DHTTYPE DHT11: 定義了所使用的 DHT 傳感器類型為 DHT11。如果您使用的是 DHT22,請將其修改為 DHT22。

  6. DHT dht(DHTPIN, DHTTYPE);: 創建一個 DHT 對象,用于與 DHT 傳感器進行通信。

  7. LiquidCrystal_I2C lcd(0x27, 16, 2);: 創建一個 LiquidCrystal_I2C 對象,用于控制 LCD 顯示屏。

    • 0x27 是 I2C LCD 模塊的默認地址,有些模塊可能是 0x3F。如果您的 LCD 不顯示,請嘗試更改此地址。

    • 16 表示 LCD 有 16 列。

    • 2 表示 LCD 有 2 行。

  8. 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 上顯示初始歡迎信息。

  9. 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. 系統測試與調試

在完成硬件連接和代碼上傳后,您需要進行測試和調試以確保系統正常工作。

  1. 檢查接線: 仔細核對所有元器件的接線是否正確,特別是 DHT11 的 DATA 引腳是否連接了上拉電阻。

  2. 上傳代碼: 將上述代碼通過 Arduino IDE 上傳到您的 Arduino UNO 板。

  3. 串口監視器: 打開 Arduino IDE 的串口監視器(工具 -> 串口監視器),觀察是否有溫濕度數據輸出,以及是否有錯誤信息。

  4. LCD 顯示: 檢查 LCD 屏幕是否正常顯示溫濕度數據。如果顯示亂碼或無顯示,請檢查 I2C 地址是否正確(對于 I2C LCD),或并聯連接是否正確(對于并聯 LCD)??梢試L試調整 LCD 上的電位器來調節對比度。

  5. 數據準確性: 將 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)注明“轉載原因”。未經允許私自轉載拍明芯城將保留追究其法律責任的權利。

拍明芯城擁有對此聲明的最終解釋權。

相關資訊

拍明芯城微信圖標

各大手機應用商城搜索“拍明芯城”

下載客戶端,隨時隨地買賣元器件!

拍明芯城公眾號
拍明芯城抖音
拍明芯城b站
拍明芯城頭條
拍明芯城微博
拍明芯城視頻號
拍明
廣告
恒捷廣告
廣告
深亞廣告
廣告
原廠直供
廣告