212|0

56

帖子

2

TA的资源

一粒金砂(高级)

楼主
 

【STM32 H533RE】测评八_温湿度传感器AHT10的测试 [复制链接]

本帖最后由 Zhao_kar 于 2025-3-23 20:41 编辑

【STM32 H533RE】测评八_温湿度传感器AHT10的测试

备注:下一节补一个spi的测试,不用ld3320是因为最后LS要求不要扩展语音识别,只需要实现播报就行了,所以为了原先的计划,spi测试直接用oled做了,然后这个aht10是一个iic通信的传感器,会怎么驱动就可以直接读数据,读到数据之后如何去做处理,提高精度这部分,这里不讲了,本节就只是简单做一个aht10的测试,以及aht10的驱动是从网上学的,我也是第一次用这个传感器,但是感觉跟之前玩过的dh差不了多少。

一、aht10的原理和市面上常见温湿度传感器的选型区别

1、先说选型,目前你网上随便一找,最多的就是dht10这个,然后某陶上一搜也是就那几个常见的,其实都大差不差,具体选型原因如下:

首先目前市面上大部分湿度传感器在检测湿度的同时还可以检测温度,所以做温湿度检测的系统,只需要一个温湿度传感器,不必选用专门的温度传感器。常见的湿度传感器有DHT11、SHT11、AM2320、AHT10,因为设计要求温度范围应在-10度到50度,湿度范围应在20%到80%,所以无法选用DHT11,DHT温度范围只在0-50度,无法满足需求,而SHT11范围在-40度到125度,湿度范围在0到100%RH,性能符合要求,AM2320和AHT10也在范围上符合设计要求,考虑到AHT10价格更低,且参数合适,因此传感器部分选择AHT10。

原因如上,某陶买个aht10模块,也就一个指甲盖大,价格也很美丽,不到两位数还包邮,所以选择这个。

2、然后是原理部分

这一个部分多写一点iic的,毕竟之前oled没详细说明,对比常用的串口,串口两根线是全双工工作的,rxtx独立发信息,而iic表面上也是两根线,实际上一个是scl一个是sda,sda是传输数据的,这种是半双工模式,同时因为是这种半双工的工作状态,所以会有主机和从机,这属于一种总线,类似于上一节的ds18b20,简单来说就是一主机多从机的工作状态,只需要对相应的从机地址进行操作即可在这个总线内实现资源调度。然后scl是干什么的呢,对比串口就能明白了,之前设置串口屏的时候,不仅在单片机里面设定了通信的比特率,还在HMI里面设定了波特率,也就是说这个通信时钟是双方统一好的,而iic就不是,他是通过scl这个线来实现沟通的。

3、aht10部分,具体见文档,这里列举一些会在代码里面提到的

首先是供电,3.3v,文档说过的是1.8v到3.6v范围,同时我们要做一个延时,延时这部分先知道是20ms,具体怎么操作代码部分再说

 

然后是时序部分,这里了解一下即可

 

根据前面说的设备从机的地址,我们根据文档可以知道aht10的从机地址是0x38,如下

 

与此同时,因为传输的是一个字节,所以0x38是前七个bit,最后一个bit会需要知道是0还是1,这个决定读写操作。

但是设置地址是我们直接设置0x70,其实就是0111 0000,然后hal库会自动设置读写部分,所以宏定义部分设置70即可。

还有一个是触发测量指令,这个部分见文档,按照操作即可

 

其实就是0xac

最后是温湿度数据的读取,主要指导格式,读取时注意即可,也就是每组数据两个半字节,也就是20bit

 

最后是备注部分,代码里面延时75ms也是因为这个原因,如下:

 

然后还有一个tips,这里建议2s测一次,代码最后部分会说清楚,先放图在这里:

 

二、cubemx部分的配置

这个其实很简单,开个串口和一个IIC即可,跟之前配置oled没区别,如下,时钟树习惯性给72

 

 

 

 

三、代码部分

这里我把注释写在代码里面了,详情见下:

  • #include "aht10.h"
  • #define AHT10_ADDRESS 0x70 // AHT10 设备 I2C 地址
  • uint8_t readBuffer[6] = {0};
  • // 设备地址 0x38(7 位地址)+ 读/写位(1 位)=> 0x70
  • // AHT10 传输指令格式:
  • // - 设备地址 (7-bit) + 读/写位 (1-bit)
  • // - 初始化命令 0xE1
  • // - 读取温湿度命令 0xAC
  • /**
  • * @brief 初始化 AHT10 传感器
  • * @note 设备上电后需要最多 20ms 进入空闲状态,然后才能接受主机指令
  • */
  • void AHT10_Init()
  • {
  • uint8_t readBuffer;
  • HAL_Delay(20); // 等待 AHT10 进入空闲状态
  • // 读取设备状态字节,检查设备是否已初始化
  • HAL_I2C_Master_Receive(&hi2c1, AHT10_ADDRESS, &readBuffer, 1, HAL_MAX_DELAY);
  • // 检查状态字节的 bit[3] (CAL_ENABLE),若未初始化,则发送初始化命令
  • if ((readBuffer & 0x08) == 0x00)
  • {
  • uint8_t sendBuffer[3] = {0xBE, 0x08, 0x00}; // 初始化命令
  • HAL_I2C_Master_Transmit(&hi2c1, AHT10_ADDRESS, sendBuffer, 3, HAL_MAX_DELAY);
  • }
  • }
  • /**
  • * @brief 读取 AHT10 传感器的温度和湿度
  • * @param Temperature: 存储温度数据的变量指针
  • * @param Humidity: 存储湿度数据的变量指针
  • * @note 传感器测量时间约为 75ms,需要延时等待数据可用
  • */
  • void AHT10_Read(float *Temperature, float *Humidity)
  • {
  • uint8_t sendBuffer[3] = {0xAC, 0x33, 0x00}; // 触发测量命令
  • uint8_t readBuffer[6] = {0}; // 存储读取的数据
  • // 发送测量指令
  • HAL_I2C_Master_Transmit(&hi2c1, AHT10_ADDRESS, sendBuffer, 3, HAL_MAX_DELAY);
  • HAL_Delay(75); // 等待测量完成
  • // 读取 6 字节数据:状态字节 + 5 字节数据
  • HAL_I2C_Master_Receive(&hi2c1, AHT10_ADDRESS, readBuffer, 6, HAL_MAX_DELAY);
  • // 确保状态字节的 bit[7] (BUSY) 为 0,表示测量完成
  • if ((readBuffer[0] & 0x80) == 0x00)
  • {
  • uint32_t data = 0;
  • // 计算湿度值 (20-bit 数据)
  • data = ((uint32_t)readBuffer[3] >> 4) + ((uint32_t)readBuffer[2] << 4) + ((uint32_t)readBuffer[1] << 12);
  • *Humidity = data * 100.0f / (1 << 20); // 转换为百分比 RH
  • // 计算温度值 (20-bit 数据)
  • data = (((uint32_t)readBuffer[3] & 0x0F) << 16) + ((uint32_t)readBuffer[4] << 8) + (uint32_t)readBuffer[5];
  • *Temperature = data * 200.0f / (1 << 20) - 50; // 转换为摄氏度
  • }
  • }

h文件声明

  • #ifndef __DHT10_H__
  • #define __DHT10_H__
  • #include "i2c.h"
  • #include "main.h"
  • // 初始化AHT10
  • void AHT10_Init();
  • // 获取温度和湿度
  • void AHT10_Read(float *Temperature, float *Humidity);
  • #endif

串口初始化部分和声明省略,这里直接看主函数如何调用

  • /* USER CODE BEGIN 2 */
  • AHT10_Init(); // 初始化 AHT10
  • float temperature, humidity; // 温度和湿度变量
  • /* USER CODE END 2 */
  • /* Infinite loop */
  • /* USER CODE BEGIN WHILE */
  • while (1)
  • {
  • /* USER CODE END WHILE */
  • // 读取温湿度
  • AHT10_Read(&temperature, &humidity);
  • // 打印温湿度
  • printf("Temperature: %.1f DU\r\n", temperature);
  • printf("Humidity: %.1f %%\r\n", humidity);
  • // 延时 2 秒
  • HAL_Delay(2000);
  • /* USER CODE BEGIN 3 */
  • }
  • /* USER CODE END 3 */
  • }

为什么延时2s,已经在前面原理部分讲过了,本质上即为2s测一次温度

四、串口测试

最后把数据打印出来看看,对比今天的气温

 

可以看到串口打印的数据如下:

 

现在室温体感大约就是25度,然后我用手把传感器空捂住,他的湿度和温度会上升,尤其是湿度,湿度可以干到差不多80-90

 

若不采用空捂,用拇指接触传感器部分,则湿度不会很高,温度会上升,明显上升到30度

 

最后补上硬件连接图

 

此帖出自stm32/stm8论坛
点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条
有奖直播 | AI之眼——安森美图像传感器 报名中
直播时间:2025年4月25日(周五)上午10:00-11:30
直播主题:AI之眼——安森美图像传感器
报名观看直播、直播间提问、填写问卷均有机会获得精美礼品!

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 14

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表