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

2020-12-13 正點原子

上一章,我們介紹了數字溫度傳感器 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第二十二章 ADC 實驗
    關於這兩個通道組的詳細介紹,請參考《STM32 中文參考手冊》第 155 頁,第 11 章。STM32 的 ADC 可以進行很多種不同的轉換模式,這些模式在《STM32 中文參考手冊》的第 11 章也都有詳細介紹,我們這裡就不在一一列舉了。
  • ESP8266連接DHT11,開發微信小程序實時顯示溫溼度
    程序講解:在本示例中,ESP8266 有兩個角色,一個是temp(傳感器數據)主題消息的發布者,esp8266往這個主題推送消息,微信小程序就可以收到傳感器數據了。esp8266聯網後,訂閱light002,手機往這個主題推送消息,esp8266就能收到手機的控制的指令了。第二、ESP8266讀取DHT11這裡使用的是D4口。
  • 基於arduino的dht11溫溼度傳感器的使用
    DHT11溫溼度傳感器簡介   DHT11是一款有已校準數位訊號輸出的溫溼度傳感器。 其精度溼度+-5%RH, 溫度+-2℃,量程溼度20-90%RH, 溫度0~50℃。   DHT11數字溫溼度傳感器是一款含有已校準數位訊號輸出的溫溼度複合傳感器,它應用專用的數字模塊採集技術和溫溼度傳感技術,確保產品具有極高的可靠性和卓越的長期穩定性。傳感器包括一個電阻式感溼元件和一個NTC測溫元件,並與一個高性能8位單片機相連接。因此該產品具有品質卓越、超快響應、抗幹擾能力強、性價比極高等優點。每個DHT11傳感器都在極為精確的溼度校驗室中進行校準。
  • 溫溼度傳感器在冰箱溫溼度怎麼進行監控
    一般家用冰箱要求溫溼度傳感器溫度監測範圍為-30℃~50℃,工廠冷凍機溫度測量範圍為-40°C~100°C,精度為±0.2°C。溫溼度傳感器的溼度測量範圍一般為0%至100%RH,精度為±2%RH。操作人員可以再溫溼度傳感器監控系統中設定溫溼度上限和下限值。
  • LabVIEW+Arduino之溫溼度數據採集
    #include <SimpleDHT.h> //引入函數庫頭文件「SimpleDHT.h」int pinDHT22 = 2;  //將2號引腳定義為溫溼度傳感器的信號引腳float temperature = 0;  //定義一個浮點型變量「temperature」並初始化為0float humidity = 0;  //定義一個浮點型變量
  • 溫溼度傳感器在實驗室環境調控中的應用
    實驗室是用作檢測和校準實驗的重要場所,無論是物理實驗室還是化學實驗室,環境條件對實驗都有著極為重要的影響。物理實驗室精密儀器的計量檢定,如校準標準砝碼、精密壓力表等對實驗室環境條件有著極為苛刻的要求。化學實驗室中試劑、儀器的儲存和各項化學實驗的進行,也都會不同程度受到溫溼度的影響。
  • 溫溼度傳感器的三種模擬量換算關係
    ,如果想及時感知空氣中溫溼度的變化,那就需要溫溼度傳感器。在日常生活中,溫溼度傳感器種類有很多,按照數據上傳方式分有RS485型溫溼度傳感器、模擬量型溫溼度傳感器、網絡型溫溼度傳感器這三種。今天主要介紹模擬量型溫溼度傳感器。
  • 小米溫溼度傳感器拆解:簡單得不可思議
    上月,小米帶來了一個全新的智能硬體產品小米溫溼度傳感器。外觀來看,小米溫溼度傳感器造型小巧,設計也是明顯的小米風格,可以隨意吸附在牆面、桌椅之上。
  • 在你心中,溫溼度傳感器是什麼樣的?
    科技的進步,讓眾多對環境溫溼度有特定需求的場景有了更便捷的管理方式,像通信機房、智能家居、醫藥行業、冷鏈運輸、倉庫、酒窖、溫室大棚、孵化基地等場所都需要溫溼度傳感器來採集數據,進行科學高效的管理、分析和控制。
  • 應用於室內空氣監測儀中的溫溼度傳感器
    導讀 室內空氣監測儀可實現365天,24小時連續監測室內甲醛,PM2.5,CO₂,TVOC和溫溼度,是一款多功能空氣品質檢測儀。
  • 溫溼度傳感器在病房護理室環境溫溼度值檢測中的應用
    打開APP 溫溼度傳感器在病房護理室環境溫溼度值檢測中的應用 御風傳感 發表於 2020-12-11 09:33:24 姜彧在病房樓建築醫療衛生標準研究中,對室內微生物、氣溶膠可吸入顆粒、揮發性化學物質進行了研究,總結出各類有害物質在不同溼度值下的含量,得出在較低的室溫下,溼度控制在30%~50%範圍內時,室內的有害物質較少。由此可以得出,病房樓建築的熱環境需要重點在溫溼度方面作出應對,儘量減少微生物等汙染物的生長繁殖,同時通過室內外通風將汙染物及時排出室外。
  • 溫溼度傳感器供應,請認準優質供應商Apollo!有量有價!
    溼度傳感器/溫溼度傳感器/溫溼度變送器是指能夠直接將溼度和溫度兩個基本的物理信號直接轉化為電信號的裝置。我們公司能夠提供從溫溼度傳感元件到溫溼度傳感模塊、溫溼度傳感變送器等一系列產品;能夠為客戶提供最佳的溫溼度測量的解決方案。其中包含的主要產品有:溼度傳感器、溫度傳感器,溼敏電容傳感器,溫溼度模塊,溫溼度變送器,溫溼度數字輸出模塊,溫溼度探頭等。
  • dht11溫溼度傳感器中文資料(dht11工作原理特性參數及應用電路)
    打開APP dht11溫溼度傳感器中文資料(dht11工作原理特性參數及應用電路) 發表於 2018-03-16 10:16:44
  • 如何挑選一款稱心如意的溫溼度傳感器?
    仁科測控 發表於 2020-05-26 16:15:14 俗話說得好:好用的溫溼度傳感器千篇一律,順心如意的溫溼度傳感器萬一挑一。
  • SENSOR CHINA 2020:中科銀河芯發布溫溼度傳感器晶片
    中科銀河芯展位其中,國內領先的模擬IC設計與產品服務商——中科銀河芯,攜其溫度、溫溼度一體、單總線等系列產品亮相展館,並首次發布了具有獨立智慧財產權的溫溼度一體傳感系列晶片。經測試,該晶片性能與現階段國際上溫溼度傳感器的最高水準相比肩,晶片具有性能優良、體積小、速度快、功耗低等特點。可直接實現國際大廠溫溼度晶片替換,從而打破溫溼度晶片被國外廠家高度壟斷的局面。
  • 無線溫溼度傳感器M35發布_新品發布_新聞中心_RFID世界網
    隨著社會的不斷進步,人們對環境溫溼度監測要求也越來越高。為適應科研及工業應用對溫溼度精度、採樣頻率、傳輸距離、體積等多方面的要求。牧坤科技研發人員全新設計和開發了M35無線溫溼度傳感器。  M35無線溫溼度傳感器採用數字無線技術平臺,先進的一體化、微型化封裝技術,將無線溫度傳感器直接安裝在電纜接頭、閘刀觸點、開關觸點、實現溫度、溫升和相間溫差的高可靠實時在線監測。傳輸頻率使用工業無線頻率2.4Ghz傳輸方式,傳輸距離可達200米,精度為0.2度,最高可達50Khz的超高採集速率的。內置進口電鋰池,使用壽命最高長達5年(每30秒採集1次,可使用2年)。
  • 用於HVAC暖通空調通風管道中溫溼度檢測的溫溼度傳感器
    空調供應冷氣、暖氣或除溼的作用原理均類似,利用冷媒在壓縮機的作用下,發生蒸發或凝結,從而引發周遭空氣的蒸發或凝結,以達到改變溫、溼度的目的。暖通空調系統可以控制空氣的溫度及溼度,提高室內的舒適度,是中大型工業建築或辦公建築(如摩天樓)中重要的一環。在現代的建築中,上述機能(包括其控制系統,及系統的設計及安裝)會整合在一個或多個的暖通空調系統中。針對小型的建築,承包商會直接依需求選擇暖通空調系統及設備。
  • 家裡有了無線智能溫溼度傳感器,是種什麼體驗
    導讀 溫溼度是一個基本的物理量,自然界中的一切過程無不與溫溼度密切相關。溫度傳感器是最早開發,應用最廣的一類傳感器。
  • 正點原子開拓者FPGA開發板資料連載第十八章 VGA彩條顯示實驗
    1)實驗平臺:正點原子開拓者FPGA 開發板2)摘自《開拓者FPGA開發指南》關注官方微信號公眾號,獲取更多資料:正點原子3)全套實驗源碼+手冊+視頻下載地址:http://www.openedv.com/thread-13912-1-1.html