在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

您好,歡迎來電子發燒友網! ,新用戶?[免費注冊]

您的位置:電子發燒友網>電子元器件>傳感器>

DHT11的使用注意事項 - 全文

2018年01月26日 14:27 網絡整理 作者: 用戶評論(0

  DHT11數字溫度傳感器是一款含有已校準數字信號輸出的溫濕度復合傳感器。它應用專用的數字模塊采集技術和溫濕度傳感技術,確保產品具有極高的可靠性與卓越的長期穩定性。傳感器包括一個電阻式感濕元件和一個NTC測溫元件,并與一個8位單片機相連接。該產品具有通信便捷、超快響應、抗干擾能力強等優點。每個DHT11傳感器都在OTP內存中存入了在濕度校驗室中獲得的校準系數。校準系數以程序的形式儲存,在傳感器內部在檢測信號的處理過程中要調用這些校準系數。單總線串行接口,僅需1個I/O口即可實現對溫度和濕度的同時測量,使系統集成變得簡易快捷,小體積、低功耗,信號傳輸距離遠(20米以上),使其成為一種溫濕度測量原件的不錯選擇。產品外觀如圖所示

  DHT11傳感器性能參數

DHT11的使用注意事項

  備注:由圖一,傳感器引腳順序從左到右依次為VCC,DAT,NC,GND,DHT11的供電電壓為3-5.5V。傳感器上電后,要等待1s以越過不穩定狀態在此期間無需發送任何指令。電源引腳(VDD,GND)之間可增加一個100nF的電容用以去耦濾波。

  DHT11傳感器電氣特性

  測量條件:VDD=5V,T=25℃

DHT11的使用注意事項

  DHT11封裝形式及接口說明

  建議連接線長度短于20米時用5K上拉電阻,大于20米時根據實際情況使用合適的上拉電阻(若購買的是已集成的模塊,模塊上已加上拉電阻,以下請忽略),當然,如果你想要精簡電路的話,STC增強型單片機自帶的推挽輸出功能不失為一個選擇,其相當于外接了一個2k的上拉電阻,但在設計電路時需注意:整個單片機的電流推薦不超過55mA,即從MCU-VCC流入的電流不超過55mA,從MCU-GND流出的電流不超過55mA,整體流入、流出電流均不超過55mA,封裝尺寸及典型應用電路圖如圖所示。

DHT11的使用注意事項
DHT11的使用注意事項

  DHT11使用舉例

  一、所需器材

  arduinoUNO、面包板、DHT11溫濕度傳感器、連接線

  這里說一下DHT11的基本情況:

  (1)引腳說明:

  1、VDD供電3.5V-5.5VDC

  2、DATA串行數據,單總線

  3、GND接地,電源負極。

  (2)DHT11data數據格式:

  一次傳輸40位數據=8bit濕度整數數據+8bit濕度小數數據+8bint溫度整數數據+8bit溫度小數數據+8bit校驗位

  3、時序圖

DHT11的使用注意事項

  二、DHT11連接圖

DHT11的使用注意事項

  如圖所示,將DHT11的正極與5V電源接口相連,負極與GND相連,中間的數據接口與2號引腳相連。

  三、代碼詳解

  #include《dht11.h》

  dht11DHT11;

  #defineDHT11PIN2

  voidsetup(){

  Serial.begin(9600);

  }

  voidloop(){

  Serial.println(“/n”);

  intchk=DHT11.read(DHT11PIN);

  Serial.print(“Readsensor:”);

  switch(chk)

  {

  caseDHTLIB_OK:

  Serial.println(“OK”);

  break;

  caseDHTLIB_ERROR_CHECKSUM:

  Serial.println(“Checksumerror”);

  break;

  caseDHTLIB_ERROR_TIMEOUT:

  Serial.println(“Timeouterror”);

  break;

  default:

  Serial.println(“Unknownerror”);

  break;

  }

  Serial.print(“Humidity(%):”);

  Serial.println((float)DHT11.humidity,2);

  Serial.print(“Temperature(oC):”);

  Serial.println((float)DHT11.temperature,2);

  delay(2000);

  }

  四、DHT11使用注意事項

  1、代碼中引用了#include《dht11.h》,這個是操作DHT11的庫文件,有了它,就可以輕松操作我們這個溫濕度傳感器了。但是引用這個庫文件的操作步驟是:

  (1)在網上找到并下載該庫文件,包括一個頭文件和一個.cpp文件。

  (2)在arduinoIDE中點擊菜單:程序–導入庫–addlibrary,然后選擇你存放庫文件的那個文件夾。

  (3)在代碼中引用#include《dht11.h》,這樣就可以使用了。

  2、#defineDHT11PIN2,表示定義引腳2的名字為DHT11PIN,注意這個定義語句后面沒有分號。

  五、DHT11原理分析

  在硬件編程過程中,當你拿到一個器件,首先要了解他的引腳定義,這會告訴你這個東西應該怎么連接,在一個就是要看他的時序圖,看了時序圖你就知道主從設備之間進行數據采集過程中的代碼應該怎么寫,比如怎么啟動,如何握手,怎么采集真正的數據等等。

  在我們這個試驗中,DHT11的時序圖是這樣的:

DHT11的使用注意事項

  下面對照dht11.cpp源代碼說說我們采集溫濕度信息的原理(在代碼中加了注釋,說明相關內容。):

  #include“dht11.h”

  intdht11::read(intpin)

  {

  //BUFFERTORECEIVE

  uint8_tbits[5];//這里定義了5個八位的數組,也就是40位數據,用來存儲數據采集的結果。

  uint8_tcnt=7;//這個是用來給每一個數據的每一位輸入值時計數用的。

  uint8_tidx=0;//這個是給5個數組計數用的。

  //EMPTYBUFFER

  for(inti=0;i《5;i++)bits[i]=0;

  //首先在這里把這5個八位的數組全部填0,也就是初始值為0.

  //REQUESTSAMPLE

  pinMode(pin,OUTPUT);

  //將引腳定義為輸出,也就是由arduino給DHT11寫數據。從上面的時序圖可以看出,要啟動DHT11首先要給他發送18毫秒的低電平,再發送20~40微秒的高電平,DHT11只有看到了這樣的信號,才會采集數據。

  digitalWrite(pin,LOW);

  delay(18);//這里就是發送18毫秒的低電平

  digitalWrite(pin,HIGH);

  delayMicroseconds(40);//這里就是發送40微秒的高電平

  pinMode(pin,INPUT);

  //發送完之后,這就等于把DHT11啟動了,這時候我們就要從這個引腳上接受數據了,所以這時候要將這個引腳定義為輸入引腳。

  //ACKNOWLEDGEorTIMEOUT

  unsignedintloopCnt=10000;

  while(digitalRead(pin)==LOW)

  if(loopCnt--==0)returnDHTLIB_ERROR_TIMEOUT;

  //從時序圖中可以看出,接受數據一開始首先要讀取80微秒的低電平,這里是一個等待,要把這80微秒等過去,但是有時候也有可能是傳感器出現了故障,他一直發低電平,如果你持續等待不就相當于死機了,所以在這里要設置一個超時,也就是說要等待,但時間長了,就認為出問題了,返回一個異常信息

  loopCnt=10000;

  while(digitalRead(pin)==HIGH)

  if(loopCnt--==0)returnDHTLIB_ERROR_TIMEOUT;

  //從時序圖中可以看出,在80微秒的低電平之后是80微秒的高電平,這里仍然要等待,超時的原理與上面的低電平一樣。

  //READOUTPUT-40BITS=》5BYTESorTIMEOUT

  //根據時序圖,從下面開始就是40位的真正要讀取的數據了,那么這里用了一個for循環來一位一位的讀取這40bit的數據(注意是bite)。

  for(inti=0;i《40;i++)

  {

  //根據時序圖,可以看出,對于每一個bite位數據,都是由一個低電平和一個高電平組成,區分這一位數據是1還是0取決于高電平的時常,如果高電平的時常為70微秒則表示1,如果高電平的時常為26~28微秒則表示0,因此讀取每一位數據時,都是先等待把50微秒的低電平等過去,然后判斷高電平的時常,根據這個時常來判斷這bite的數據是1還是0.

  loopCnt=10000;

  while(digitalRead(pin)==LOW)

  if(loopCnt--==0)returnDHTLIB_ERROR_TIMEOUT;

  //這一句就是要把低電平等過去。

  unsignedlongt=micros();

  //這里使用函數micros()獲取了一個當前的時間,就是為了比較高電平的時常用的。

  loopCnt=10000;

  while(digitalRead(pin)==HIGH)

  if(loopCnt--==0)returnDHTLIB_ERROR_TIMEOUT;

  //這里就把高電平讀出來了。

  if((micros()-t)》40)bits[idx]|=(1《《cnt);

  //然后再次使用micros()函數獲取當前時間,減去讀取高電平之前的時間點,也就是這個高電平的時常了,然后看這個時常是否大于40微秒,如果大于就認為是1,否則就認為這位是0.那么這里又是怎么運算的呢?分析下:bits[idx]表示一個8位的數組,假設他是00000000,運算符“|=”表示按位進行或運算,然后再把運算的結果賦給運算符左邊的變量。而(1《《cnt)表示把數字1的二進制表示法向左移動cnt位,移動后的空位用0來填充。因此,對于一個八位的1可以表示為:00000001,剛才的初始化過程中我們知道cnt的值為7,所以,把這個00000001左移七位就變成了:10000000.然后將這個數與00000000進行|=運算,之后bits[idx]中的值就是10000000。可見這段代碼實現的功能就是如果的到的這位數據是1,就將他存儲到bits[idx]相應的位上去。

  //下面這段代碼就是在循環的過程中修改cnt和idx的值,然后進行一位一位的讀數而已。

  if(cnt==0)//nextbyte?

  //cnt為0表示一個8位的數組已經裝滿了,要換到下一個八位的數組上去,于是就把cnt復原為7,idx++讓idx直到bits的下一個八位的數組上去。

  {

  cnt=7;//restartatMSB

  idx++;//nextbyte!

  }

  elsecnt--;

  //如果cnt不為0就表示這個八位的數據還沒有讀完,這時只需要讓cnt-1,來填充下一位數據就可以了。

  //注意,在初始化的過程中我們把這40位的數據都初始化為0了,所以只有當有1出現時才需要進行改變。

  }

  //WRITETORIGHTVARS

  //asbits[1]andbits[3]areallwayszerotheyareomittedinformulas.

  //從開始的時候的原理中我們知道這40位數據第1個8位是濕度的整數部分,第3個8位是溫度的整數部分,下面這兩句代碼就是把數據分別放在這兩個變量里了。

  humidity=bits[0];

  temperature=bits[2];

  uint8_tsum=bits[0]+bits[2];

  if(bits[4]!=sum)returnDHTLIB_ERROR_CHECKSUM;

  returnDHTLIB_OK;

  //最后再用校驗和驗證一下數據是否正確。

  }

  //

  //ENDOFFILE

  //

  六、運行結果

  通電之后,在電腦上打開串口就可以看到采集到的溫濕度信息。

DHT11的使用注意事項

上一頁12全文

非常好我支持^.^

(102) 100%

不好我反對

(0) 0%

( 發表人:姚遠香 )

      發表評論

      用戶評論
      評價:好評中評差評

      發表評論,獲取積分! 請遵守相關規定!

      ?
      主站蜘蛛池模板: 四虎国产视频 | 狠狠色丁香婷婷综合久久片 | 成年女人毛片免费视频 | 天天操天天干天天舔 | 天天视频免费入口 | 老师受年下高h男 | 天堂资源最新版在线官网 | 久久婷婷丁香 | 欧美乱妇高清无乱码 | 天天综合天天做天天综合 | 老师您的兔子好软水好多动漫视频 | 9久热久re爱免费精品视频 | 久操青青| 午夜老司机福利 | h视频在线观看免费网站 | 亚洲精品在线视频 | 色琪琪一本到影院 | 久久奈| 成人午夜网址 | 婷婷四房综合激情五月性色 | 福利看片 | 国产精品久久久久久久免费 | 美女把尿口扒开让男人桶出水 | 在线小毛片 | 欧美黄色录像视频 | 色多多在线看 | 青草久操| 亚洲激情视频网 | 在线观看免费黄视频 | 日本毛片在线观看 | 国产精品激情综合久久 | 4455永久在线毛片观看 | 欧美性另类 | 99久久免费午夜国产精品 | 在线欧美三级 | 网站在线观看视频 | 女女色综合影院 | 精品四虎免费观看国产高清午夜 | 日本69sex护士www | 色老头免费视频 | 亚洲国产tv|