STM32 AHT10温湿度传感器数据 机智云传输温湿度

本文介绍了AHT10温湿度传感器的使用方法,包括I2C配置、初始化、读取数据等步骤,并对比了其与DHT11的性能差异,指出AHT10具有更高的精度和更快的响应速度,适合对精度有要求的应用场景。

简介

大家所熟悉都用过的温湿度传感器应该是DHT11了吧,基本上学习单片机的都用过。
但是DHT11的精度不是很高,湿度±5%RH,温度±1℃,而且测试的时候一般还要延时3S左右测一下,测试频率慢,而且体积大,价格大概3块多一个吧。
在淘宝上搜索温湿度传感器,偶然发现AHT10传感器,价格2.5一个,体积小,精度湿度±2%RH,温度精度±0.3℃。这个是国产温湿度传感器,性价比是比较高的,所以在这里介绍一下AHT10温湿度传感器的使用。

AHT10
特性

工程文件

  1. AHT10.C
  2. AHT10.H
ATH10.C
#include "AHT10.H"

u8 ACK,DATA[6];

void AHT_I2C_UserConfig(void){
   
   
	
	GPIO_InitTypeDef GPIO_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF,ENABLE);
	
	GPIO_InitStructure.GPIO_Pin   = SDA|SCL;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
	GPIO_Init(I2C_Prot,&GPIO_InitStructure);
}
void AHT_I2C_SDA_Mode(u8 addr)
{
   
   
	
	GPIO_InitTypeDef GPIO_InitStructure;
	
	if(addr){
   
    //1 OUT
			
		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);	
	}
	else{
   
        //0 INPUT
		
		GPIO_InitStructure.GPIO_Pin   = SDA;
		GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IPU;
		GPIO_Init(I2C_Prot,&GPIO_InitStructure);
	}
}
void AHT_I2C_Start(void){
   
   
	
	AHT_I2C_SDA_Mode(OUT);
	
	SCL_High;
	SDA_High;
	delay_us(5);
	
	SDA_Low;
	delay_us(5);
	SCL_Low;
}
void AHT_I2C_Stop(void)
{
   
   
	
	AHT_I2C_SDA_Mode(OUT);
	
	SDA_Low;
	delay_us(5);
	SCL_High;
	delay_us(5);
	SDA_High;
	delay_us(5);
}
u8 AHT_I2C_Write_Ack(void)
{
   
   
	
	u8 TimeAck = RESET;
	
	AHT_I2C_SDA_Mode(INPUT);
	
	SCL_High;
	delay_us(2);
	
	while(GPIO_ReadInputDataBit(I2C_Prot,SDA))
	{
   
   
		
		if(++TimeAck > 250)
		{
   
   
			
			AHT_I2C_Stop();return 1;
		}
	}
	SCL_Low;
	delay_us(2);
	
	return 0;
}
void AHT_I2C_Write_Byte(u8 Data)
{
   
   
	
	SCL_Low;
	delay_us(2);
	
	for(u8 i=0;i<8;i++)
	{
   
   
		
		AHT_I2C_SDA_Mode(OUT);
		
		if((Data<<i)&0x80) 
			SDA_High; 
		else 
			SDA_Low;
		
		SCL_High;
		delay_us(2);
		SCL_Low;
		delay_us(2);
	}
}
u8 AHT_I2C_Read_Data(void)
{
   
   
	
	u8 Data = RESET;
	
	for(u8 i=0;i<8;i++)
	{
   
   
		
		AHT_I2C_SDA_Mode(INPUT); 
		
		SCL_High;
		delay_us(2);
		Data <<= 1; 
		
		if(GPIO_ReadInputDataBit(I2C_Prot,SDA) == SET)
		{
   
   
			
			Data |= 0x01;
		}
		
		SCL_Low;
		delay_us(2);
	}	
	return Data;
}
void AHT_I2C_Sende_Ack(u8 ack)
{
   
   
	
	AHT_I2C_SDA_Mode(OUT);
	
	if(ack)
		SDA_High;
	else
		SDA_Low;
	
	SCL_High;
	delay_us(2);
	SCL_Low;
	delay_us(2);
}
u8 AHT10_State(void)
{
   
           
//存在0 不存在 1
	
	u8 ACK;
	
	AHT_I2C_Start();
	AHT_I2C_Write_Byte(AHT_WRITE);
	ACK = AHT_I2C_Write_Ack();
	AHT_I2C_Stop();
	
	return ACK;
}
void AHT10_Write_Init(void)
{
   
    
//	bit3 0 1
	AHT_I2C_Start();
	AHT_I2C_Write_Byte(AHT_WRITE);
	AHT_I2C_Write_Ack();
	AHT_I2C_Write_Byte(0XE1);
	AHT_I2C_Write_Ack();
	AHT_I2C_Write_Byte(0X08);
	AHT_I2C_Write_Ack();
	AHT_I2C_Write_Byte(0X00);
	AHT_I2C_Write_Ack();
	AHT_I2C_Stop();
	delay_ms(40);
}
void AHT10_Write_Reset(void)
{
   
   
	AHT_I2C_Start();
	AHT_I2C_Write_Byte(AHT_WRITE);
	AHT_I2C_Write_Ack();
	AHT_I2C_Write_Byte(0XBA);
	AHT_I2C_Write_Ack();
	AHT_I2C_Stop();
	delay_ms(20);
}
u8 AHT10_Read_Humi_Temp(float *HUMI, float *TEMP)
{
   
    
// 0数据正常 1 数据错误
	u32 humi = 0,temp = 0;
	
	AHT_I2C_Start();
	AHT_I2C_Write_Byte(AHT_WRITE);
	AHT_I2C_Write_Ack();
	AHT_I2C_Write_Byte(0XAC);
	AHT_I2C_Write_Ack();
	AHT_I2C_Write_Byte(0X33);
	AHT_I2C_Write_Ack();
	AHT_I2C_Write_Byte(0X00);
	AHT_I2C_Write_Ack();
	AHT_I2C_Stop();
	delay_ms(80);
	
	AHT_I2C_Start();
	AHT_I2C_Write_Byte(AHT_READ);
	AHT_I2C_Write_Ack();
	ACK = AHT_I2C_Read_Data();
	AHT_I2C_Sende_Ack(0); 		//0000 1000 BIT3 0
	
	if((ACK&0X08) == 0)
	{
   
   
		AHT10_Write_Init();
	}
	if((ACK&0X80) == 0)
	{
   
    	
	//bit7 1 0
		for(u8 i=0;i<5;i++){
   
    // 0 1 2 3 4 5 ++i
			
			DATA[i] = AHT_I2C_Read_Data();
			
			if(i == 4)
				AHT_I2C_Sende_Ack(1);
			else
				AHT_I2C_Sende_Ack(0);
		}
		AHT_I2C_Stop();
		
		humi = (DATA[0]<<12)|(DATA[1]<<4)|(DATA[2]>>4);
		temp = ((DATA[2]&0X0F)<<16)|(DATA[3]<<8)|(DATA[4]);
		
		*HUMI = (humi * 100.0/1024/
### STM32 使用 AHT10 温湿度传感器 #### 配置 CubeMX 为了使STM32能够与AHT10温湿度传感器正常工作,在CubeMX中需配置I2C接口。选择合适的引脚作为SCLSDA,并启用相应的外设时钟[^1]。 ```c // I2C初始化函数,由CubeMX自动生成 HAL_StatusTypeDef MX_I2C1_Init(I2C_HandleTypeDef* hi2c) { /* USER CODE BEGIN I2C1_Init 0 */ /* USER CODE END I2C1_Init 0 */ /* USER CODE BEGIN I2C1_Init 1 */ /* USER CODE END I2C1_Init 1 */ hi2c->Instance = I2C1; hi2c->Init.Timing = 0x20909CEC; hi2c->Init.OwnAddress1 = 0; hi2c->Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; hi2c->Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; hi2c->Init.OwnAddress2 = 0; hi2c->Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; hi2c->Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; if (HAL_I2C_Init(hi2c) != HAL_OK) { Error_Handler(); } /** Configure Analogue filter */ if (HAL_I2CEx_ConfigAnalogFilter(hi2c, I2C_ANALOGFILTER_ENABLE) != HAL_OK) { Error_Handler(); } /** Configure Digital filter */ if (HAL_I2CEx_ConfigDigitalFilter(hi2c, 0) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN I2C1_Init 2 */ /* USER CODE END I2C1_Init 2 */ } ``` #### 主要代码分析 当准备就绪后,可以编写用于读取温度湿度值的主要程序逻辑。这通常涉及到向设备发送命令并解析返回的数据包。对于AHT10来说,首先要触发一次测量操作,之后再获取结果: ```c #include "main.h" #define AHT10_ADDR_WRITE 0x80 //写地址 #define AHT10_ADDR_READ 0x81 //读地址 #define CMD_INIT {0xE1, 0x08, 0x00} // 初始化指令 #define CMD_MEASURE {0xAC, 0x33, 0x00} // 测量指令 uint8_t aht10_init(void){ uint8_t cmd[3]; memcpy(cmd,CMD_INIT,sizeof(CMD_INIT)); HAL_Delay(1); return HAL_I2C_Master_Transmit(&hi2c1,AHT10_ADDR_WRITE,cmd,3,100)==HAL_OK?0:1; } float get_temperature_humidity(float *temperature,float *humidity){ uint8_t data[6]; float t,h; // 发送启动测量命令 HAL_I2C_Master_Transmit(&hi2c1,AHT10_ADDR_WRITE,CMD_MEASURE,3,100); // 延迟等待转换完成 HAL_Delay(80); // 接收数据 HAL_I2C_Master_Receive(&hi2c1,AHT10_ADDR_READ,data,6,100); h=((data[1]<<16)|(data[2]<<8)|data[3])>>4; t=(((data[3]&0xF)<<24)|(data[4]<<16)|(data[5]<<8))>>4; *humidity=h/1048576.0f*100.0f; *temperature=t/1048576.0f*200.0f-50.0f; return (*temperature,*humidity); } ``` 上述代码实现了基本的功能:`aht10_init()`负责初始化传感器;而`get_temperature_humidity()`则用来执行实际的测量任务并将得到的结果转化为易于理解的形式[^3]。
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值