女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

您好,歡迎來(lái)電子發(fā)燒友網(wǎng)! ,新用戶?[免費(fèi)注冊(cè)]

您的位置:電子發(fā)燒友網(wǎng)>電子元器件>傳感器>

代碼詳解 - DHT11的使用注意事項(xiàng)

2018年01月26日 14:27 網(wǎng)絡(luò)整理 作者: 用戶評(píng)論(0

  三、代碼詳解

  #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使用注意事項(xiàng)

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

  (1)在網(wǎng)上找到并下載該庫(kù)文件,包括一個(gè)頭文件和一個(gè).cpp文件。

  (2)在arduinoIDE中點(diǎn)擊菜單:程序–導(dǎo)入庫(kù)–addlibrary,然后選擇你存放庫(kù)文件的那個(gè)文件夾。

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

  2、#defineDHT11PIN2,表示定義引腳2的名字為DHT11PIN,注意這個(gè)定義語(yǔ)句后面沒(méi)有分號(hào)。

  五、DHT11原理分析

  在硬件編程過(guò)程中,當(dāng)你拿到一個(gè)器件,首先要了解他的引腳定義,這會(huì)告訴你這個(gè)東西應(yīng)該怎么連接,在一個(gè)就是要看他的時(shí)序圖,看了時(shí)序圖你就知道主從設(shè)備之間進(jìn)行數(shù)據(jù)采集過(guò)程中的代碼應(yīng)該怎么寫(xiě),比如怎么啟動(dòng),如何握手,怎么采集真正的數(shù)據(jù)等等。

  在我們這個(gè)試驗(yàn)中,DHT11的時(shí)序圖是這樣的:

DHT11的使用注意事項(xiàng)

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

  #include“dht11.h”

  intdht11::read(intpin)

  {

  //BUFFERTORECEIVE

  uint8_tbits[5];//這里定義了5個(gè)八位的數(shù)組,也就是40位數(shù)據(jù),用來(lái)存儲(chǔ)數(shù)據(jù)采集的結(jié)果。

  uint8_tcnt=7;//這個(gè)是用來(lái)給每一個(gè)數(shù)據(jù)的每一位輸入值時(shí)計(jì)數(shù)用的。

  uint8_tidx=0;//這個(gè)是給5個(gè)數(shù)組計(jì)數(shù)用的。

  //EMPTYBUFFER

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

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

  //REQUESTSAMPLE

  pinMode(pin,OUTPUT);

  //將引腳定義為輸出,也就是由arduino給DHT11寫(xiě)數(shù)據(jù)。從上面的時(shí)序圖可以看出,要啟動(dòng)DHT11首先要給他發(fā)送18毫秒的低電平,再發(fā)送20~40微秒的高電平,DHT11只有看到了這樣的信號(hào),才會(huì)采集數(shù)據(jù)。

  digitalWrite(pin,LOW);

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

  digitalWrite(pin,HIGH);

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

  pinMode(pin,INPUT);

  //發(fā)送完之后,這就等于把DHT11啟動(dòng)了,這時(shí)候我們就要從這個(gè)引腳上接受數(shù)據(jù)了,所以這時(shí)候要將這個(gè)引腳定義為輸入引腳。

  //ACKNOWLEDGEorTIMEOUT

  unsignedintloopCnt=10000;

  while(digitalRead(pin)==LOW)

  if(loopCnt--==0)returnDHTLIB_ERROR_TIMEOUT;

  //從時(shí)序圖中可以看出,接受數(shù)據(jù)一開(kāi)始首先要讀取80微秒的低電平,這里是一個(gè)等待,要把這80微秒等過(guò)去,但是有時(shí)候也有可能是傳感器出現(xiàn)了故障,他一直發(fā)低電平,如果你持續(xù)等待不就相當(dāng)于死機(jī)了,所以在這里要設(shè)置一個(gè)超時(shí),也就是說(shuō)要等待,但時(shí)間長(zhǎng)了,就認(rèn)為出問(wèn)題了,返回一個(gè)異常信息

  loopCnt=10000;

  while(digitalRead(pin)==HIGH)

  if(loopCnt--==0)returnDHTLIB_ERROR_TIMEOUT;

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

  //READOUTPUT-40BITS=》5BYTESorTIMEOUT

  //根據(jù)時(shí)序圖,從下面開(kāi)始就是40位的真正要讀取的數(shù)據(jù)了,那么這里用了一個(gè)for循環(huán)來(lái)一位一位的讀取這40bit的數(shù)據(jù)(注意是bite)。

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

  {

  //根據(jù)時(shí)序圖,可以看出,對(duì)于每一個(gè)bite位數(shù)據(jù),都是由一個(gè)低電平和一個(gè)高電平組成,區(qū)分這一位數(shù)據(jù)是1還是0取決于高電平的時(shí)常,如果高電平的時(shí)常為70微秒則表示1,如果高電平的時(shí)常為26~28微秒則表示0,因此讀取每一位數(shù)據(jù)時(shí),都是先等待把50微秒的低電平等過(guò)去,然后判斷高電平的時(shí)常,根據(jù)這個(gè)時(shí)常來(lái)判斷這bite的數(shù)據(jù)是1還是0.

  loopCnt=10000;

  while(digitalRead(pin)==LOW)

  if(loopCnt--==0)returnDHTLIB_ERROR_TIMEOUT;

  //這一句就是要把低電平等過(guò)去。

  unsignedlongt=micros();

  //這里使用函數(shù)micros()獲取了一個(gè)當(dāng)前的時(shí)間,就是為了比較高電平的時(shí)常用的。

  loopCnt=10000;

  while(digitalRead(pin)==HIGH)

  if(loopCnt--==0)returnDHTLIB_ERROR_TIMEOUT;

  //這里就把高電平讀出來(lái)了。

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

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

  //下面這段代碼就是在循環(huán)的過(guò)程中修改cnt和idx的值,然后進(jìn)行一位一位的讀數(shù)而已。

  if(cnt==0)//nextbyte?

  //cnt為0表示一個(gè)8位的數(shù)組已經(jīng)裝滿了,要換到下一個(gè)八位的數(shù)組上去,于是就把cnt復(fù)原為7,idx++讓idx直到bits的下一個(gè)八位的數(shù)組上去。

  {

  cnt=7;//restartatMSB

  idx++;//nextbyte!

  }

  elsecnt--;

  //如果cnt不為0就表示這個(gè)八位的數(shù)據(jù)還沒(méi)有讀完,這時(shí)只需要讓cnt-1,來(lái)填充下一位數(shù)據(jù)就可以了。

  //注意,在初始化的過(guò)程中我們把這40位的數(shù)據(jù)都初始化為0了,所以只有當(dāng)有1出現(xiàn)時(shí)才需要進(jìn)行改變。

  }

  //WRITETORIGHTVARS

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

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

  humidity=bits[0];

  temperature=bits[2];

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

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

  returnDHTLIB_OK;

  //最后再用校驗(yàn)和驗(yàn)證一下數(shù)據(jù)是否正確。

  }

  //

  //ENDOFFILE

  //

  六、運(yùn)行結(jié)果

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

DHT11的使用注意事項(xiàng)

非常好我支持^.^

(102) 100%

不好我反對(duì)

(0) 0%

( 發(fā)表人:姚遠(yuǎn)香 )

      發(fā)表評(píng)論

      用戶評(píng)論
      評(píng)價(jià):好評(píng)中評(píng)差評(píng)

      發(fā)表評(píng)論,獲取積分! 請(qǐng)遵守相關(guān)規(guī)定!

      ?