編輯語:
芯片開放社區(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)
編輯:黃飛
?
評論