这是使用该传感器的整个过程,在使用这个传感器的过程中所遇到的一些问题。
驱动文件获取
提取码:e0k7
原理解析
硬件接线:

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:移植好软件部分后,接好线发现串口打印出来一直显示读取错误。
答:有可能是因为接线不够牢靠,而高低电平时间判定特别短,导致校验位校验失败,而导致读取错误,可以先注销校验部分代码,看看串口是否能正常收到温湿度信息。

问题2:移植编译正常,接线部分也没有问题但是仍然收不到温湿度信息。
答:仔细检查延时函数。因为该传感器对时序要求较为严格,如果时序不对,可能导致数据传输失败。
问题3:读取的数据不够实时。
答:是因为每一次读取所得数据均为在上次读取传感器数据时,传感器在读取时测量的,若想提高实时性,可以取两次即得较为实时数据。