你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

查看: 3782|回复: 7

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

[复制链接]

8

主题

252

回帖

0

蝴蝶豆

金牌会员

最后登录
2019-2-22
发表于 2015-11-15 21:28:34 | 显示全部楼层 |阅读模式
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读取函数:
  1. int ReadDHT11(void)
  2. {
  3.     // IO must be in hi state to start
  4.     if(WaitPinHigh(250) == ERROR_TIMEOUT)
  5.     {
  6.         return ERROR_BUS_BUSY;
  7.     }

  8.     // start the transfer
  9.     pin.output();
  10.     pin = 0;
  11.     wait_ms(18);

  12.     pin = 1;
  13.     wait_us(30);

  14.     pin.input();

  15.     // wait till the sensor grabs the bus
  16.     if(WaitPinLow(40) == ERROR_TIMEOUT)
  17.     {
  18.         return ERROR_NOT_PRESENT;
  19.     }

  20.     // sensor should signal low 80us and then hi 80us
  21.     if(WaitPinHigh(100) == ERROR_TIMEOUT)
  22.     {
  23.         return ERROR_SYNC_TIMEOUT;
  24.     }
  25.     if(WaitPinLow(100) == ERROR_TIMEOUT)
  26.     {
  27.         return ERROR_NO_PATIENCE;
  28.     }

  29.     int i, bit;
  30.     uint8_t buf[5];

  31.     // capture the data(40 bit)
  32.     for(i=0; i<5; i++)
  33.     {
  34.         buf[i] = 0;

  35.         for(bit=0; bit<8; bit++)
  36.         {
  37.             if(WaitPinHigh(75) == ERROR_TIMEOUT)
  38.             {
  39.                 return ERROR_DATA_TIMEOUT;
  40.             }

  41.             // logic 0 is 28us max, 1 is 70us
  42.             wait_us(40);
  43.             buf[i] |= pin << (7 - bit);

  44.             if(WaitPinLow(50) == ERROR_TIMEOUT)
  45.             {
  46.                 return ERROR_DATA_TIMEOUT;
  47.             }
  48.         }
  49.     }

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

  54.     // valid check
  55.     if(buf[4] != buf[0] + buf[1] + buf[2] + buf[3])
  56.     {
  57.         return ERROR_CHECKSUM;
  58.     }

  59.     Temperature = float(buf[2]);
  60.     Humidity    = float(buf[0]);

  61.     return SUCCESS;
  62. }
复制代码
主函数:
  1. int main(void)
  2. {
  3.     int ret;
  4.    
  5.     printf("******This is a DHT11 Test******\r\n");

  6.     for(;;)
  7.     {
  8.         ret = ReadDHT11();

  9.         if(ret == SUCCESS)
  10.         {
  11.             printf("Temperature : %4.2f\r\n", Temperature);
  12.             printf("Humidity    : %4.2f\r\n\r\n", Humidity);
  13.         }
  14.         else
  15.         {
  16.             printf("Error : %d\n", ret);
  17.         }

  18.         wait(5);
  19.     }
  20. }
复制代码
12.png

评分

参与人数 1ST金币 +10 收起 理由
沐紫 + 10

查看全部评分

回复

使用道具 举报

33

主题

1243

回帖

0

蝴蝶豆

论坛元老

最后登录
2019-3-9
发表于 2015-11-15 21:55:28 | 显示全部楼层
谢谢分享.png
回复 支持 反对

使用道具 举报

47

主题

3404

回帖

30

蝴蝶豆

版主

最后登录
2020-12-7
发表于 2015-11-15 22:33:50 | 显示全部楼层
多谢分享,
回复 支持 反对

使用道具 举报

40

主题

1595

回帖

1

蝴蝶豆

论坛元老

最后登录
2018-7-23
发表于 2015-11-15 22:40:24 | 显示全部楼层
多谢分享
回复 支持 反对

使用道具 举报

107

主题

812

回帖

5

蝴蝶豆

论坛元老

最后登录
2019-8-28
发表于 2015-11-15 22:41:24 | 显示全部楼层
谢谢,又多了个参考
回复 支持 反对

使用道具 举报

10

主题

2210

回帖

8

蝴蝶豆

论坛元老

最后登录
2020-12-9
发表于 2015-11-16 08:29:59 | 显示全部楼层
多谢分享
回复 支持 反对

使用道具 举报

18

主题

668

回帖

0

蝴蝶豆

金牌会员

最后登录
2017-4-9
发表于 2015-11-16 10:01:55 | 显示全部楼层

多谢分享
回复 支持 反对

使用道具 举报

0

主题

90

回帖

0

蝴蝶豆

中级会员

最后登录
2016-7-1
发表于 2015-11-16 20:55:59 | 显示全部楼层
赞一个      
回复 支持 反对

使用道具 举报

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版