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

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

詳解DHT11數(shù)字溫濕度傳感器實驗

2018年10月07日 11:43 網(wǎng)絡(luò)整理 作者:工程師譚軍 用戶評論(0
  數(shù)字傳感器
?
  數(shù)字傳感器是指將傳統(tǒng)的模擬式傳感器經(jīng)過加裝或改造A/D轉(zhuǎn)換模塊,使之輸出信號為數(shù)字量(或數(shù)字編碼)的傳感器,主要包括:放大器、A/D轉(zhuǎn)換器、微處理器CPU)、存儲器、通訊接口、溫度測試電路等,在微處理器和傳感器變得越來越便宜的今天,全自動或半自動(通過人工指令進(jìn)行高層次操作,自動處理低層次操作)系統(tǒng)可以包含更多智能性功能,能從其環(huán)境中獲得并處理更多不同的參數(shù)
?
  特點
?
  1、先進(jìn)的A/D轉(zhuǎn)換技術(shù)和智能濾波算法,在滿量程的情況下仍可保證輸出碼的穩(wěn)定。
?
  2、可行的數(shù)據(jù)存儲技術(shù),保證模塊參數(shù)不會丟失。
?
  3、良好的電磁兼容性能。
?
  4、傳感器的性能采用數(shù)字化誤差補(bǔ)償技術(shù)和高度集成化電子元件,用軟件實現(xiàn)傳感器的線性、零點、溫漂、蠕變等性能參數(shù)的綜合補(bǔ)償,消除了人為因素對補(bǔ)償?shù)挠绊?,大大提高了傳感器綜合精度和可靠性。
?
  5、傳感器的輸出一致性誤差可以達(dá)到0.02%以內(nèi)甚至更高,傳感器的特性參數(shù)可完全相同,因而具有良好的互換性。
?
  6、采用A/D轉(zhuǎn)換電路、數(shù)字化信號傳輸和數(shù)字濾波技術(shù),傳感器的抗干擾能力增加,信號傳輸距離遠(yuǎn),提高了傳感器的穩(wěn)定性。
?
  7、數(shù)字傳感器能自動采集數(shù)據(jù)并可預(yù)處理、存儲和記憶,具有唯一標(biāo)記,便于故障診斷。
?
  8、傳感器采用標(biāo)準(zhǔn)的數(shù)字通訊接口,可直接連入計算機(jī),也可與標(biāo)準(zhǔn)工業(yè)控制總線連接,方便靈活。
?
  9, 數(shù)字傳感器是將AD,EPROM,DIE(指還未封裝的傳感器芯片,屬于裸片,大小介于cell和chip之間),封裝在一塊用PCB,金屬塊或陶瓷板上的集成。通過各種溫度,壓力點的校準(zhǔn),計算出DIE的線性,再利用AD去補(bǔ)償?shù)姆椒庸ざ傻摹?/div>
?
  應(yīng)用及前景
?
  在微處理器和傳感器變得越來越便宜的今天,全自動或半自動(通過人工指令進(jìn)行高層次操作,自動處理低層次操作)系統(tǒng)可以包含更多智能性功能,能從其環(huán)境中獲得并處理更多不同的參數(shù)。尤其是MEMS(微型機(jī)電系統(tǒng))技術(shù),它使數(shù)字傳感器的體積非常微小并且能耗與成本也很低。以納米碳管或其它納米材料制成的納米傳感器同樣具有巨大的潛力 [1] 。
?
  即使在萌芽階段,人們?nèi)匀徽J(rèn)為在不久的將來數(shù)字傳感器對電子市場具有重要的推動作用。制作數(shù)字傳感器的接口以及支持用于數(shù)字傳感器網(wǎng)絡(luò)的形式多樣的通訊協(xié)議都是對技術(shù)工藝的巨大挑戰(zhàn)。傳感器的非均質(zhì)特性和其操作條件的多樣化也對技術(shù)工藝提出了巨大的挑戰(zhàn)。
?
  現(xiàn)在系統(tǒng)設(shè)計所包含的傳感器和處理器越來越多。隨著傳感器和處理器價格的不斷降低,取代機(jī)械控制結(jié)構(gòu)的閾值也在不斷變化。在系統(tǒng)中選擇正確的傳感器組合和處理算法可以顯著地降低原材料及能耗的費用并提高系統(tǒng)的總體性能。目前,不斷提高操作的簡化程度和延長能源的使用壽命變得越來越重要,尤其是如今越來越多的傳感器網(wǎng)絡(luò)動輒就配置1000或更多的傳感器節(jié)點。

  DHT11是一款濕溫度一體化的數(shù)字傳感器。該傳感器包括一個電阻式測濕元件和一個NTC測溫元件,并與一個高性能8位單片機(jī)相連接。通過單片機(jī)等微處理器簡單的電路連接就能夠?qū)崟r的采集本地濕度和溫度。DHT11與單片機(jī)之間能采用簡單的單總線進(jìn)行通信,僅僅需要一個I/O口。傳感器內(nèi)部濕度和溫度數(shù)據(jù)40Bit的數(shù)據(jù)一次性傳給單片機(jī),數(shù)據(jù)采用校驗和方式進(jìn)行校驗,有效的保證數(shù)據(jù)傳輸?shù)臏?zhǔn)確性。DHT11功耗很低,5V電源電壓下,工作平均最大電流0.5mA。

  DHT11的技術(shù)參數(shù)如下:

  l 工作電壓范圍:3.3V-5.5V

  l 工作電流 :平均0.5mA

  l 輸出:單總線數(shù)字信號

  l 測量范圍:濕度20~90%RH,溫度0~50℃

  l 精度 :濕度±5%,溫度±2℃

  l 分辨率 :濕度1%,溫度1℃

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

  圖36.1.1 DHT11管腳排列圖

  雖然DHT11與DS18B20類似,都是單總線訪問,但是DHT11的訪問,相對DS18B20來說要簡單很多。下面我們先來看看DHT11的數(shù)據(jù)結(jié)構(gòu)。

  DHT11數(shù)字濕溫度傳感器采用單總線數(shù)據(jù)格式。即,單個數(shù)據(jù)引腳端口完成輸入輸出雙向傳輸。其數(shù)據(jù)包由5Byte(40Bit)組成。數(shù)據(jù)分小數(shù)部分和整數(shù)部分,一次完整的數(shù)據(jù)傳輸為40bit,高位先出。DHT11的數(shù)據(jù)格式為:8bit濕度整數(shù)數(shù)據(jù)+8bit濕度小數(shù)數(shù)據(jù)+8bit溫度整數(shù)數(shù)據(jù)+8bit溫度小數(shù)數(shù)據(jù)+8bit校驗和。其中校驗和數(shù)據(jù)為前四個字節(jié)相加。

  傳感器數(shù)據(jù)輸出的是未編碼的二進(jìn)制數(shù)據(jù)。數(shù)據(jù)(濕度、溫度、整數(shù)、小數(shù))之間應(yīng)該分開處理。例如,某次從DHT11讀到的數(shù)據(jù)如圖36.1.2所示:

  圖36.1.2 某次讀取到DHT11的數(shù)據(jù)

  由以上數(shù)據(jù)就可得到濕度和溫度的值,計算方法:

  濕度= byte4 。 byte3=45.0 (%RH)

  溫度= byte2 。 byte1=28.0 ( ℃)

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

  可以看出,DHT11的數(shù)據(jù)格式是十分簡單的,DHT11和MCU的一次通信最大為3ms左右,建議主機(jī)連續(xù)讀取時間間隔不要小于100ms。

  下面,我們介紹一下DHT11的傳輸時序。DHT11的數(shù)據(jù)發(fā)送流程如圖36.1.3所示:

  圖36.1.3 DHT11數(shù)據(jù)發(fā)送流程

  首先主機(jī)發(fā)送開始信號,即:拉低數(shù)據(jù)線,保持t1(至少18ms)時間,然后拉高數(shù)據(jù)線t2(20~40us)時間,然后讀取DHT11的相應(yīng),正常的話,DHT11會拉低數(shù)據(jù)線,保持t3(40~50us)時間,作為響應(yīng)信號,然后DHT11拉高數(shù)據(jù)線,保持t4(40~50us)時間后,開始輸出數(shù)據(jù)。

  DHT11輸出數(shù)字‘0’的時序如圖36.1.4所示:

  圖36.1.4 DHT11數(shù)字‘0’時序

  DHT11輸出數(shù)字‘1’的時序如圖36.1.5所示:

  圖36.1.5 DHT11數(shù)字‘1’時序

  通過以上了解,我們就可以通過STM32來實現(xiàn)對DHT11的讀取了。DHT11的介紹就到這里,更詳細(xì)的介紹,請參考DHT11的數(shù)據(jù)手冊。

  36.2 硬件設(shè)計

  由于開發(fā)板上標(biāo)準(zhǔn)配置是沒有DHT11這個傳感器的,只有接口,所以要做本章的實驗,大家必須找一個DHT11插在預(yù)留的DHT11接口上。

  本章實驗功能簡介:開機(jī)的時候先檢測是否有DHT11存在,如果沒有,則提示錯誤。只有在檢測到DHT11之后才開始讀取溫濕度值,并顯示在LCD上,如果發(fā)現(xiàn)了DHT11,則程序每隔100ms左右讀取一次數(shù)據(jù),并把溫濕度顯示在LCD上。同樣我們也是用DS0來指示程序正在運(yùn)行。

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

  1) 指示燈DS0

  2) TFTLCD模塊

  3) DHT11溫濕度傳感器

  這些我們都已經(jīng)介紹過了,DHT11和DS18B20的接口是共用一個的,不過DHT11有4條腿,需要把U13的4個接口都用上,將DHT11傳感器插入到這個上面就可以通過STM32來讀取溫濕度值了。連接示意圖如圖36.2.1所示:

  圖36.2.1 DHT11連接示意圖

  這里要注意,將DHT11貼有字的一面朝內(nèi),而有很多孔的一面朝外,然后然后插入如圖所示的四個孔內(nèi)就可以了。

  36.3 軟件設(shè)計

  打開上一章的工程,首先在HARDWARE文件夾下新建一個DHT11的文件夾。然后新建一個dht11.c和dht11.h的文件保存在DHT11文件夾下,并將這個文件夾加入頭文件包含路徑。

  打開dht11.c在該文件下輸入如下代碼:

  #include “dht11.h”

  #include “delay.h”

  //復(fù)位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); //主機(jī)拉高20~40us

  }

  //等待DHT11的回應(yīng)

  //返回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

  {

  retry++;

  delay_us(1);

  };

  if(retry》=100)return 1;

  return 0;

  }

  //從DHT11讀取一個位

  //返回值:1/0

  u8 DHT11_Read_Bit(void)

  {

  u8 retry=0;

  while(DHT11_DQ_IN&&retry《100)//等待變?yōu)榈碗娖?/p>

  {

  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讀取一個字節(jié)

  //返回值:讀到的數(shù)據(jù)

  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讀取一次數(shù)據(jù)

  //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++)//讀取40位數(shù)據(jù)

  {

  buf[i]=DHT11_Read_Byte();

  }

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

  {

  *humi=buf[0];

  *temp=buf[2];

  }

  }else return 1;

  return 0;

  }

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

  //返回1:不存在

  //返回0:存在

  u8 DHT11_Init(void)

  {

  RCC-》APB2ENR|=1《《8; //使能PORTG口時鐘

  GPIOG-》CRH&=0XFFFF0FFF;//PORTG.11 推挽輸出

  GPIOG-》CRH|=0X00003000;

  GPIOG-》ODR|=1《《11; //輸出1

  DHT11_Rst();

  return DHT11_Check();

  }

  該部分代碼就是根據(jù)我們前面介紹的單總線操作時序來讀取DHT11的溫濕度值的,DHT11的溫濕度值通過DHT11_Read_Data函數(shù)讀取,如果返回0,則說明讀取成功,返回1,則說明讀取失敗。保存dht11.c,并把該文件加入到HARDWARE組下,然后我們打開dht11.h,在該文件下輸入如下內(nèi)容:

  #ifndef __DHT11_H

  #define __DHT11_H

  #include “sys.h”

  //IO方向設(shè)置

  #define DHT11_IO_IN() {GPIOG-》CRH&=0XFFFF0FFF;GPIOG-》CRH|=8《《12;}

  #define DHT11_IO_OUT() {GPIOG-》CRH&=0XFFFF0FFF;GPIOG-》CRH|=3《《12;}

  ////IO操作函數(shù)

  #define DHT11_DQ_OUT PGout(11) //數(shù)據(jù)端口 PG11

  #define DHT11_DQ_IN PGin(11) //數(shù)據(jù)端口 PG11

  u8 DHT11_Init(void); //初始化DHT11

  u8 DHT11_Read_Data(u8 *temp,u8 *humi);//讀取溫濕度

  u8 DHT11_Read_Byte(void); //讀出一個字節(jié)

  u8 DHT11_Read_Bit(void); //讀出一個位

  u8 DHT11_Check(void); //檢測是否存在DHT11

  void DHT11_Rst(void); //復(fù)位DHT11

  #endif

  此部分代碼比較簡單,接下來,我們先保存這段代碼,然后打開test.c,在該文件下修改main函數(shù)如下:

  int main(void)

  {

  u8 t=0;

  u8 temperature;

  u8 humidity;

  Stm32_Clock_Init(9); //系統(tǒng)時鐘設(shè)置

  uart_init(72,9600); //串口初始化為9600

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

  LED_Init(); //初始化與LED連接的硬件接口

  LCD_Init(); //初始化LCD

  usmart_dev.init(72); //初始化USMART

  KEY_Init(); //按鍵初始化

  POINT_COLOR=RED;//設(shè)置字體為紅色

  LCD_ShowString(60,50,200,16,16,“WarShip STM32”);

  LCD_ShowString(60,70,200,16,16,“DHT11 TEST”);

  LCD_ShowString(60,90,200,16,16,“ATOM@ALIENTEK”);

  LCD_ShowString(60,110,200,16,16,“2012/9/12”);

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

  {

  LCD_ShowString(60,130,200,16,16,“DHT11 Error”);

  delay_ms(200);

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

  delay_ms(200);

  }

  LCD_ShowString(60,130,200,16,16,“DHT11 OK”);

  POINT_COLOR=BLUE;//設(shè)置字體為藍(lán)色

  LCD_ShowString(60,150,200,16,16,“Temp: C”);

  LCD_ShowString(60,170,200,16,16,“Humi: %”);

  while(1)

  {

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

  {

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

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

  LCD_ShowNum(60+40,170,humidity,2,16); //顯示濕度

  }

  delay_ms(10);

  t++;

  if(t==20)

  {

  t=0;

  LED0=!LED0;

  }

  }

  }


非常好我支持^.^

(7) 100%

不好我反對

(0) 0%

( 發(fā)表人:金巧 )

      發(fā)表評論

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

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

      ?