AHT10溫濕度傳感器介紹
①實物圖
②產(chǎn)品說明
AHT10是新一代的溫濕度傳感器,使用SMD封裝,上面有一個改進(jìn)型的MEMS半導(dǎo)體電容式濕度傳感器和一個標(biāo)準(zhǔn)的片上溫度傳感器原件,可用于空調(diào),除濕器等溫濕度控制領(lǐng)域的檢測。
③電氣參數(shù)
電氣參數(shù) | AHT10模塊 |
---|---|
工作電壓 | DC1.8-3.3V |
通訊接口 | IIC |
濕度 | 分辨率:0.024 %RH 誤差:±2%RH |
溫度 | 分辨率:0.01℃ 誤差:±0.3℃ |
④AHT10工作原理
AHT10使用IIC通訊,在使用其作為溫濕度檢測相關(guān)控制時候,需要注意其相關(guān)時許和相關(guān)寄存器操作說明,啟動和停止時許如下:
驅(qū)動代碼
①OLED相關(guān)驅(qū)動代碼
OLED的代碼在一些開源網(wǎng)站上面,基本上都已經(jīng)開源了其底層驅(qū)動代碼,并寫好了相關(guān)接口,在這里我不做詳細(xì)介紹,需要的小伙伴可以自行下載,鏈接:http://www.lcdwiki.com/zh/0.96inch_OLED_Module_MC096VX
②AHT10的STM32端口模擬IIC代碼
STM32使用模擬IIC的時候跟51單片機有輕微區(qū)別,需要配置引腳的輸入輸出模式。
#include "I2C.h"
#include "delay.h"
#define SDA GPIO_Pin_7
#define SCL GPIO_Pin_6
#define I2C_Prot GPIOB
#define SDA_High GPIO_SetBits(I2C_Prot,SDA)
#define SDA_Low GPIO_ResetBits(I2C_Prot,SDA)
#define SCL_High GPIO_SetBits(I2C_Prot,SCL)
#define SCL_Low GPIO_ResetBits(I2C_Prot,SCL)
void SDA_OUT(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = SDA;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(I2C_Prot,&GPIO_InitStructure);
}
void SDA_IN(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = SDA;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(I2C_Prot,&GPIO_InitStructure);
}
//初始化IIC
void I2C_Initation(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE ); //使能GPIOB時鐘
GPIO_InitStructure.GPIO_Pin = SDA|SCL;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; //推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(I2C_Prot, &GPIO_InitStructure);
GPIO_SetBits(I2C_Prot,SDA|SCL); //PB6,PB7 輸出高
}
//IIC起始信號
void I2C_Start(void)
{
SDA_OUT(); //SDA設(shè)置為輸出
SDA_High;
SCL_High;
delay_us(4);
SDA_Low; //START:當(dāng)SCL為高電平時候,SCL拉低
delay_us(4);
SCL_Low; //準(zhǔn)備發(fā)送或接收
}
//IIC結(jié)束信號
void I2C_Stop(void)
{
SDA_OUT(); //SDA配置為輸出
SDA_Low; //STOP:當(dāng)SCL為低電平時候,SDA由低變?yōu)楦?/span>
delay_us(4);
SCL_High;
delay_us(4);
SDA_High; //發(fā)送IIC結(jié)束信號
delay_us(4);
}
u8 I2C_Write_Ack(void)
{
u8 TimeAck = RESET;
SDA_IN();
SCL_High;
delay_us(2);
while(GPIO_ReadInputDataBit(I2C_Prot,SDA))
{
if(++TimeAck > 250)
{
I2C_Stop();
return 1;
}
}
SCL_Low;
delay_us(2);
return 0;
}
// ack=0時, 不產(chǎn)生ACK應(yīng)答, ack=1時候,產(chǎn)生ACK應(yīng)答
void I2C_Is_Ack(u8 ack)
{
SCL_Low;
SDA_OUT();
if(ack)
SDA_Low;
else
SDA_High;
delay_us(2);
SCL_High;
delay_us(2);
SCL_Low;
}
//IIC發(fā)送一位數(shù)據(jù)
void I2C_Send_Byte(u8 txd)
{
SDA_OUT();
SCL_Low; //拉低時鐘開始傳輸
for(u8 t=0;t<8;t++)
{
if((txd&0x80)>>7)
SDA_High;
else
SDA_Low;
txd<<=1;
delay_us(2);
SCL_High;
delay_us(2);
SCL_Low;
delay_us(2);
}
}
//讀一位數(shù)據(jù),ack=1時,發(fā)送ACK,ack=0,發(fā)送nACK
u8 I2C_Read_Byte(unsigned char ack)
{
unsigned char i,receive=0;
SDA_IN(); //SDA設(shè)置為輸入
for(i=0;i<8;i++ )
{
SCL_High;
delay_us(2);
receive<<=1;
if(READ_SDA)receive++;
SCL_Low;
delay_us(1);
}
if (!ack)
I2C_Is_Ack(0);
else
I2C_Is_Ack(1);
return receive;
}
//讀取一位數(shù)據(jù)
u8 I2C_Read_Data(void)
{
u8 Data = RESET;
SDA_IN();
for(u8 i=0;i<8;i++)
{
SCL_High;
delay_us(2);
Data <<= 1;
if(GPIO_ReadInputDataBit(I2C_Prot,SDA) == SET)
{
Data |= 0x01;
}
SCL_Low;
delay_us(2);
}
return Data;
}
③AHT10相關(guān)驅(qū)動
配合AHT10的手冊,先對其相關(guān)寄存器進(jìn)行宏定義,.H頭文件如下:
#ifndef _AHT10_H_
#define _AHT10_H_
#include "sys.h"
#include "delay.h"
#define AHT_ADDRESS 0X70 //0X38
#define AHT_WRITE 0X70
#define AHT_READ 0X71 //0X39
extern u8 ACK,DATA[6];
void AHT10_Write_Reset(void);
u8 AHT10_State(void);
u8 AHT10_Read_Humi_Temp(float *humidity, float *temperature);
#endif
數(shù)據(jù)處理函數(shù):使用指針的方式靈活操作在主函數(shù)中寫入
u8 AHT10_Read_Humi_Temp(float *humidity, float *temperature)
{
u32 humi = 0,temp = 0;
I2C_Start();
I2C_Send_Byte(AHT_WRITE);
I2C_Write_Ack();
I2C_Send_Byte(0XAC); //觸發(fā)測量
I2C_Write_Ack();
I2C_Send_Byte(0X33);
I2C_Write_Ack();
I2C_Send_Byte(0X00);
I2C_Write_Ack();
I2C_Stop();
delay_ms(80);
I2C_Start();
I2C_Send_Byte(AHT_READ);
I2C_Write_Ack();
ACK = I2C_Read_Data();
I2C_Is_Ack(1);
if((ACK&0X08) == 0)
{
AHT10_Write_Init();
}
if((ACK&0X80) == 0)
{
for(u8 i=0;i<5;i++){
DATA[i] = I2C_Read_Data();
if(i == 4)
I2C_Is_Ack(0);
I2C_Is_Ack(1);
}
I2C_Stop();
humi = (DATA[0]<<12)|(DATA[1]<<4)|(DATA[2]>>4);
temp = ((DATA[2]&0X0F)<<16)|(DATA[3]<<8)|(DATA[4]);
*humidity = (humi * 100.0/1024/1024+0.5);
*temperature = (temp * 2000.0/1024/1024+0.5)/10.0-50;
return 0;
}
I2C_Stop();
return 1;
}
具體測試現(xiàn)象
文章來源:http://www.zghlxwxcb.cn/news/detail-789684.html
總結(jié)
文章中使用的顯示方式為0.96寸OLED模塊顯示,驅(qū)動MCU使用的為STM32F103C8T6,在使用AHT10的過程中也可以自己根據(jù)AHT10的驅(qū)動代碼所得到的溫濕度值去做其他的接口應(yīng)用,例如做溫控風(fēng)扇,或者其他溫濕度控制系統(tǒng)案例均可移植使用,需要完整工程的可下方留言郵箱獲取。文章來源地址http://www.zghlxwxcb.cn/news/detail-789684.html
到了這里,關(guān)于STM32驅(qū)動AHT10&OLED顯示溫濕度的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!