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

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

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

詳解DHT11數字溫濕度傳感器實驗

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

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

  DHT11的技術參數如下:

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

  l 工作電流 :平均0.5mA

  l 輸出:單總線數字信號

  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的數據結構。

  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’時序

  通過以上了解,我們就可以通過STM32來實現對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條腿,需要把U13的4個接口都用上,將DHT11傳感器插入到這個上面就可以通過STM32來讀取溫濕度值了。連接示意圖如圖36.2.1所示:

  圖36.2.1 DHT11連接示意圖

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

  36.3 軟件設計

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

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

  #include “dht11.h”

  #include “delay.h”

  //復位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

  {

  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)//等待變為低電平

  {

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

  {

  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();

  }

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

  #ifndef __DHT11_H

  #define __DHT11_H

  #include “sys.h”

  //IO方向設置

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

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

  ////IO操作函數

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

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

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

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

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

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

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

  void DHT11_Rst(void); //復位DHT11

  #endif

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

  int main(void)

  {

  u8 t=0;

  u8 temperature;

  u8 humidity;

  Stm32_Clock_Init(9); //系統時鐘設置

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

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

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

  LCD_Init(); //初始化LCD

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

  KEY_Init(); //按鍵初始化

  POINT_COLOR=RED;//設置字體為紅色

  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;//設置字體為藍色

  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%

( 發表人:金巧 )

      發表評論

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

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

      ?
      主站蜘蛛池模板: 四虎影院观看视频在线观看| 校园 春色 欧美 另类 小说| 国产肥女bbwbbw| 免费视频网站在线观看| 亚洲一区二区中文| 久久精品国产乱子伦多人| 久久午夜综合久久| 天天艹天天射| 免费中国jlzzjlzz在线播放| 干得好爽| 色色激情网| 亚洲2020天天堂在线观看| 色午夜视频| 看亚洲a级一级毛片| 丁香四月婷婷| 国产精品九九久久一区hh| 永久观看| 国产免费爽爽视频免费可以看| 免费观看在线视频| 18免费视频| 日韩成人免费一级毛片| 精品久久久久久中文字幕欧美| ww欧洲ww在线视频免费观看| 天天搞一搞| 性欧美一区| 99热一区| 三级网址在线观看| 国内精品伊人久久大香线焦| 午夜视频在线观看www中文| 国内精品久久久久影院免费| 在线免费看污视频| 性做久久久久久久免费看| 六月婷婷啪啪| 婷婷四房播客五月天| aa2424在线视频看片| 很黄很污的视频网站| 日本资源在线| 波多野结衣在线观看一区 | 亚洲禁片| 日日草夜夜草| 初恋视频黄色|