編輯語:
芯片開放社區(qū)(OCC)面向廣大開發(fā)者推出應(yīng)用實(shí)戰(zhàn)系列內(nèi)容,通過分享開發(fā)者實(shí)戰(zhàn)開發(fā)案例,總結(jié)應(yīng)用開發(fā)經(jīng)驗(yàn),梳理開發(fā)中的常見問題及解決方案,為后續(xù)參與的開發(fā)者提供更多參考與借鑒。
本文是RVB2601創(chuàng)意應(yīng)用開發(fā)中?userA794?基于RVB2601開發(fā)板實(shí)戰(zhàn)開發(fā)的項(xiàng)目系列文章中的一篇,主要詳細(xì)介紹了AHT10溫濕度傳感器。
目前玄鐵杯大賽已進(jìn)入項(xiàng)目開發(fā)階段,下滑到文末掃碼關(guān)注第三屆“玄鐵杯”大賽,快來看看參賽者的創(chuàng)意吧!
01?概述
AHT10 是一款高精度,完全校準(zhǔn),貼片封裝的溫濕度傳感器。AHT10 通信方式采用標(biāo)準(zhǔn) IIC 通信方式,支持較寬的工作電源電壓范圍,溫濕度傳感器均在高精度的恒溫恒濕腔室中進(jìn)行出廠校準(zhǔn),直接輸出經(jīng)溫度補(bǔ)償后的濕度、溫度等信息,用戶無需要對(duì)濕度進(jìn)行溫度補(bǔ)償,便可得到準(zhǔn)確的溫濕度信息。
AHT10特點(diǎn)如下:
供電范圍:1.8-3.6V
濕度測(cè)量范圍:0~99.9%RH
濕度測(cè)量精度:±3%RH
溫度測(cè)量范圍:-40~+85℃
溫度測(cè)量精度:±0.5℃
數(shù)字輸出,IIC接口
02?硬件連接
由AHT10產(chǎn)品手冊(cè)可知,AHT10與設(shè)備通信時(shí)一般作為從機(jī)使用,如圖所示?
此時(shí),RVB2601作為主機(jī)使用,需要使用RVB2601上的IIC接口與其通信。通過RVB2601原理圖可知,板載的IIC接口為PA8和PA9,分別為SCL和SDA,默認(rèn)與板載ADC和DAC芯片連接,將跳線帽取下用杜邦線將其與AHT10連接,如圖所示。
03?驅(qū)動(dòng)代碼
通過AHT10產(chǎn)品手冊(cè)可得AHT10的地址為0x70,且傳感器讀取流程如圖所示
AHT10初始化函數(shù)如下
?
?
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分別設(shè)置為IIC0的SCL和SDA引腳,
csi_error_t csi_iic_init(csi_iic_t *iic, uint32_t idx);用于通過設(shè)備ID初始化對(duì)應(yīng)的IIC接口,csi_error_t csi_iic_mode(csi_iic_t *iic, csi_iic_mode_t mode);用于配置IIC接口為主機(jī)模式或從機(jī)模式,csi_error_t csi_iic_addr_mode(csi_iic_t *iic, csi_iic_addr_mode_t addr_mode);用于設(shè)置地址模式,csi_error_t csi_iic_speed(csi_iic_t *iic, csi_iic_speed_t speed);用于設(shè)置IIC接口的傳輸速度。
獲取具體溫濕度值代碼如下
?
?
u8 AHT10_ReadData(float *temperature,float *humidity) { u32 ack; u32 SRH=0,ST=0; u8 databuff[6]; //觸發(fā)測(cè)量 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);用于主機(jī)模式下,IIC接口以同步模式發(fā)送數(shù)據(jù),int32_t csi_iic_master_receive(csi_iic_t *iic, uint32_t devaddr, void *data, uint32_t size,uint32_t timeout);用于主機(jī)模式下,IIC接口以同步模式進(jìn)行數(shù)據(jù)接受。
通過串口打印輸出結(jié)果如圖所示。
正常情況下,溫度在31.5℃左右,濕度在50.5RH,用手觸摸AHT10后,溫濕度值增加。
后續(xù)可通過OLED進(jìn)行溫濕度值的實(shí)時(shí)顯示。
對(duì)于IIC接口的具體API用法可通過此文檔查閱IIC函數(shù)說明(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)
編輯:黃飛
?
評(píng)論