DHT11溼度傳感器開發

本文對在CC2540上開發DHT11溼度傳感器進行裸機開發, 並顯示與LED屏上,如下圖所示


看了無數的datasheet, 終於看到中文的了,感覺一下輕鬆很多,雖然這顆傳感器科技含量也不是特別高,但精神還是爲之一振,希望我朝設計出更高端的電子元器件。

溼敏元件是最簡單的溼度傳感器。溼敏元件主要有電阻式、電容式兩大類。

溼敏電阻的特點是在基片上覆蓋一層用感溼材料製成的膜,當空氣中的水蒸氣吸附在感溼膜上時,元件的電阻率和電阻值都發生變化,利用這一特性即可測量溼度。

溼敏電容一般是用高分子薄膜電容製成的,常用的高分子材料有聚苯乙烯、聚酰亞胺、酪酸醋酸纖維等。當環境溼度發生改變時,溼敏電容的介電常數發生變化,使其電容量也發生變化,其電容變化量與相對溼度成正比。電子式溼敏傳感器的準確度可達2-3%RH,這比干溼球測溼精度高。

溼敏元件的線性度及抗污染性差,在檢測環境溼度時,溼敏元件要長期暴露在待測環境中,很容易被污染而影響其測量精度及長期穩定性。這方面沒有乾溼球測溼方法好。

DHT11數字溫溼度傳感器是一款含有已校準數字信號輸出的溫溼度複合傳感器。它應用專用的數字模塊採集技術和溫溼度傳感技術,確保產品具有極高的可靠性與卓越的長期穩定性。傳感器包括一個電阻式感溼元件和一個NTC測溫元件,並與一個高性能8位單片機相連接。因此該產品具有品質卓越、超快響應、抗干擾能力強、性價比極高等優點。每個DHT11傳感器都在極爲精確的溼度校驗室中進行校準。校準係數以程序的形式儲存在OTP內存中,傳感器內部在檢測信號的處理過程中要調用這些校準係數。單線制串行接口,使系統集成變得簡易快捷。超小的體積、極低的功耗,信號傳輸距離可達20米以上,使其成爲各類應用甚至最爲苛刻的應用場合的最佳選則。產品爲4 針單排引腳封裝。連接方便,特殊封裝形式可根據用戶需求而提供。



DHT11只有三根線,第二腳爲數據腳,輸出串行異步數據,格式如下所示



數據是異步串行的,對時鐘要求就高了寫,需要開發者知道系統的時鐘,識別出數據0,或者數據1,在調試中我一度想使用CC2540提供的中斷功能,可怎麼也抓不到數據,不一會恍然大悟,數據是異步串行的,只要CC2540發出了開始信號,DHT11就開始發數據了,所以單步調試根本就抓不到數據。

下面爲代碼

#include<ioCC2540.h>
#include<stdio.h>


#include "dht11.h"


#define READ_PIN P1_0
#define CHECK_BIT 20


void delayMS(unsigned char ms)
{
  unsigned int count1;
  unsigned char msCount;
  
  for(msCount = 0; msCount<ms; msCount++)
    for(count1 =0;count1<3200;count1++)
        ;
  return;
}


void delayUS(unsigned char us)
{
  unsigned int count1;
  unsigned char usCount;
  
  for(usCount = 0; usCount<us; usCount++)
    for(count1 =0;count1<3;count1++)
        ;
  return;
}


unsigned char dht11HumidityRead(unsigned char *pHumidity, unsigned char *pTemperature)
{
  unsigned char dataIndex;
  unsigned char dataVal[5]={0};
  unsigned int dataTime;
  
  P1DIR |= 0X01;/*output mode*/
  READ_PIN = 0;
  delayMS(40);
  READ_PIN = 1;
  delayUS(2);
  P1DIR &= 0Xfe;/*read mode*/
  
  while(0==READ_PIN );
  while(1==READ_PIN );
  
  for(dataIndex=0; dataIndex<40; dataIndex++)
  {
    dataTime = 0; 
    while(0==READ_PIN );
    while(1==READ_PIN)
      dataTime++;
    if(dataTime>CHECK_BIT)
      dataVal[dataIndex/8] |= (0x80>>(dataIndex%8));
    else
      dataVal[dataIndex/8] &= (~(0x80>>(dataIndex%8)));
     
  }
  
  *pHumidity = dataVal[0];
  *pTemperature = dataVal[2];
  return 1;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章