正點原子-戰艦V3第三十六章 DHT11 數字溫溼度傳感器實驗

2020-12-07 正點原子

上一章,我們介紹了數字溫度傳感器 DS18B20 的使用,本章我們將介紹數字溫溼度

傳感器DHT11 的使用,該傳感器不但能測溫度,還能測溼度。本章我們將向大家介

紹如何使用 STM32F1來讀取 DHT11 數字溫溼度傳感器,從而得到環境溫度和溼度

等信息,並把從溫溼度值顯示在TFTLCD 模塊上。本章分為如下幾個部分:

36.1 DHT11 簡介

36.2 硬體設計

36.3 軟體設計

36.4 下載驗證

36.1 DHT11 簡介

DHT11 是一款溼溫度一體化的數字傳感器。該傳感器包括一個電阻式測溼元件和一個 NTC

測溫元件,並與一個高性能 8 位單片機相連接。通過單片機等微處理器簡單的電路連接就能夠

實時的採集本地溼度和溫度。DHT11 與單片機之間能採用簡單的單總線進行通信,僅僅需要一

個 I/O 口。傳感器內部溼度和溫度數據 40Bit 的數據一次性傳給單片機,數據採用校驗和方式

進行校驗,有效的保證數據傳輸的準確性。DHT11 功耗很低,5V 電源電壓下,工作平均最大電流 0.5mA。

DHT11 的技術參數如下:

工作電壓範圍:3.3V-5.5V

工作電流 :平均 0.5mA

輸出:單總線數位訊號

測量範圍:溼度 20~90%RH,溫度 0~50℃

精度 :溼度±5%,溫度±2℃

解析度 :溼度 1%,溫度 1℃

DHT11 的管腳排列如圖 36.1.1 所示:

圖 36.1.1 DHT11 管腳排列圖

雖然 DHT11 與 DS18B20 類似,都是單總線訪問,但是 DHT11 的訪問,相對 DS18B20 來

說要簡單很多。下面我們先來看看 DHT11 的數據結構。

DHT11 數字溼溫度傳感器採用單總線數據格式。即,單個數據引腳埠完成輸入輸出雙向

傳輸。其數據包由 5Byte(40Bit)組成。數據分小數部分和整數部分,一次完整的數據傳輸為

40bit,高位先出。DHT11 的數據格式為:8bit 溼度整數數據+8bit 溼度小數數據+8bit 溫度整數

數據+8bit 溫度小數數據+8bit 校驗和。其中校驗和數據為前四個字節相加。

傳感器數據輸出的是未編碼的二進位數據。數據(溼度、溫度、整數、小數)之間應該分開

處理。例如,某次從 DHT11 讀到的數據如圖 36.1.2 所示:

圖 36.1.2 某次讀取到 DHT11 的數據

由以上數據就可得到溼度和溫度的值,計算方法:

溼度= byte4 . byte3=45.0 (%RH)

溫度= byte2 . byte1=28.0 ( ℃)

校驗= byte4+ byte3+ byte2+ byte1=73(=溼度+溫度)(校驗正確)

可以看出,DHT11的數據格式是十分簡單的,DHT11和 MCU的一次通信最大為 3ms 左右,

建議主機連續讀取時間間隔不要小於 100ms。

下面,我們介紹一下 DHT11 的傳輸時序。DHT11 的數據發送流程如圖 36.1.3 所示:

圖 36.1.3 DHT11 數據發送流程

首先主機發送開始信號,即:拉低數據線,保持 t1(至少 18ms)時間,然後拉高數據線 t2

(20~40us)時間,然後讀取 DHT11 的響應,正常的話,DHT11 會拉低數據線,保持 t3(40~50us)

時間,作為響應信號,然後 DHT11 拉高數據線,保持 t4(40~50us)時間後,開始輸出數據。

DHT11 輸出數字『0』的時序如圖 36.1.4 所示:

圖 36.1.4 DHT11 數字『0』時序

DHT11 輸出數字『1』的時序如圖 36.1.5 所示:

圖 36.1.5 DHT11 數字『1』時序

通過以上了解,我們就可以通過 STM32F1 來實現對 DHT11 的讀取了。DHT11 的介紹就到這裡,更詳細的介紹,請參考 DHT11 的數據手冊。

36.2 硬體設計

由於開發板上標準配置是沒有 DHT11 這個傳感器的,只有接口,所以要做本章的實驗,

大家必須找一個 DHT11 插在預留的 DHT11 接口上。

本章實驗功能簡介:開機的時候先檢測是否有 DHT11 存在,如果沒有,則提示錯誤。只

有在檢測到 DHT11 之後才開始讀取溫溼度值,並顯示在 LCD 上,如果發現了 DHT11,則程

序每隔 100ms 左右讀取一次數據,並把溫溼度顯示在 LCD 上。同樣我們也是用 DS0 來指示程

序正在運行。

所要用到的硬體資源如下:

1) 指示燈 DS0

2) TFTLCD 模塊

3) DHT11 溫溼度傳感器

這些我們都已經介紹過了,DHT11 和 DS18B20 的接口是共用一個的,不過 DHT11 有 4 條

腿,需要把 U6 的 4 個接口都用上,將 DHT11 傳感器插入到這個上面就可以通過 STM32F1 來

讀取溫溼度值了。連接示意圖如圖 36.2.1 所示:

圖 36.2.1 DHT11 連接示意圖

這裡要注意,將 DHT11 貼有字的一面朝內,而有很多孔的一面(網面)朝外,然後然後插入

如圖所示的四個孔內就可以了。

36.3 軟體設計

打開 DHT11 數字溫溼度傳感器實驗工程可以發現,我們在工程中添加了 dht11.c 文件和

dht11.h 文件,所有 DHT11 相關的驅動代碼和定義都在這兩個文件中。

打開 dht11.c 代碼如下:

//復位 DHT11

void DHT11_Rst(void)

{

DHT11_IO_OUT(); //SET OUTPUT

DHT11_DQ_OUT=0; //拉低 DQ

delay_ms(20); //拉低至少 18ms

DHT11_DQ_OUT=1; //DQ=1

delay_us(30); //主機拉高 20~40us

}

//等待 DHT11 的回應

//返回 1:未檢測到 DHT11 的存在

//返回 0:存在

u8 DHT11_Check(void)

u8 retry=0;

DHT11_IO_IN(); //SET INPUT

while (DHT11_DQ_IN&&retry<100) //DHT11 會拉低 40~80us

retry++;

delay_us(1);

};

if(retry>=100)return 1;

else retry=0;

while (!DHT11_DQ_IN&&retry<100) //DHT11 拉低後會再次拉高 40~80us

return 0;

//從 DHT11 讀取一個位

//返回值:1/0

u8 DHT11_Read_Bit(void)

while(DHT11_DQ_IN&&retry<100) //等待變為低電平

retry ++;

delay_ us( 1 );

retry=0;

while(!DHT11_DQ_IN&&retry<100) //等待變高電平

retry++;

delay_us(1);

delay_us(40);//等待 40us

if(DHT11_DQ_IN)return 1;

else return 0;

//從 DHT11 讀取一個字節

//返回值:讀到的數據

u8 DHT11_Read_Byte(void)

{

u8 i,dat;

dat=0;

for (i=0;i<8;i++)

dat<<=1;

dat|=DHT11_Read_Bit();

}

return dat;

//從 DHT11 讀取一次數據

//temp:溫度值(範圍:0~50°)

//humi:溼度值(範圍:20%~90%)

//返回值:0,正常;1,讀取失敗

u8 DHT11_Read_Data(u8 *temp,u8 *humi)

u8 buf[5];

u8 i;

DHT11_Rst();

if(DHT11_Check()==0)

for(i=0;i<5;i++) buf[i]=DHT11_Read_Byte();//讀取 40 位數據

if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])

*humi=buf[0];

*temp=buf[2];

}else return 1;

//初始化 DHT11 的 IO 口 DQ 同時檢測 DHT11 的存在

//返回 1:不存在

u8 DHT11_Init(void)

GPIO_InitTypeDef GPIO_Initure;

__HAL_RCC_GPIOG_CLK_ENABLE(); //開啟 GPIOG 時鐘

GPIO_Initure.Pin=GPIO_PIN_11; //PG11

GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推輓輸出

GPIO_Initure.Pull=GPIO_PULLUP; //上拉

GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH; //高速

HAL_GPIO_Init(GPIOG,&GPIO_Initure); //初始化

DHT11_Rst();

return DHT11_Check();

該部分代碼就是根據我們前面介紹的單總線操作時序來讀取 DHT11 的溫溼度值的,DHT11

的溫溼度值通過 DHT11_Read_Data 函數讀取,如果返回 0,則說明讀取成功,返回 1,則說明

讀取失敗。同樣我們打開 dht11.h 可以看到,頭文件中主要是一些埠配置以及函數申明,代碼

比較簡單。 接下來我們打開 main.c,該文件代碼如下:

int main(void)

u8 t=0;

u8 temperature;

u8 humidity;

HAL_Init(); //初始化 HAL 庫

Stm32_Clock_Init(RCC_PLL_MUL9); //設置時鐘,72M

delay_init(72); //初始化延時函數

uart_init(115200); //初始化串口

LED_Init(); //初始化 LED

KEY_Init(); //初始化按鍵

LCD_Init(); //初始化 LCD FSMC 接口

POINT_COLOR=RED;

LCD_ShowString(30,50,200,16,16,"WarShip STM32");

LCD_ShowString(30,70,200,16,16,"DHT11 TEST");

LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");

LCD_ShowString(30,110,200,16,16,"2019/9/19");

while(DHT11_Init()) //DHT11 初始化

LCD_ShowString(30,130,200,16,16,"DHT11 Error");

delay_ms(200);

LCD_Fill(30,130,239,130+16,WHITE);

LCD_ShowString(30,130,200,16,16,"DHT11 OK");

POINT_COLOR=BLUE;//設置字體為藍色

LCD_ShowString(30,150,200,16,16,"Temp: C");

LCD_ShowString(30,170,200,16,16,"Humi: %");

while(1)

if(t%10==0)//每 100ms 讀取一次

DHT11_Read_Data(&temperature,&humidity); //讀取溫溼度值

LCD_ShowNum(30+40,150,temperature,2,16); //顯示溫度

LCD_ShowNum(30+40,170,humidity,2,16); //顯示溼度

delay_ms(10);

t++;

if(t==20)

t=0;

LED0=!LED0;

主函數比較簡單,進行一系列初始化後,如果 DHT11 初始化成功,那麼每隔 100ms 讀取

一次轉換數據並顯示在液晶上。至此,我們本章的軟體設計就結束了。

36.4 下載驗證

在代碼編譯成功之後,我們通過下載代碼到 ALIENTEK 戰艦 STM32F1 開發板上,可以看

到 LCD 顯示開始顯示當前的溫度值(假定 DHT11 已經接上去了),如圖 36.4.1 所示:

圖 36.4.1 DHT11 實驗效果圖

至此,本章實驗結束。大家可以將本章通過 DHT11 讀取到的溫度值,和前一章的通過DS18B20 讀取到的溫度值對比一下,看看哪個更準確?

相關焦點

  • 正點原子-戰艦V3第三十七章 MPU6050 六軸傳感器實驗
    本章,我們介紹當下最流行的一款六軸(三軸加速度+三軸角速度(陀螺儀))傳感器:MPU6050,該傳感器廣泛用於四軸、平衡車和空中滑鼠等設計,具有非常廣泛的應用範圍。ALIENTEK 戰艦 STM32F1 開發板本身並不帶 MPU6050 傳感器,但是可以通過 ATK MODULE接口,外擴 ATK-MPU6050 模塊來實現本例程。
  • 正點原子-戰艦V3第十章 外部中斷實驗
    這一章,我們將向大家介紹如何使用 STM32F1 的外部輸入中斷。在前面幾章的學習中,我們掌握了 STM32F1 的 IO 口最基本的操作。的 IO 口在第六章有詳細介紹,而中斷管理分組管理在前面也有詳細的闡述。
  • 溫溼度傳感器原理
    >  溫溼度傳感器是指能將溫度量和溼度量轉換成容易被測量處理的電信號的設備或裝置。由於溫度與溼度不管是從物理量本身還是在實際人們的生活中都有著密切的關係,所以溫溼度一體的傳感器就會相應產生。市場上的溫溼度傳感器一般是測量溫度量和相對溼度量。
  • 溫溼度傳感器有哪些類型 溫溼度傳感器選購方法介紹【詳解】
    溫溼度傳感器是一種能夠感受到溫度和溼度並轉換為輸出信號的設備,是一種電阻類設備,在各個行業都被廣泛使用。比如最常見的中央空調系統就 是 帶有溫溼度傳感器的,空調在一定程度上可以調節溼度,通過這種傳感器,空調能夠自動了解並平衡室內的溫溼度,下面一起來了解一下。
  • 基於PXA310平臺的溫溼度傳感器設計與實現方法
    2 溫溼度傳感器電路設計比較了一些傳感器應用設計方案後,選用SHT10晶片為嵌入式溫溼度傳感器的核心部件。它外圍電路簡便,相比其他傳感器晶片(DS18B20)有其獨到優勢。STH10 每秒可進行3 次溫溼度測量,數據精度14 bit並且工作穩定。
  • 溫溼度傳感器發展現狀及前景分析
    這個時期的溫度傳感器和溼度傳感器已經算是技術發展的象徵。   幾年前,國外的溫溼度傳感器已經達到了巔峰水平,而我國由於科技的制約,只能使用進口溫溼度傳感器去彌補我國大棚溫溼度監控系統中智能化程度的不足。但是使用進口設備有很多局限性,且性價比不高。
  • 溫溼度傳感器的三種模擬量換算關係
    ,如果想及時感知空氣中溫溼度的變化,那就需要溫溼度傳感器。在日常生活中,溫溼度傳感器種類有很多,按照數據上傳方式分有RS485型溫溼度傳感器、模擬量型溫溼度傳感器、網絡型溫溼度傳感器這三種。今天主要介紹模擬量型溫溼度傳感器。
  • 溫溼度傳感器在實驗室環境調控中的應用
    實驗室是用作檢測和校準實驗的重要場所,無論是物理實驗室還是化學實驗室,環境條件對實驗都有著極為重要的影響。物理實驗室精密儀器的計量檢定,如校準標準砝碼、精密壓力表等對實驗室環境條件有著極為苛刻的要求。化學實驗室中試劑、儀器的儲存和各項化學實驗的進行,也都會不同程度受到溫溼度的影響。
  • 分析智能溫溼度傳感器發展趨勢
    打開APP 分析智能溫溼度傳感器發展趨勢 建大仁科 發表於 2021-01-08 17:09:25 早期的智能傳感器是將傳感器的輸出信號經處理和轉化後由接口送到微處理機進行運算處理
  • 關於溫溼度傳感器在實驗室環境調控中的應用
    化學實驗室中試劑、儀器的儲存和各項化學實驗的進行,也都會不同程度受到溫溼度的影響。因此,在實驗室投入使用後,實時對環境溫溼度監測就十分有必要。 實驗室溫溼度控制要求 環境條件溫溼度的控制方面考慮的要素就是保證實驗操作的環境溫溼度是能夠滿足實驗程序各個過程的需要。下面我們將從各項工作對環境溫溼度的需求、溫溼度傳感器的選擇以及如何根據設備制定監測方案等幾個方面進行展開。
  • 智能溫溼度傳感器發展趨勢:高精度、微型化
    原標題:智能溫溼度傳感器發展趨勢:高精度、微型化   早期的智能傳感器是將傳感器的輸出信號經處理和轉化後由接口送到微處理機進行運算處理。
  • 智能溫溼度傳感器的特點是什麼,它的應用有哪些
    打開APP 智能溫溼度傳感器的特點是什麼,它的應用有哪些 仁科測控 發表於 2020-11-20 15:47:21 智能溫度傳感器(亦稱數字溫度傳感器)是在20世紀90年代中期問世的。
  • 智能溫溼度傳感器的未來發展趨勢將會如何
    打開APP 智能溫溼度傳感器的未來發展趨勢將會如何 建大仁科_ 發表於 2021-01-14 15:56:56 早期的智能傳感器是將傳感器的輸出信號經處理和轉化後由接口送到微處理機進行運算處理
  • 小米溫溼度傳感器拆解:簡單得不可思議
    上月,小米帶來了一個全新的智能硬體產品小米溫溼度傳感器。外觀來看,小米溫溼度傳感器造型小巧,設計也是明顯的小米風格,可以隨意吸附在牆面、桌椅之上。
  • 深度科普——農業溫溼度傳感器中到底有什麼高科技?
    由於溫度與溼度不管是從物理量本身還是在實際人們的生活中都有著密切的關係,所以溫溼度一體的傳感器就隨之產生小馬智農帶數字顯示的溫溼度傳感器不帶數字顯示的溫溼度傳感器小馬智農485型傳感器2、網絡型溫溼度傳感器
  • 土壤溫溼度傳感器如何幫助作物度過寒潮
    所以,不止作物生長需要關注土壤的溫溼度,對棚內溫溼度的監測也需要。我們都知道,溫室大棚內我們可以使用壁掛式的溫溼度傳感器來實時監測棚內環境中的溫溼度作為調控的依據,從而為棚內作物提供適宜的生長環境,那土壤中的溫溼度又該如何監測呢?傳統的測量土壤中的溫溼度的方法是使用土壤溫度計測量土壤的溫度,然後取相對分量的土壤,使用烘乾法測量土壤溼度,來獲得準確的土壤溫溼度數據。
  • 如何選用溫溼度傳感器
    隨著時代的發展,科研、農業、暖通、機房、航空航天、電力等工業部門,越來越需要採用傳感器,對產品質量的要求越業越高,對環境溫、溼度的控制以及對工業材料水份值的監測與分析都已成為比較普遍的技術條件之一。產品及溼度測量屬於90年代興起的行業。
  • dht11溫溼度傳感器中文資料(dht11工作原理特性參數及應用電路)
    打開APP dht11溫溼度傳感器中文資料(dht11工作原理特性參數及應用電路) 發表於 2018-03-16 10:16:44
  • 溫溼度傳感器的四種數據傳輸方式
    導讀 過去幾十年以來,傳感器行業發生了天翻地覆的變化,科技和物聯網的進步導致我們傳遞數據的方式也變的更加多種多樣,各類傳感器不僅能夠實時監測數據,還可以根據相應的使用場景選擇不同的數據傳輸方式上傳至雲平臺
  • 數字手持式風速/溫溼度計(三合一)N962 檢測原理
    數字手持式風速/溫溼度計(三合一)    型號:DP-N962 產品簡介用途範圍N962型數字式微風速/溫溼度儀,是用來測量常壓下的環境氣候。適用於公共衛生、勞動衛生、環境監測等行業,測量室內風速溫溼度或相關場所。工作原理風速敏感元件(熱敏電阻)通過電流後,溫度升高,電阻值增大.當有氣流流過敏感元件時,溫度降低,阻值減小.將電阻值的變化轉換成風速量,以數字的形式進行顯示.儀器結構N962型數字式微風速溫溼度儀由主機及傳感器(探頭)兩部分組成。主機上設有電源開關,檔位切換按鍵,充電器插口,調零孔及顯示器等。