关于AM2302温湿度(DHT22)传感器的使用

这是使用该传感器的整个过程,在使用这个传感器的过程中所遇到的一些问题。


  1. 驱动文件获取

提取码:e0k7

  1. 原理解析

  • 硬件接线:

VCC接5v,SDA接MCU定义的IO口,SCL、GND接GND。

  • 软件控制过程:

第一步:上电初始化后等待2s,等传感器越过不稳定态。

第二步:起始信号:MCU定义的IO口输出低电平持续1ms。而后将IO口转为上拉输入释放SDA总线。传感器SDA总线收到起始信号后由输入态转为输出态。

第三步:应答信号:SDA总线被释放后,AM2302会先输出80us的低电平作为应答,而后输出80us的高电平通知MCU准备接收数据。

第四步:传感器的SDA总线会串行输出40bit数据给MCU, 数据传输完后会再输出50us低电平,随后便转为输入态来等待下一次起始信号到来。

  • 数据处理过程:

  • 数据组成:一共40bit,湿度高8位+湿度低8位+温度高8位+温度低8位+校验位8位。

  • 数据接收:定义结构体AM2302_Data_TypeDef 包含五个uint8_t型结构体变量。分步接收即可。

  • 输出校验:如果 湿度高8位+湿度低8位+温度高8位+温度低8位=校验位8位,则说明数据接收成功。

  • 数据显示:如下,在main函数中调用即可。

unsigned int RH_Value,TEMP_Value; 
unsigned char RH_H,RH_L,TP_H,TP_L;
if( Read_AM2302(&AM2302_Data)==SUCCESS)
            {           
                    //计算出实际湿度值的10倍
                    RH_Value= AM2302_Data.humi_int*256 + AM2302_Data.humi_deci;
                    RH_H = RH_Value/10;
                    RH_L = RH_Value%10;
                    //计算出时间温度值的10倍
                    TEMP_Value = AM2302_Data.temp_int*256 + AM2302_Data.temp_deci;
                    TP_H = TEMP_Value/10;
                    TP_L = TEMP_Value%10;
                    printf("\r\n读取AM2302成功!\r\n\r\n湿度为%d.%d %RH \
                                                    ,温度为 %d.%d℃ \r\n",RH_H,RH_L,TP_H,TP_L);//“\”表示转向一下行
            }
            else
                    printf("Read AM2302 ERROR!\r\n");
  1. 问题:

  • 问题1:移植好软件部分后,接好线发现串口打印出来一直显示读取错误。

  • 答:有可能是因为接线不够牢靠,而高低电平时间判定特别短,导致校验位校验失败,而导致读取错误,可以先注销校验部分代码,看看串口是否能正常收到温湿度信息。

  • 问题2:移植编译正常,接线部分也没有问题但是仍然收不到温湿度信息。

  • 答:仔细检查延时函数。因为该传感器对时序要求较为严格,如果时序不对,可能导致数据传输失败。

  • 问题3:读取的数据不够实时。

  • 答:是因为每一次读取所得数据均为在上次读取传感器数据时,传感器在读取时测量的,若想提高实时性,可以取两次即得较为实时数据。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32F407单片机读写AM2302湿度传感器DEMO实验软件例程源码,可以做为你的学习设计参考, int main(void) { char str[50]; uint32_t lcdid; /* 复位所有外设,初始化Flash接口和系统滴答定时器 */ HAL_Init(); /* 配置系统时钟 */ SystemClock_Config(); /* 初始化串口并配置串口中断优先级 */ MX_DEBUG_USART_Init(); /* 模块初始化 */ AM2302_Init(); /* 初始化3.5寸TFT液晶模组,一般优先于调试串口初始化 */ lcdid=BSP_LCD_Init(); /* 调用格式化输出函数打印输出数据 */ printf("LCD ID=0x%08X\n",lcdid); LCD_Clear(0,0,LCD_DEFAULT_WIDTH,LCD_DEFAULT_HEIGTH,BLACK); HAL_Delay(1000); /* 开背光 */ LCD_BK_ON(); LCD_DispString_EN_CH(70,50,(uint8_t *)"YS-F4Pro开发板",BLACK,BLUE,USB_FONT_24); /* 无限循环 */ while (1) { /*调用AM2302_Read_TempAndHumidity读取湿度,若成功则输出该信息*/ if(AM2302_Read_TempAndHumidity(&AM2302_Data)==SUCCESS) { sprintf(str,"湿度为 %.1f%RH",AM2302_Data.humidity); LCD_DispString_EN_CH(70,150,(uint8_t *)str,BLACK,YELLOW,USB_FONT_24); printf("%s\n",str); sprintf(str,"度为 %.1f℃",AM2302_Data.temperature); LCD_DispString_EN_CH(70,180,(uint8_t *)str,BLACK,YELLOW,USB_FONT_24); printf("%s\n",str); printf("读取AM2302成功!-->湿度为%.1f %RH ,度为 %.1f℃ \n",AM2302_Data.humidity,AM2302_Data.temperature); } else { printf("读取AM2302信息失败\n"); LCD_DispString_CH(50,150,(uint8_t *)"读取AM2302信息失败",BLACK,MAGENTA,USB_FONT_24); } HAL_Delay(1000); } }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值