fjjjnk1234 发表于 2015-11-15 21:28:34

【NUCLEO-L476RG开发】DHT11温湿度传感器驱动

DHT11 是一款湿温度一体化的数字传感器。该传感器包括一个电阻式测湿元件和一个 NTC测温元件。DHT11 与单片机之间能采用简单的单总线进行通信,仅仅需要一个 I/O 口。传感器内部湿度和温度数据 40Bit 的数据一次性传给单片机,数据采用校验和方式进行校验,有效的保证数据传输的准确性。
DHT11 的技术参数如下:
    工作电压范围: 3.3V-5.5V
    工作电流 :平均 0.5mA
    输出:单总线数字信号
    测量范围:湿度 20~90%RH,温度 0~50℃
    精度 :湿度±5%,温度±2℃
    分辨率 :湿度 1%,温度 1℃

误差比较大,测量范围较小,也就只能当个玩具了。
DHT11 数字湿温度传感器采用单总线数据格式。即,单个数据引脚端口完成输入输出双向传输。其数据包由 5Byte( 40Bit)组成。数据分小数部分和整数部分,一次完整的数据传输为40bit,高位先出。 DHT11 的数据格式为: 8bit 湿度整数数据+8bit 湿度小数数据+8bit 温度整数数据+8bit 温度小数数据+8bit 校验和。其中校验和数据为前四个字节相加。
程序采用mbed开发环境

引脚连接:
DHT11的Dout引脚接Nucleo板子Arduino插座的A0

DHT11读取函数:
int ReadDHT11(void)
{
    // IO must be in hi state to start
    if(WaitPinHigh(250) == ERROR_TIMEOUT)
    {
      return ERROR_BUS_BUSY;
    }

    // start the transfer
    pin.output();
    pin = 0;
    wait_ms(18);

    pin = 1;
    wait_us(30);

    pin.input();

    // wait till the sensor grabs the bus
    if(WaitPinLow(40) == ERROR_TIMEOUT)
    {
      return ERROR_NOT_PRESENT;
    }

    // sensor should signal low 80us and then hi 80us
    if(WaitPinHigh(100) == ERROR_TIMEOUT)
    {
      return ERROR_SYNC_TIMEOUT;
    }
    if(WaitPinLow(100) == ERROR_TIMEOUT)
    {
      return ERROR_NO_PATIENCE;
    }

    int i, bit;
    uint8_t buf;

    // capture the data(40 bit)
    for(i=0; i<5; i++)
    {
      buf = 0;

      for(bit=0; bit<8; bit++)
      {
            if(WaitPinHigh(75) == ERROR_TIMEOUT)
            {
                return ERROR_DATA_TIMEOUT;
            }

            // logic 0 is 28us max, 1 is 70us
            wait_us(40);
            buf |= pin << (7 - bit);

            if(WaitPinLow(50) == ERROR_TIMEOUT)
            {
                return ERROR_DATA_TIMEOUT;
            }
      }
    }

    for(i=0; i<5; i++)
    {
      printf("buf[%d] = 0x%02x\r\n", i, buf);
    }

    // valid check
    if(buf != buf + buf + buf + buf)
    {
      return ERROR_CHECKSUM;
    }

    Temperature = float(buf);
    Humidity    = float(buf);

    return SUCCESS;
}主函数:
int main(void)
{
    int ret;
   
    printf("******This is a DHT11 Test******\r\n");

    for(;;)
    {
      ret = ReadDHT11();

      if(ret == SUCCESS)
      {
            printf("Temperature : %4.2f\r\n", Temperature);
            printf("Humidity    : %4.2f\r\n\r\n", Humidity);
      }
      else
      {
            printf("Error : %d\n", ret);
      }

      wait(5);
    }
}

风子 发表于 2015-11-15 21:55:28


Paderboy 发表于 2015-11-15 22:33:50

多谢分享,

lkl0305 发表于 2015-11-15 22:40:24

多谢分享

netlhx 发表于 2015-11-15 22:41:24

谢谢,又多了个参考

超級稻草人 发表于 2015-11-16 08:29:59

多谢分享:)

肽宰1 发表于 2015-11-16 10:01:55


多谢分享:lol:lol:lol

奋斗逼 发表于 2015-11-16 20:55:59

赞一个      :lol:lol:lol:lol
页: [1]
查看完整版本: 【NUCLEO-L476RG开发】DHT11温湿度传感器驱动