编辑语:
芯片开放社区(OCC)面向广大开发者推出应用实战系列内容,通过分享开发者实战开发案例,总结应用开发经验,梳理开发中的常见问题及解决方案,为后续参与的开发者提供更多参考与借鉴。
本文是RVB2601创意应用开发中 userA794 基于RVB2601开发板实战开发的项目系列文章中的一篇,主要详细介绍了AHT10温湿度传感器。
目前玄铁杯大赛已进入项目开发阶段,下滑到文末扫码关注第三届“玄铁杯”大赛,快来看看参赛者的创意吧!
01 概述
AHT10 是一款高精度,完全校准,贴片封装的温湿度传感器。AHT10 通信方式采用标准 IIC 通信方式,支持较宽的工作电源电压范围,温湿度传感器均在高精度的恒温恒湿腔室中进行出厂校准,直接输出经温度补偿后的湿度、温度等信息,用户无需要对湿度进行温度补偿,便可得到准确的温湿度信息。
AHT10特点如下:
供电范围:1.8-3.6V
湿度测量范围:0~99.9%RH
湿度测量精度:±3%RH
温度测量范围:-40~+85℃
温度测量精度:±0.5℃
数字输出,IIC接口
02 硬件连接
由AHT10产品手册可知,AHT10与设备通信时一般作为从机使用,如图所示
此时,RVB2601作为主机使用,需要使用RVB2601上的IIC接口与其通信。通过RVB2601原理图可知,板载的IIC接口为PA8和PA9,分别为SCL和SDA,默认与板载ADC和DAC芯片连接,将跳线帽取下用杜邦线将其与AHT10连接,如图所示。
03 驱动代码
通过AHT10产品手册可得AHT10的地址为0x70,且传感器读取流程如图所示
AHT10初始化函数如下
void AHT10_Init(void) { static csi_iic iic_struct; csi_pin_set_mux(PA8,PA8_IIC0_SCL); csi_pin_set_mux(PA9,PA9_IIC0_SDA); csi_iic_init(&iic_struct,0); csi_iic_mode(&iic_struct,IIC_MODE_MASTER); csi_iic_addr_mode(&iic_struct,IIC_ADDRESS_7BIT); csi_iic_speed(&iic_struct,IIC_BUS_SPEED_STANDARD); }
将PA8和PA9分别设置为IIC0的SCL和SDA引脚,
csi_error_t csi_iic_init(csi_iic_t *iic, uint32_t idx);用于通过设备ID初始化对应的IIC接口,csi_error_t csi_iic_mode(csi_iic_t *iic, csi_iic_mode_t mode);用于配置IIC接口为主机模式或从机模式,csi_error_t csi_iic_addr_mode(csi_iic_t *iic, csi_iic_addr_mode_t addr_mode);用于设置地址模式,csi_error_t csi_iic_speed(csi_iic_t *iic, csi_iic_speed_t speed);用于设置IIC接口的传输速度。
获取具体温湿度值代码如下
u8 AHT10_ReadData(float *temperature,float *humidity) { u32 ack; u32 SRH=0,ST=0; u8 databuff[6]; //触发测量 csi_iic_master_send(&iic_struct,AHT10_ADDRESS,AHT10_WRITE,1,1000); csi_iic_master_send(&iic_struct,AHT10_ADDRESS,0xac,1,1000); csi_iic_master_send(&iic_struct,AHT10_ADDRESS,0x33,1,1000); csi_iic_master_send(&iic_struct,AHT10_ADDRESS,0x00,1,80); csi_iic_master_send(&iic_struct,AHT10_ADDRESS,AHT10_READ,1,1000); ack=csi_iic_master_receive(&iic_struct,AHT10_ADDRESS,AHT10_READ,1,1000); if((ack&0x08)==0) { AHT10_Init(); } if((ack&0x80)==0) { databuff[0]=csi_iic_master_receive(&iic_struct,AHT10_ADDRESS,0x01,1,10); databuff[1]=csi_iic_master_receive(&iic_struct,AHT10_ADDRESS,0x01,1,10); databuff[2]=csi_iic_master_receive(&iic_struct,AHT10_ADDRESS,0x01,1,10); databuff[3]=csi_iic_master_receive(&iic_struct,AHT10_ADDRESS,0x01,1,10); databuff[4]=csi_iic_master_receive(&iic_struct,AHT10_ADDRESS,0x00,1,10); SRH=(databuff[0]<<12)+(databuff[1]<<4)+(databuff[2]>>4); ST=((databuff[2]&0x0f)<<16)+(databuff[3]<<8)+(databuff[4]); *humidity=(int)(SRH*100.0/1024/1024+0.5);// *temperature=((int)(ST*2000.0/1024/1024+0.5))/10.0-50; return 0; } return 1; }
int32_t csi_iic_master_send(csi_iic_t *iic, uint32_t devaddr, const void *data, uint32_t size, uint32_t timeout);用于主机模式下,IIC接口以同步模式发送数据,int32_t csi_iic_master_receive(csi_iic_t *iic, uint32_t devaddr, void *data, uint32_t size,uint32_t timeout);用于主机模式下,IIC接口以同步模式进行数据接受。
通过串口打印输出结果如图所示。
正常情况下,温度在31.5℃左右,湿度在50.5RH,用手触摸AHT10后,温湿度值增加。
后续可通过OLED进行温湿度值的实时显示。
对于IIC接口的具体API用法可通过此文档查阅IIC函数说明(https://yoc.docs.t-head.cn/yocbook/Chapter3-AliOS/CSI%E8%AE%BE%E5%A4%87%E9%A9%B1%E5%8A%A8%E6%8E%A5%E5%8F%A3/CSI2/IIC.html)
编辑:黄飞
评论
查看更多