温度传感器

来自Microduino Wikipedia
跳转至: 导航搜索

目的

本教程将教大家使用DHT11温湿度传感器,结果通过虚拟USB串口打印显示出来。DHT11温湿度传感器是一款含有以校准数字信号输出的温湿度符合型传感器。

设备

Microduino-CoreSTM32是采用 STM32F103CBT6芯片的ARM开发板,采用独特的Upin7接口,大小与一枚一元硬币差不多大,完全兼容Microduino其他扩展模块。

  • 其他硬件设备
    • 面包板跳线 一盒
    • 面包板 一块
    • DHT11温湿度传感器 一个
    • USB数据连接线 一根
    • 1K欧姆电阻 1 个

原理

DHT11温湿度传感器外形以及引脚功能如下图所示,其中N.C.悬空。

DHT11数字温湿度传感器技术参数

    • 供电电压: 3.3~5.5V DC
    • 全量程标定,单线数字输出;
    • 湿度测量范围:20%~90%RH(0-50℃温度补偿);
    • 温度测量范围:0~+50℃;
    • 湿度测量精度:±5.0%RH
    • 温度测量精度:±2.0℃
    • 响应时间:<5s;
    • 低功耗

数据传输格式 DHT11的DATA线用于微处理器与 DHT11之间的通讯和同步,采用单总线数据格式,一次通讯时间4ms左右,数据分小数部分和整数部分。

  • 一次完整的数据传输为40bit,高位先出。
  • 8bit湿度整数数据+8bit湿度小数数据
  • +8bi温度整数数据+8bit温度小数数据
  • +8bit校验和

数据传送正确时校验和数据等于“ 8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据” 所得结果的末8位。

总线空闲状态为高电平,主机把总线拉低等待DHT11响应,主机把总线拉低必须大于18毫秒,保证DHT11能检测到起始信号。DHT11接收到主机的开始信号后,等待主机开始信号结束,然后发送80us低电平响应信号.主机发送开始信号结束后,延时等待20-40us后, 读取DHT11的响应信号,主机发送开始信号后,可以切换到输入模式,或者输出高电平均可, 总线由上拉电阻拉高。

总线为低电平,说明DHT11发送响应信号,DHT11发送响应信号后,再把总线拉高80us,准备发送数据,每一bit数据都以50us低电平时隙开始,高电平的长短定了数据位是0还是1.格式见下面图示.如果读取响应信号为高电平,则DHT11没有响应,请检查线路是否连接正常.当最后一bit数据传送完毕后,DHT11拉低总线50us,随后总线由上拉电阻拉高进入空闲状态。

本教程的实验原理图如下图所示:

程序

#define DHT_PIN   2   // define the data exchange pin 
byte ERROR;           //ERROR flag 
byte dht_dat[5];    //define a receive data buffer 
                    //the first byte is the  mantissa of the humidity
                    //the second byte is the fraction of the humidity
                    //the third byte is the mantissa of the temperature
                    //the fourth byte is the fraction of the temperature
                    //the fifth byte is a checksum byte 
void setup() 
{
  pinMode(DHT_PIN,OUTPUT);
  digitalWrite(DHT_PIN,HIGH);  //idle state is high of the data exchange pin
}
void loop() 
{
    ReadDHT();    //read the value of the humidity and the temperature
    switch(ERROR)
    {
      case 0:     // normal condition
          SerialUSB.print("Current humidity = ");
          SerialUSB.print(dht_dat[0],DEC);
          SerialUSB.print(".");
          SerialUSB.print(dht_dat[1],DEC);
          SerialUSB.print(" %  ");
          SerialUSB.print("temperature = ");
          SerialUSB.print(dht_dat[2],DEC);
          SerialUSB.print(".");
          SerialUSB.print(dht_dat[3],DEC);
          SerialUSB.println(" C");
          break;
       case 1:
          SerialUSB.println("Error 1:DHT start condition 1 not met.");
          break;
       case 2:
          SerialUSB.println("Error 2:DHT start condition 2 not met.");
          break;
       case 3:
          SerialUSB.println("Error 3:DHT check error.");
          break;
       default:
          SerialUSB.println("Error 3:Unrecongnized code error.");
          break;
    }
    delay(3000);          // Wait for 1 second (1000 milliseconds)
}

void ReadDHT()   //initialize the DHT11 sensor 
{
  ERROR=0;
  byte dht_in;
  byte i;
  digitalWrite(DHT_PIN,LOW);
  delay(20);
  digitalWrite(DHT_PIN,HIGH);
  delayMicroseconds(40);
  pinMode(DHT_PIN,INPUT);
  dht_in=digitalRead(DHT_PIN);
  if(dht_in)
  {
    ERROR=1;
    return ;
  }
  delayMicroseconds(80);
  dht_in=digitalRead(DHT_PIN);
  if(!dht_in)
  {
    ERROR=2;
    return ;
  }
  delayMicroseconds(80);
  for(i=0;i<5;i++)
  {
    dht_dat[i]=read_dht_dat();
  }
  pinMode(DHT_PIN,OUTPUT);
  digitalWrite(DHT_PIN,HIGH);
  byte dht_check_sum=dht_dat[0]+dht_dat[1]+dht_dat[2]+dht_dat[3];
  if(dht_dat[4]!=dht_check_sum)
  {
    ERROR=3;
  }
}
byte read_dht_dat()  //  read one byte  data 
{
  byte i=0;
  byte result=0;
  for(i=0;i<8;i++)
  {
    while(digitalRead(DHT_PIN)==LOW) ;
    delayMicroseconds(30);
    if(digitalRead(DHT_PIN)==HIGH)
    { result|=(1<<(7-i));}
    while(digitalRead(DHT_PIN)==HIGH);
  }
  return result;
}

程序说明:

  • ReadDHT()是初始化DHT11温湿度传感器函数,并读取了包含温湿度信息的5字节数据。该函数有点难理解,大家可以结合原理里面数据传输的格式来理解。
  • read_dht_dat()是实际读取数据的函数,通过50us低电平后高电平点平的时间来判断数据是0还是1。

调试

  • 步骤一:根据实验原理图连接好实物图。
  • 步骤二:复制程序到Maple IDE中编译程序。
  • 步骤三:下载程序,打开串口监视界面,观察数据。
  • 步骤四:在DHT11传感器附近增加湿度和提高温度,观察数据的变化。

结果

串口监视界面显示结果如下图所示。在给DHT11传感器附近加湿、升温后湿度和温度值明显增加。

视频