發布日期:2022-10-09 點擊率:116
一、器材?
arduino UNO、面包板、DHT11溫濕度傳感器、連接線?
這里說一下DHT11的基本情況:?
(1)引腳說明:?
1、VDD 供電 3.5V-5.5V DC?
2、DATA 串行數據,單總線?
3、GND 接地,電源負極。?
(2)DHT11data數據格式:?
一次傳輸40位數據=8bit濕度整數數據 + 8bit濕度小數數據 + 8bint溫度整數數據 + 8bit溫度小數數據 + 8bit校驗位?
3、時序圖?
二、連接圖?
?
如圖所示,將DHT11的正極與5V電源接口相連,負極與GND相連,中間的數據接口與2號引腳相連。?
三、代碼
四、注意事項?
1、代碼中引用了,這個是操作DHT11的庫文件,有了它,就可以輕松操作我們這個溫濕度傳感器了。但是引用這個庫文件的操作步驟是:?
(1)在網上找到并下載該庫文件,包括一個頭文件和一個.cpp文件。?
(2)在arduinoIDE中點擊菜單:程序–導入庫–add library,然后選擇你存放庫文件的那個文件夾。?
(3)在代碼中引用,這樣就可以使用了。?
2、#define DHT11PIN 2,表示定義引腳2的名字為DHT11PIN ,注意這個定義語句后面沒有分號。?
五、原理分析?
在硬件編程過程中,當你拿到一個器件,首先要了解他的引腳定義,這會告訴你這個東西應該怎么連接,在一個就是要看他的時序圖,看了時序圖你就知道主從設備之間進行數據采集過程中的代碼應該怎么寫,比如怎么啟動,如何握手,怎么采集真正的數據等等。?
在我們這個試驗中,DHT11的時序圖是這樣的:?
下面對照dht11.cpp源代碼說說我們采集溫濕度信息的原理(在代碼中加了注釋,說明相關內容。):
六、運行結果?
通電之后,在電腦上打開串口就可以看到采集到的溫濕度信息。?
0.參考資料
Amomcu CC2540資料 基礎例程 DHT11
數字溫濕度傳感器DHT11 雁凌電子 說明書最新版
引腳
DHT11溫濕度傳感器引腳
通信
串口,單線雙向
一次通訊時間4ms左右
總體概覽
用戶MCU發送一次開始信號后——》DHT11從低功耗模式轉換到高速模式
等待主機開始信號結束后,DHT11發送響應信號,送出40bit的數據,并觸發一次信號采集,
采集數據后轉換到低速模式
通訊過程圖
開始信號
總線空閑狀態為高電平
主機把總線拉低(大于18毫秒,保證DHT11能檢測到)等待DHT11響應,
DHT11接收到主機的開始信號后,等待主機開始信號結束(主機拉高并延時等待),然后發送80us低電平響應信號.
主機發送開始信號結束后,延時等待20-40us后, 讀取DHT11的響應信號,(如果讀取響應信號為高電平,則DHT11沒有響應,請檢查線路是否連接正常.)
image.png
主機發送開始信號后,可以切換到輸入模式,或者輸出高電平均可, 總線由上拉電阻拉高。
數據格式
數據分小數部分和整數部分
當前小數部分用于以后擴展,現讀出為零.
一次完整的數據傳輸為40bit,高位先出。
數據格式:
8bit濕度整數數據+
8bit濕度小數數據+
8bi溫度整數數據+
8bit溫度小數數據+
8bit校驗和
數據傳送正確時校驗和數據等于“8bit濕度整數數據+8bit濕度小數數據+8bi溫度整數數據+8bit溫度小數數據”
所得結果的末8位。
數據傳輸
每一bit數據都以50us低電平時隙開始,
高電平的長短決定了數據位是0還是1.
0:26us~28us
1:70us
當最后一bit數據傳送完畢后,DHT11拉低總線50us,
隨后總線由上拉電阻拉高進入空閑狀態。
數字0信號表示方法
數字1信號表示方法
代碼
main.c
DHT11.H
DHT11.C
DHT11概述
DHT11數字溫濕度傳感器是一款含有已校準數字信號輸出的溫濕度復合傳感器。它應用專用的數字模塊采集技術和溫濕度傳感技術,確保產品具有極高的可靠性與卓越的長期穩定性。傳感器包括一個電阻式感濕元件和一個NTC測溫元件,并與一個高性能8位單片機相連接。因此該產品具有品質卓越、超快響應、抗干擾能力強、性價比極高等優點。每個DHT11傳感器都在極為精確的濕度校驗室中進行校準。校準系數以程序的形式儲存在OTP內存中,傳感器內部在檢測信號的處理過程中要調用這些校準系數。單線制串行接口,使系統集成變得簡易快捷。超小的體積、極低的功耗,信號傳輸距離可達20米以上,使其成為各類應用甚至最為苛刻的應用場合的最佳選則。產品為4針單排引腳封裝。連接方便,特殊封裝形式可根據用戶需求而提供。
DHT11引腳說明
1、傳感器性能說明
2、接口說明
建議連接線長度短于20米時用5K上拉電阻,大于20米時根據實際情況使用合適的上拉電阻。
3、電源引腳
DHT11的供電電壓為3-5.5V。傳感器上電后,要等待1s以越過不穩定狀態在此期間無需發送任何指令。電源引腳(VDD,GND)之間可增加一個100nF的電容,用以去耦濾波。
4、串行接口(單線雙向)
DATA用于微處理器與DHT11之間的通訊和同步,采用單總線數據格式,一次通訊時間4ms左右,數據分小數部分和整數部分,具體格式在下面說明,當前小數部分用于以后擴展,現讀出為零。操作流程如下:
一次完整的數據傳輸為40bit,高位先出。
數據格式:8bit濕度整數數據+8bit濕度小數數據+8bi溫度整數數據+8bit溫度小數數據+8bit校驗和
數據傳送正確時校驗和數據等于“8bit濕度整數數據+8bit濕度小數數據+8bi溫度整數數據+8bit溫度小數數據”所得結果的末8位。
用戶MCU發送一次開始信號后,DHT11從低功耗模式轉換到高速模式,等待主機開始信號結束后,DHT11發送響應信號,送出40bit的數據,并觸發一次信號采集,用戶可選擇讀取部分數據。從模式下,DHT11接收到開始信號觸發一次溫濕度采集,如果沒有接收到主機發送開始信號,DHT11不會主動進行溫濕度采集。采集數據后轉換到低速模式。
總線空閑狀態為高電平,主機把總線拉低等待DHT11響應,主機把總線拉低必須大于18毫秒,保證DHT11能檢測到起始信號。DHT11接收到主機的開始信號后,等待主機開始信號結束,然后發送80us低電平響應信號。主機發送開始信號結束后,延時等待20-40us后,讀取DHT11的響應信號,主機發送開始信號后,可以切換到輸入模式,或者輸出高電平均可,總線由上拉電阻拉高。
在我們剛開始進入單片機的學習中,練習寫傳感器的時序是必不可少的,其實我比較推薦大家剛開始練習的時候使用DHT11來練習。
推薦的原因:
因為DHT11的時序簡單。DHT11是國產的,全中文的參考手冊,不用擔心英文看不懂。功能少,就只有一個測量溫濕度的功能。
綜上,因此DHT11我認為是非常適合剛開始入門單片機的朋友學習的。
?
那么在使用傳感器前,我們必須要先看數據手冊,并不需要全部瀏覽,我們只需要看他重要的點,就OK了。
這就是DHT11溫濕度傳感器的外觀,我們了解一下就好。
?
接下來我們看一起DHT11的參數特性
用紅框圈出來的,就是重點,我們必須知道,這個DHT11溫濕度傳感器的測量范圍,以及精度、分辨率。如果超出了這個范圍,那么DHT11就不能夠使用了。
接下來看一下引腳說明。 ? ? ? ? ? ?我們要注意的是:這個器件使用的是單總線協議是總所周知的了,但是他的供電范圍我們也需要了解一下,范圍是3.5-5.5v。如果超出這個范圍,傳感器可能會燒、假如低于這個范圍,可能傳感器會讀出錯誤的溫濕度數據或者壓根就罷工了。 ? 因此,我們在使用那些3.3v單片機做編程的時候,就要注意這一點了。
這個是數據手冊上顯示的DHT11典型的電路連接方法,我們再數據口上要接上一個上拉電阻。供電所使用的為7805的穩壓電源,也就是5V。實際上,只要我們滿足他的供電電壓范圍,都是能夠工作的。
接下來我們看一下它的數據格式(重點)
? ? ? ? DHT11用的是單總線協議,一次傳送40位的數據。 ? ? 注意了,看到這一句話,也就是說我們每次讀取DHT11的數據時,都要一次性讀取40次,也就是讀取40位。并且數據前16位是與濕度相關的,中間16位是與溫度相關的,最后八位是用來校驗的,當我們校驗成功后,證明這一次的溫濕度結果正確的,我們單片機就可以使用這個溫濕度值;如果校驗不通過,那么就代表我們這次讀取出來的溫濕度值,是錯誤的(也許是我們的時序錯誤了,也許是傳感器的問題),我們不進行采樣。
? ? ? ? 同時呢,商家的數據手冊還給出了一個校驗數據的示例圖,而且還是全中文的,所以說我說的沒錯吧,這個器件是真的簡單到不能再簡單了,非常適合新手入門練習如何寫時序。
? ? ? ? DHT11的總體通信流程。第一步:主機先發送開始信號,從機會返回一個相應信號進行應答。 ? ?第二步:主機信號線拉高準備接收數據。 ? ?第三部:開始接收數據(一次接收40位)。
那么這個就是一個人數據讀取的一個流程,那么我們每一個流程又應該怎么做呢?
?
步驟一:DHT11 上電后(DHT11 上電后要等待 1S 以越過不穩定狀態在此期間不能發送任何指令),測試環境
溫濕度數據,幵記錄數據,同時 DHT11 的 DATA 數據線由上拉電阻拉高一直保持高電平;此時 DHT11 的
DATA 引腳處于輸入狀態,時刻檢測外部信號。
步驟二:微處理器的 I/O 設置為輸出同時輸出低電平,且低電平保持時間不能小于 18ms,然后微處理器的 I/O
設置為輸入狀態,由于上拉電阻,微處理器的 I/O 即 DHT11 的 DATA 數據線也隨之變高,等待 DHT11 作
出回答信號,發送信號如圖所示:
步驟三:DHT11 的 DATA 引腳檢測到外部信號有低電平時,等待外部信號低電平結束,延遲后 DHT11 的 DATA
引腳處于輸出狀態,輸出 80 微秒的低電平作為應答信號,緊接著輸出 80 微秒的高電平通知外設準備接
收數據,微處理器的 I/O 此時處于輸入狀態,檢測到 I/O 有低電平(DHT11 回應信號)后,等待 80 微秒
的高電平后的數據接收,發送信號如圖所示:
?
步驟四:由 DHT11 的 DATA 引腳輸出 40 位數據,微處理器根據 I/O 電平的變化接收 40 位數據,位數據“0”
的格式為: 50 微秒的低電平和 26-28 微秒的高電平,位數據“1”的格式為: 50 微秒的低電平加 70
微秒的高電平。位數據“0”、“1”格式信號如圖所示:
(我們可以把這一段的時序理解為,我們主機先把數據線拉低50us,然后延時等待40us,然后再去讀取信號線的電平,如果為低電平,則為位“0”;如果為高電平,則為位“1”)。
結束信號:DHT11 的 DATA 引腳輸出 40 位數據后,繼續輸出低電平 50 微秒后轉為輸入狀態,由于上拉電阻隨
之變為高電平。但 DHT11 內部重測環境溫濕度數據,幵記錄數據,等待外部信號的到來。
我們在數據手冊上了解的就這么多就可以了。
?
同時,我自己也對DHT11的時序做了一個總結
一. 單片機上點后1s內不讀取(不重要)
二. 主機(單片機)發送起始信號:1.主機先拉高data。2.拉低data延遲18ms。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 3.拉高data(單片機引腳設置為輸入)。
? ? ? ? ? ? ? ?
三. 從機(DHT11)收到起始信號后進行應答:
? ?從機拉低data,主機讀取到data線被拉低持續80us后從機拉高data線,
? ?持續80us,直到高電平結束,意味著主機可以開始接受數據。
?
四. 主機開始接收數據:
? ?1.主機先把data線拉高(io設置為輸入)。
? ?2.從機把data線拉低,主機讀取data線電平,直到低電平結束(大約50us)
? ?從機拉高data線后,延遲40us左右(28~70us之間)主機再次讀取data線
? ?電平,如果為低電平,則為“0”,如果為高電平,則為“1”。
? ?3.繼續重復上述1,2步驟累計40次。
五. data線拉低50us代表讀取結束
六. 校驗數據
?
那么我們在程序上應該如何設計呢?(這里我的程序是基于stm32微處理器來講解的,其他單片機也一樣的操作,時序都是相同的)
?
準備階段我們先要有3個函數,數據引腳初始化函數,還有數據引腳切換輸入輸出方向的函數。
接下來我們就再寫一個函數,來讀取dht11數據即可
只要按照上述的時序步驟來操作,就能夠讀取出DHT11的溫濕度值啦。
同時我們要注意,只有讀出來的數據校驗通過了,我們才使用這一次的溫濕度數據。
還有他讀取出來40位數據的數據結構: 8位濕度整數數據+8位濕度小數數據+8位溫度整數數據+8位溫度小數數據+8位校驗位
下一篇: PLC、DCS、FCS三大控
上一篇: 電氣控制線路圖控制原