804|5

159

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

【ST NUCLEO-U083RC】学习笔记10(温湿度计) [复制链接]

1:温湿度模块DHT22

DHT22也称AM2302,是一款含有已校准数字信号输出的温湿度复合传感器,如下图:

image-20240606202953159

检测范围:

温度范围:-40-80℃ ±0.5℃
湿度范围:20-90%RH ±2%RH

2:引脚定义:

image-20240606203118357

3:工作时序

image-20240606203218439

记住,读取数据的时候,前2个字节是湿度,后面才是温度。

具体的数据是:向DHT22读取温湿度数据时,DHT22是返回的是一个40位的数据,bit39-bit31表示湿度高位,bit30-bit23表示湿度低位,bit23-bit16表示温度高位,bit15-bit8表示温度低位,bit7-bit0表示校验位,

4:代码编程

  1. #define DHT22_PORT GPIOB
  2. #define DHT22_PIN GPIO_PIN_2
  3. #define DHT22_CLOCK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE()
  4. void DHT22_DQ_OUT(uint8_t BitValue)
  5. {
  6. HAL_GPIO_WritePin(DHT22_PORT, DHT22_PIN, (GPIO_PinState)BitValue);
  7. }
  8. #define DHT22_DQ_IN HAL_GPIO_ReadPin(DHT22_PORT, DHT22_PIN)
  9. void DHT22_IO_OUT(void)
  10. {
  11. DHT22_CLOCK_ENABLE(); // 使能GPIOB时钟
  12. GPIO_InitTypeDef GPIO_InitStruct = {0}; // 定义结构体配置GPIO
  13. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 设置GPIO模式为开漏输出模式
  14. GPIO_InitStruct.Pull = GPIO_PULLUP; // 内部上拉电阻
  15. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; // 设置GPIO速度为高速
  16. GPIO_InitStruct.Pin = DHT22_PIN; // 设置引脚
  17. HAL_GPIO_Init(DHT22_PORT, &GPIO_InitStruct);// 初始化GPIO
  18. }
  19. void DHT22_IO_IN(void)
  20. {
  21. DHT22_CLOCK_ENABLE(); // 使能GPIOC时钟
  22. GPIO_InitTypeDef GPIO_InitStruct = {0}; // 定义结构体配置GPIO
  23. GPIO_InitStruct.Mode = GPIO_MODE_INPUT; // 设置GPIO模式为开漏输出模式
  24. GPIO_InitStruct.Pull = GPIO_PULLUP; // 内部上拉电阻
  25. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; // 设置GPIO速度为高速
  26. GPIO_InitStruct.Pin = DHT22_PIN; // 设置引脚
  27. HAL_GPIO_Init(DHT22_PORT, &GPIO_InitStruct);// 初始化GPIO
  28. }
  29. //复位DHT22
  30. void DHT22_Rst(void)
  31. {
  32. DHT22_IO_OUT(); //SET OUTPUT
  33. DHT22_DQ_OUT(0); //拉低DQ
  34. delay_ms(1); //
  35. DHT22_DQ_OUT(1); //DQ=1
  36. delay_us(30); //主机拉高20~40us
  37. }
  38. //等待DHT22的回应
  39. //返回1:未检测到DHT22的存在
  40. //返回0:存在
  41. uint8_t DHT22_Check(void)
  42. {
  43. uint8_t retry=0;
  44. DHT22_IO_IN();//SET INPUT
  45. while (DHT22_DQ_IN&&retry<100)//DHT22会拉低80us左右
  46. {
  47. retry++;
  48. delay_us(1);
  49. };
  50. if(retry>=100)return 1;
  51. else retry=0;
  52. while (!DHT22_DQ_IN&&retry<100)//DHT22拉高后会再次拉高80us左右
  53. {
  54. retry++;
  55. delay_us(1);
  56. };
  57. if(retry>=100)return 1;
  58. return 0;
  59. }
  60. //从DHT22读取一个位
  61. //返回值:1/0
  62. uint8_t DHT22_Read_Bit(void)
  63. {
  64. uint8_t retry=0;
  65. while(DHT22_DQ_IN&&retry<100)//等待变为低电平
  66. {
  67. retry++;
  68. delay_us(1);
  69. }
  70. retry=0;
  71. while(!DHT22_DQ_IN&&retry<100)//等待变高电平
  72. {
  73. retry++;
  74. delay_us(1);
  75. }
  76. delay_us(40);//等待40us
  77. if(DHT22_DQ_IN)return 1;
  78. else return 0;
  79. }
  80. //从DHT22读取一个字节
  81. //返回值:读到的数据
  82. uint8_t DHT22_Read_Byte(void)
  83. {
  84. uint8_t i,dat;
  85. dat=0;
  86. for (i=0; i<8; i++)
  87. {
  88. dat<<=1;
  89. dat|=DHT22_Read_Bit();
  90. }
  91. return dat;
  92. }
  93. //从DHT22读取一次数据
  94. //temp:温度值(范围:0~50°)
  95. //humi:湿度值(范围:20%~90%)
  96. //返回值:0,正常;1,读取失败
  97. uint8_t DHT22_Read_Data(unsigned short *temp,unsigned short *humi)
  98. {
  99. uint8_t buf[5];
  100. uint8_t i;
  101. DHT22_Rst();
  102. if(DHT22_Check()==0)
  103. {
  104. printf("111");
  105. for(i=0; i<5; i++) //读取40位数据
  106. {
  107. buf<i>=DHT22_Read_Byte();
  108. }
  109. if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
  110. {
  111. if((buf[2]&0x80)==0x80)
  112. {
  113. buf[2] = buf[2]&0x7F;
  114. printf("buf[2]=%x",buf[2]);
  115. }
  116. *humi=(uint16_t)buf[0]<<8|buf[1];
  117. *temp=(uint16_t)buf[2]<<8|buf[3];
  118. }
  119. } else return 1;
  120. return 0;
  121. }
  122. //初始化DHT22的IO口 DQ 同时检测DHT22的存在
  123. //返回1:不存在
  124. //返回0:存在
  125. uint8_t DHT22_Init(void)
  126. {
  127. DHT22_CLOCK_ENABLE(); // 使能GPIOB时钟
  128. GPIO_InitTypeDef GPIO_InitStruct = {0}; // 定义结构体配置GPIO
  129. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD; // 设置GPIO模式为开漏输出模式
  130. GPIO_InitStruct.Pull = GPIO_PULLUP; // 内部上拉电阻
  131. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; // 设置GPIO速度为高速
  132. GPIO_InitStruct.Pin = DHT22_PIN; // 设置引脚
  133. HAL_GPIO_Init(DHT22_PORT, &GPIO_InitStruct);// 初始化GPIO
  134. DHT22_DQ_OUT(1);
  135. DHT22_Rst(); //复位DHT22
  136. return DHT22_Check();//等待DHT22的回应
  137. }

最终结果视频:

播放器加载失败: 未检测到Flash Player,请到安装
温湿度显示

查看精华帖全部内容,请登录或者注册
此帖出自stm32/stm8论坛

最新回复

void DHT22_IO_IN(void) { DHT22_CLOCK_ENABLE(); // 使能GPIOC时钟 GPIO_InitTypeDef GPIO_InitStruct = {0}; // 定义结构体配置GPIO GPIO_InitStruct.Mode = GPIO_MODE_INPUT; // 设置GPIO模式为开漏输出模式 GPIO_InitStruct.Pull = GPIO_PULLUP; // 内部上拉电阻 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; // 设置GPIO速度为高速 GPIO_InitStruct.Pin = DHT22_PIN; // 设置引脚 HAL_GPIO_Init(DHT22_PORT, &GPIO_InitStruct);// 初始化GPIO } 在单总中,这里最好直接给寄存器写入就行了,不然占用时间段比较长。   详情 回复 发表于 2024-6-7 08:42
点赞 关注
 

回复
举报

6889

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 

读取数据的时候,前2个字节是湿度,后面才是温度。好吧

但是,这个图片没显示出来

 

此帖出自stm32/stm8论坛
 
 

回复

6889

帖子

0

TA的资源

五彩晶圆(高级)

板凳
 

 

此帖出自stm32/stm8论坛

点评

[attachimg]814651[/attachimg] md格MD格式网址转URL连接了  详情 回复 发表于 2024-6-7 09:24
 
 

回复

7141

帖子

11

TA的资源

版主

4
 
    • void DHT22_IO_IN(void)
    • {
    • DHT22_CLOCK_ENABLE(); // 使能GPIOC时钟
    • GPIO_InitTypeDef GPIO_InitStruct = {0}; // 定义结构体配置GPIO
    • GPIO_InitStruct.Mode = GPIO_MODE_INPUT; // 设置GPIO模式为开漏输出模式
    • GPIO_InitStruct.Pull = GPIO_PULLUP; // 内部上拉电阻
    • GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; // 设置GPIO速度为高速
    • GPIO_InitStruct.Pin = DHT22_PIN; // 设置引脚
    • HAL_GPIO_Init(DHT22_PORT, &GPIO_InitStruct);// 初始化GPIO
    • }
    • 在单总中,这里最好直接给寄存器写入就行了,不然占用时间段比较长。
此帖出自stm32/stm8论坛

点评

有道理,下次修改下  详情 回复 发表于 2024-6-7 12:56
 
 
 

回复

159

帖子

0

TA的资源

一粒金砂(高级)

5
 

md格MD格式网址转URL连接了

此帖出自stm32/stm8论坛
 
 
 

回复

159

帖子

0

TA的资源

一粒金砂(高级)

6
 
lugl4313820 发表于 2024-6-7 08:42 void DHT22_IO_IN(void) { DHT22_CLOCK_ENABLE(); // 使能GPIOC时钟 GPIO_InitTypeDef ...

有道理,下次修改下

此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
福禄克有奖直播:高精度测温赋能电子制造 报名中!
直播时间:2025年2月28日(周五)上午10:00
直播主题:高精度测温赋能电子制造
小伙伴们儿快来报名直播吧~好礼等你拿!

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表