目錄
一、電路連接圖
二、AHT10模塊簡介
三、AHT10模塊工作原理
四、AHT10的通信方式
五、AHT10的時序圖
5-1、AHT10測量指令時序圖解析
5-2、AHT10讀數(shù)據(jù)時序圖解析
5-3、AHT10的溫濕度轉(zhuǎn)換公式
六、IIC的GPIO配置
? 6-1、AHT10.C文件
6-2、AHT10.H文件
七、實(shí)現(xiàn)的功能
一、電路連接圖
圖(1)AHT10電路連接圖
二、AHT10模塊簡介
????????AHT10是一款高精度、完全校準(zhǔn)、貼片封裝的溫濕度傳感器,使用MEMS的制作工藝,確保產(chǎn)品具有極高的可靠性與卓越的長期穩(wěn)定性。該傳感器包括一個電容式感濕元件和一個高性能CMOS微處理器相連接。其通信方式采用標(biāo)準(zhǔn)I2C通信方式,具有超小的體積、極低的功耗,使其成為各類應(yīng)用甚至最為苛刻的應(yīng)用場合的最佳選擇。AHT10支持較寬的工作電源電壓范圍,該器件可為各類常見應(yīng)用場景提供低成本和低功耗優(yōu)勢,AHT10模塊的溫濕度傳感器均在高精度的恒溫恒濕腔室中進(jìn)行出廠校準(zhǔn),直接輸出經(jīng)溫度補(bǔ)償后的濕度、溫度等信息,用戶無需要對濕度進(jìn)行溫度補(bǔ)償,便可得到準(zhǔn)確的溫濕度信息。其參數(shù)包括輸入電壓范圍:1.8V至3.6V,出廠經(jīng)過標(biāo)定校準(zhǔn),產(chǎn)品具有溫度補(bǔ)償功能,具有I2C接口,超低功耗,SMD封裝,濕度精度±2% RH(典型值),溫度精度±0.3℃(典型值)。
三、AHT10模塊工作原理
????????AHT10模塊的濕度傳感器采用電容式感濕元件,通過測量周圍環(huán)境中濕度變化引起的電容變化來測量濕度。同時,它還采用了微處理器進(jìn)行數(shù)據(jù)處理和校準(zhǔn),以獲得更準(zhǔn)確的濕度測量結(jié)果,另外,AHT10模塊還配有一個標(biāo)準(zhǔn)片上溫度傳感元件,用于測量周圍環(huán)境的溫度。微處理器對濕度和溫度數(shù)據(jù)進(jìn)行處理和校準(zhǔn),然后通過IIC通訊方式輸出經(jīng)過溫度補(bǔ)償?shù)臏貪穸刃畔ⅰ?/p>
四、AHT10的通信方式
????????AHT10的通信方式采用標(biāo)準(zhǔn)I2C通信方式。這是一種串行通信協(xié)議,用于在微處理器和外圍設(shè)備之間進(jìn)行數(shù)據(jù)傳輸。I2C通信使用兩根線:一根是時鐘線(SCL),用于同步數(shù)據(jù)的傳輸和接收;另一根是數(shù)據(jù)線(SDA),用于數(shù)據(jù)的傳輸和接收。AHT10通過I2C接口與微處理器或微控制器進(jìn)行通信,實(shí)現(xiàn)溫濕度數(shù)據(jù)的讀取,IIC驅(qū)動例程見上文:基于STM32物聯(lián)網(wǎng)環(huán)境采集系統(tǒng)設(shè)計(jì) --------BH1750光照檢測強(qiáng)度(4)-CSDN博客
不過值得注意的是,在使用AHT10與單片機(jī)進(jìn)行IIC通信時盡量不要使用多個IIC設(shè)備使用同一組IIC接口,最好能夠獨(dú)立使用一組IIC與AHT10進(jìn)行通信,詳情見數(shù)據(jù)手冊:
五、AHT10的時序圖
5-1、AHT10測量指令時序圖解析
圖(2)AHT10發(fā)送測量命令時序圖
從時序圖可以看出,AHT10觸發(fā)測量數(shù)據(jù)的指令分為以下步驟:
- 起始信號
- 寫指令時IIC地址:0X70
- 讀應(yīng)答信號
- 發(fā)送觸發(fā)測量指令0xAC
- 讀應(yīng)答信號
- 發(fā)送觸發(fā)測量指令0x33
- 讀應(yīng)答信號
- 發(fā)送觸發(fā)測量指令0x00
- 讀應(yīng)答信號
- 結(jié)束信號
? ? ? ? 其中IIC地址0X70由七位地址0x38(011 1000)+ 第八位讀寫位(向左移一位)后,寫指令為:0x70(0111 0000),讀指令為:0x71(0111 0001),數(shù)據(jù)手冊解析如下圖所示:
圖(3)AHT10設(shè)備地址解析圖
5-2、AHT10讀數(shù)據(jù)時序圖解析
?圖(4)AHT10讀數(shù)據(jù)時序解析圖
- 起始信號
- 讀數(shù)據(jù)時IIC地址:0X71
- 讀應(yīng)答信號
- 讀取AHT10當(dāng)前狀態(tài)
- 寫應(yīng)答信號
- 讀取濕度數(shù)據(jù)
- 寫應(yīng)答信號
- 讀取濕度數(shù)據(jù)
- 寫應(yīng)答信號
- 讀取濕度低四位和溫度高四位數(shù)據(jù)
- 寫應(yīng)答信號
- 讀取溫度數(shù)據(jù)
- 寫應(yīng)答信號
- 讀取溫度數(shù)據(jù)
- 寫非應(yīng)答信號
- 結(jié)束信號
????????其中濕度與溫度的數(shù)據(jù)為20位數(shù)據(jù),所以分別需要讀兩次數(shù)據(jù),其中第三次讀取數(shù)據(jù)的時候濕度的低四位與溫度的高四位共同保存在一個變量或數(shù)組內(nèi)。
5-3、AHT10的溫濕度轉(zhuǎn)換公式
溫濕度的轉(zhuǎn)換公式如下圖所示:
?圖(5)AHT10數(shù)據(jù)轉(zhuǎn)換公式
六、IIC的GPIO配置
? 6-1、AHT10.C文件
#include "AHT10.H"
#include "Delay.H"
#define AHT10_Addr 0X70
uint8_t AHT10_BUF[6];
#define AHT10_SDA_GPIO GPIO_Pin_13
#define AHT10_SCL_GPIO GPIO_Pin_14
#define AHT10_IIC_GPIO GPIOB
void AHT10_MyI2C_W_SCL(uint8_t BitValue)
{
GPIO_WriteBit(AHT10_IIC_GPIO, AHT10_SCL_GPIO, (BitAction)BitValue);
delay_us(10);
}
void AHT10_MyI2C_W_SDA(uint8_t BitValue)
{
GPIO_WriteBit(AHT10_IIC_GPIO, AHT10_SDA_GPIO, (BitAction)BitValue);
delay_us(10);
}
uint8_t AHT10_MyI2C_R_SDA(void)
{
uint8_t BitValue;
BitValue = GPIO_ReadInputDataBit(AHT10_IIC_GPIO, AHT10_SDA_GPIO);
delay_us(10);
return BitValue;
}
void AHT10_MyI2C_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_InitStructure.GPIO_Pin = AHT10_SDA_GPIO | AHT10_SCL_GPIO;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(AHT10_IIC_GPIO, &GPIO_InitStructure);
GPIO_SetBits(AHT10_IIC_GPIO, AHT10_SDA_GPIO | AHT10_SCL_GPIO);
}
/**
* @brief IIC啟動函數(shù)
* @param 無
* @retval 無
**/
void AHT10_MyI2C_Start(void)
{
AHT10_MyI2C_W_SDA(1);
AHT10_MyI2C_W_SCL(1);
AHT10_MyI2C_W_SDA(0);
AHT10_MyI2C_W_SCL(0);
}
/**
* @brief IIC結(jié)束函數(shù)
* @param 無
* @retval 無
**/
void AHT10_MyI2C_Stop(void)
{
AHT10_MyI2C_W_SDA(0);
AHT10_MyI2C_W_SCL(1);
AHT10_MyI2C_W_SDA(1);
}
/**
* @brief IIC發(fā)送一個字節(jié)
* @param data為寫入的數(shù)據(jù)
* @retval 無
**/
void AHT10_MyI2C_SendByte(uint8_t Byte)
{
uint8_t i;
for (i = 0; i < 8; i ++)
{
AHT10_MyI2C_W_SDA(Byte & (0x80 >> i));
AHT10_MyI2C_W_SCL(1);
AHT10_MyI2C_W_SCL(0);
}
}
/**
* @brief IIC讀取一個字節(jié)
* @param
* @retval 字節(jié)數(shù)據(jù)
**/
uint8_t AHT10_MyI2C_ReceiveByte(void)
{
uint8_t i, Byte = 0x00;
AHT10_MyI2C_W_SDA(1);
for (i = 0; i < 8; i ++)
{
AHT10_MyI2C_W_SCL(1);
if (AHT10_MyI2C_R_SDA() == 1){Byte |= (0x80 >> i);}
AHT10_MyI2C_W_SCL(0);
}
return Byte;
}
/**
* @brief IIC發(fā)送應(yīng)答信號
* @param
* @retval
**/
void AHT10_MyI2C_SendAck(uint8_t AckBit)
{
AHT10_MyI2C_W_SDA(AckBit);
AHT10_MyI2C_W_SCL(1);
AHT10_MyI2C_W_SCL(0);
}
/**
* @brief IIC等待應(yīng)答信號
* @param
* @retval
**/
uint8_t AHT10_MyI2C_ReceiveAck(void)
{
uint8_t AckBit;
AHT10_MyI2C_W_SDA(1);
AHT10_MyI2C_W_SCL(1);
AckBit = AHT10_MyI2C_R_SDA();
AHT10_MyI2C_W_SCL(0);
return AckBit;
}
void AHT10_Init(void)
{
AHT10_MyI2C_Init();
delay_ms(50);
}
void AHT10_Rand_Data(float *humi,float *temp)
{
uint8_t AHT_State,i;
uint32_t temp_bit,humi_bit;
AHT10_MyI2C_Start();
AHT10_MyI2C_SendByte(AHT10_Addr);
AHT10_MyI2C_ReceiveAck();
AHT10_MyI2C_SendByte(0XAC);
AHT10_MyI2C_ReceiveAck();
AHT10_MyI2C_SendByte(0X33);
AHT10_MyI2C_ReceiveAck();
AHT10_MyI2C_SendByte(0X00);
AHT10_MyI2C_ReceiveAck();
AHT10_MyI2C_Stop();
delay_ms(80);
AHT10_MyI2C_Start();
AHT10_MyI2C_SendByte(AHT10_Addr + 1);
AHT10_MyI2C_ReceiveAck();
AHT_State = AHT10_MyI2C_ReceiveByte();
AHT10_MyI2C_SendAck(0);
if((AHT_State & 0x80) == 0)
{
for(i=0;i<5;i++)
{
AHT10_BUF[i] = AHT10_MyI2C_ReceiveByte();
if(i == 4)
{
AHT10_MyI2C_SendAck(1);
}
else AHT10_MyI2C_SendAck(0);
}
AHT10_MyI2C_Stop();
humi_bit = (AHT10_BUF[0]<<12)|(AHT10_BUF[1]<<4)|(AHT10_BUF[2]>>4);
temp_bit = ((AHT10_BUF[2]&0X0F)<<16)|(AHT10_BUF[3]<<8)|(AHT10_BUF[4]);
*humi = (humi_bit * 100.0/1024/1024+0.5);
*temp = (temp_bit * 2000.0/1024/1024+0.5)/10.0-50;
}
}
6-2、AHT10.H文件
#ifndef __AHT10_H
#define __AHT10_H
#include "stm32f10x.h"
void AHT10_MyI2C_Init(void);
void AHT10_MyI2C_Start(void);
void AHT10_MyI2C_Stop(void);
void AHT10_MyI2C_SendByte(uint8_t Byte);
uint8_t AHT10_MyI2C_ReceiveByte(void);
void AHT10_MyI2C_SendAck(uint8_t AckBit);
uint8_t AHT10_MyI2C_ReceiveAck(void);
void AHT10_Init(void);
void AHT10_Rand_Data(float *humi,float *temp);
#endif
6-3、main函數(shù)代碼
#include "stm32f10x.h"
#include "stdio.h"
#include "USAR.h"
#include "delay.h"
#include "AHT10.H"
/*
歡迎加入QQ群聊:726328854
CSDN:云平臺產(chǎn)品創(chuàng)建及添加鏈接:https://blog.csdn.net/qq_44942724/article/details/134492924
嗶哩嗶哩視頻:https://www.bilibili.com/video/BV1mw411H7bh/?spm_id_from=333.999.0.0
CSDN:BH1750光照傳感器原理及驅(qū)動代碼鏈接:https://blog.csdn.net/qq_44942724/article/details/134757983?spm=1001.2014.3001.5501
有道云筆記鏈接:https://note.youdao.com/ynoteshare/index.html?id=99a39eb24282bf94ed55c613cb81fe03&type=note&_time=1700385978659
*/
float AHT10_Temp;
float AHT10_Humi;
int main(void)
{
delay_init();
usart1_Init(115200);
AHT10_Init();
while(1)
{
AHT10_Rand_Data(&AHT10_Humi,&AHT10_Temp);
}
}
七、實(shí)現(xiàn)的功能
????????本文最終實(shí)現(xiàn)STM32F103C8T6單片機(jī)讀取AHT10溫濕度傳感器的數(shù)據(jù),并溫濕度保存至變量:AHT10_Humi和AHT10_Temp中,后續(xù)將會把檢測到的溫濕度顯示在OLED屏幕中,并將溫濕度上傳至ONENET物聯(lián)網(wǎng)云平臺。
ONENET物聯(lián)網(wǎng)云平臺的產(chǎn)品添加:1-ONENET云平臺的產(chǎn)品及設(shè)備添加_嗶哩嗶哩_bilibili文章來源:http://www.zghlxwxcb.cn/news/detail-837125.html
詳細(xì)內(nèi)容:云平臺的產(chǎn)品及設(shè)備添加、STM32代碼移植、微信小程序獲取云平臺數(shù)據(jù)、手機(jī)APP獲取云平臺數(shù)據(jù)筆記鏈接:https://note.youdao.com/ynoteshare/index.html?id=99a39eb24282bf94ed55c613cb81fe03&type=note&_time=1700385978659文章來源地址http://www.zghlxwxcb.cn/news/detail-837125.html
到了這里,關(guān)于基于STM32物聯(lián)網(wǎng)環(huán)境采集系統(tǒng)設(shè)計(jì) --------AHT10溫濕度檢測(5)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!