目录
一、电路连接图
二、AHT10模块简介
三、AHT10模块工作原理
四、AHT10的通信方式
五、AHT10的时序图
5-1、AHT10测量指令时序图解析
5-2、AHT10读数据时序图解析
5-3、AHT10的温湿度转换公式
六、IIC的GPIO配置
6-1、AHT10.C文件
6-2、AHT10.H文件
七、实现的功能
一、电路连接图
图(1)AHT10电路连接图
二、AHT10模块简介
AHT10是一款高精度、完全校准、贴片封装的温湿度传感器,使用MEMS的制作工艺,确保产品具有极高的可靠性与卓越的长期稳定性。该传感器包括一个电容式感湿元件和一个高性能CMOS微处理器相连接。其通信方式采用标准I²C通信方式,具有超小的体积、极低的功耗,使其成为各类应用甚至最为苛刻的应用场合的最佳选择。AHT10支持较宽的工作电源电压范围,该器件可为各类常见应用场景提供低成本和低功耗优势,AHT10模块的温湿度传感器均在高精度的恒温恒湿腔室中进行出厂校准,直接输出经温度补偿后的湿度、温度等信息,用户无需要对湿度进行温度补偿,便可得到准确的温湿度信息。其参数包括输入电压范围:1.8V至3.6V,出厂经过标定校准,产品具有温度补偿功能,具有I²C接口,超低功耗,SMD封装,湿度精度±2% RH(典型值),温度精度±0.3℃(典型值)。
三、AHT10模块工作原理
AHT10模块的湿度传感器采用电容式感湿元件,通过测量周围环境中湿度变化引起的电容变化来测量湿度。同时,它还采用了微处理器进行数据处理和校准,以获得更准确的湿度测量结果,另外,AHT10模块还配有一个标准片上温度传感元件,用于测量周围环境的温度。微处理器对湿度和温度数据进行处理和校准,然后通过IIC通讯方式输出经过温度补偿的温湿度信息。
四、AHT10的通信方式
AHT10的通信方式采用标准I2C通信方式。这是一种串行通信协议,用于在微处理器和外围设备之间进行数据传输。I2C通信使用两根线:一根是时钟线(SCL),用于同步数据的传输和接收;另一根是数据线(SDA),用于数据的传输和接收。AHT10通过I2C接口与微处理器或微控制器进行通信,实现温湿度数据的读取,IIC驱动例程见上文:基于STM32物联网环境采集系统设计 --------BH1750光照检测强度(4)-CSDN博客
不过值得注意的是,在使用AHT10与单片机进行IIC通信时尽量不要使用多个IIC设备使用同一组IIC接口,最好能够独立使用一组IIC与AHT10进行通信,详情见数据手册:
五、AHT10的时序图
5-1、AHT10测量指令时序图解析
图(2)AHT10发送测量命令时序图
从时序图可以看出,AHT10触发测量数据的指令分为以下步骤:
- 起始信号
- 写指令时IIC地址:0X70
- 读应答信号
- 发送触发测量指令0xAC
- 读应答信号
- 发送触发测量指令0x33
- 读应答信号
- 发送触发测量指令0x00
- 读应答信号
- 结束信号
其中IIC地址0X70由七位地址0x38(011 1000)+ 第八位读写位(向左移一位)后,写指令为:0x70(0111 0000),读指令为:0x71(0111 0001),数据手册解析如下图所示:
图(3)AHT10设备地址解析图
5-2、AHT10读数据时序图解析
图(4)AHT10读数据时序解析图
- 起始信号
- 读数据时IIC地址:0X71
- 读应答信号
- 读取AHT10当前状态
- 写应答信号
- 读取湿度数据
- 写应答信号
- 读取湿度数据
- 写应答信号
- 读取湿度低四位和温度高四位数据
- 写应答信号
- 读取温度数据
- 写应答信号
- 读取温度数据
- 写非应答信号
- 结束信号
其中湿度与温度的数据为20位数据,所以分别需要读两次数据,其中第三次读取数据的时候湿度的低四位与温度的高四位共同保存在一个变量或数组内。
5-3、AHT10的温湿度转换公式
温湿度的转换公式如下图所示:
图(5)AHT10数据转换公式
六、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启动函数
* @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结束函数
* @param 无
* @retval 无
**/
void AHT10_MyI2C_Stop(void)
{
AHT10_MyI2C_W_SDA(0);
AHT10_MyI2C_W_SCL(1);
AHT10_MyI2C_W_SDA(1);
}
/**
* @brief IIC发送一个字节
* @param data为写入的数据
* @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读取一个字节
* @param
* @retval 字节数据
**/
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发送应答信号
* @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等待应答信号
* @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函数代码
#include "stm32f10x.h"
#include "stdio.h"
#include "USAR.h"
#include "delay.h"
#include "AHT10.H"
/*
欢迎加入QQ群聊:726328854
CSDN:云平台产品创建及添加链接:https://blog.csdn.net/qq_44942724/article/details/134492924
哔哩哔哩视频:https://www.bilibili.com/video/BV1mw411H7bh/?spm_id_from=333.999.0.0
CSDN:BH1750光照传感器原理及驱动代码链接: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);
}
}
七、实现的功能
本文最终实现STM32F103C8T6单片机读取AHT10温湿度传感器的数据,并温湿度保存至变量:AHT10_Humi和AHT10_Temp中,后续将会把检测到的温湿度显示在OLED屏幕中,并将温湿度上传至ONENET物联网云平台。
ONENET物联网云平台的产品添加:1-ONENET云平台的产品及设备添加_哔哩哔哩_bilibili文章来源:https://www.toymoban.com/news/detail-837125.html
详细内容:云平台的产品及设备添加、STM32代码移植、微信小程序获取云平台数据、手机APP获取云平台数据笔记链接:https://note.youdao.com/ynoteshare/index.html?id=99a39eb24282bf94ed55c613cb81fe03&type=note&_time=1700385978659文章来源地址https://www.toymoban.com/news/detail-837125.html
到了这里,关于基于STM32物联网环境采集系统设计 --------AHT10温湿度检测(5)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!