【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
-
- uint8_t readBuffer[6] = {0};
-
-
-
-
-
-
-
- void AHT10_Init()
- {
- uint8_t readBuffer;
- HAL_Delay(20);
-
-
- HAL_I2C_Master_Receive(&hi2c1, AHT10_ADDRESS, &readBuffer, 1, HAL_MAX_DELAY);
-
-
- if ((readBuffer & 0x08) == 0x00)
- {
- uint8_t sendBuffer[3] = {0xBE, 0x08, 0x00};
- HAL_I2C_Master_Transmit(&hi2c1, AHT10_ADDRESS, sendBuffer, 3, HAL_MAX_DELAY);
- }
- }
-
-
- 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);
-
-
- HAL_I2C_Master_Receive(&hi2c1, AHT10_ADDRESS, readBuffer, 6, HAL_MAX_DELAY);
-
-
- if ((readBuffer[0] & 0x80) == 0x00)
- {
- uint32_t data = 0;
-
-
- data = ((uint32_t)readBuffer[3] >> 4) + ((uint32_t)readBuffer[2] << 4) + ((uint32_t)readBuffer[1] << 12);
- *Humidity = data * 100.0f / (1 << 20);
-
-
- 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"
-
-
- void AHT10_Init();
-
-
- void AHT10_Read(float *Temperature, float *Humidity);
-
- #endif
-
串口初始化部分和声明省略,这里直接看主函数如何调用
-
- AHT10_Init();
- float temperature, humidity;
-
-
-
-
- while (1)
- {
-
-
-
- AHT10_Read(&temperature, &humidity);
-
-
- printf("Temperature: %.1f DU\r\n", temperature);
- printf("Humidity: %.1f %%\r\n", humidity);
-
-
- HAL_Delay(2000);
-
-
- }
-
- }
为什么延时2s,已经在前面原理部分讲过了,本质上即为2s测一次温度
四、串口测试
最后把数据打印出来看看,对比今天的气温
可以看到串口打印的数据如下:
现在室温体感大约就是25度,然后我用手把传感器空捂住,他的湿度和温度会上升,尤其是湿度,湿度可以干到差不多80-90
若不采用空捂,用拇指接触传感器部分,则湿度不会很高,温度会上升,明显上升到30度
最后补上硬件连接图
|