AHT20 温湿度传感器驱动
一、AHT20 介绍
AHT20作为新一代温湿度传感器,在尺寸和智能方面树立了新标准。它嵌入在适合回流焊接的双排扁平无铅封装中,底部为 3 x 3 mm,高度为 1.0 mm。该传感器以标准 I2C 格式输出校准的数字信号。
AHT20 配备了全新设计的 ASIC 芯片、改进的 MEMS 半导体电容式湿度传感元件和标准的片上温度传感元件。
二、AHT20温湿度采集原理
(一)传感器特性:
- 电源电压 DC: 2.0 – 5.5V
- 测量范围(湿度): 0 ~ 100% RH
- 测量范围(温度): -40~+85℃
- 湿度精度: ± 2 % RH (25 ℃)
- 温度精度: ±0.3℃
(二)传感器读取流程
1. 上电后要等待40ms,读取温湿度值之前,首先要看状态字的校准使能位Bit[3]是否为1(通过发送0x71可以获取一个字节的状态字),如果不为1,要发送0xBE命令(初始化),此命令参数有两个字节,第一个字节为0x08,第二个字节为0x00,然后等待10ms;
2. 直接发送0xAC命令(触发测量),此命令参数有两个字节,第一个字节为0x33,第二个字节为0x00;
3. 等待80ms待测量完成,如果读取状态字Bit[7]为0,表示测量完成,然后可以连续读取六个字节;否则继续等待;
4. 接收完六个字节后,下一个字节是CRC校验数据,用户可以根据需要读出,如果接收端需要CRC校验,则在接收完第六个字节后发ACK应答,否则发NACK结束,CRC初始值为0XFF,CRC8校验多项式为:CRC[7:0]=1 + x^4 + x^5 + x^8
;
5. 计算温湿度值。
补充:传感器在采集时需要时间,主机发出测量指令(0xAC)后,延时80毫秒以上再读取转换后的数据并判断返回的状 态位是否正常。若状态比特位[Bit7]为0代表数据可正常 读取,为1时传感器为忙状态,主机需要等待数据处理完成。
(三)信号转换(解析函数)
1、相对湿度转换
相对湿度 RH 都可以根据 SDA 输出的相对湿度信号 SRH 通过如下公式计算获得(结果以 %RH 表示):
// 解析湿度数据(20 位)
uint32_t rawHumidity = ((uint32_t)(data[1] & 0x0F) << 16) | ((uint32_t)data[2] << 8) | data[3];
*humidity = (rawHumidity * 100.0) / 1048576.0;
2、温度转换
温度 T 都可以通过将温度输出信号 ST 代入到下面的公式计算得到(结果以温度 ℃ 表示):
// 解析温度数据(20 位)
uint32_t rawTemperature = (((uint32_t)(data[1] & 0xF0) >> 4) << 16) | ((uint32_t)data[4] << 8) | data[5];
*temperature = (rawTemperature * 200.0) / 1048576.0 - 50.0;
三、代码实现
(一)库的安装
- 点击左上角工具 -> 管理库
- 输入aht,安装AHT20库文件
(二)示例代码
/**************************************************************************
测试AHT20库的getTemperature和getHumidity函数
**************************************************************************/
#include <Wire.h> // 引入Wire库,用于I2C通信
#include <AHT20.h> // 引入AHT20库,用于操作AHT20温湿度传感器
AHT20 aht20; // 创建AHT20类的实例
void setup()
{
Serial.begin(115200); // 初始化串口通信,波特率为115200
Serial.println("AHT20 example"); // 输出示例信息到串口监视器
Wire.begin(); // 初始化I2C通信
// 尝试初始化AHT20传感器
if (aht20.begin() == false) // 如果传感器未被检测到
{
Serial.println("AHT20 not detected. Please check wiring. Freezing."); // 输出错误信息
while(true); // 进入无限循环,停止程序
}
}
void loop()
{
// 获取温度和湿度值
float temperature = aht20.getTemperature(); // 调用getTemperature函数获取温度
float humidity = aht20.getHumidity(); // 调用getHumidity函数获取湿度
// 输出温度和湿度到串口监视器
Serial.print("T: "); // 输出温度标签
Serial.print(temperature, 2); // 输出温度值,保留两位小数
Serial.print(" C\t H: "); // 输出湿度标签
Serial.print(humidity, 2); // 输出湿度值,保留两位小数
Serial.println("% RH"); // 输出湿度单位
delay(2000); // 延迟2000毫秒(2秒),以便下次读取
}
虽然代码中没有直接涉及计算公式,但在实际使用AHT20传感器时,获取的温度和湿度值通常是通过传感器内部的计算公式得出的。这些公式通常在传感器的文档中提供,您可以根据传感器的输出信号进行相应的计算。
(三)编译上传
- 代码编译成功并上传后,在工具中查找,或直接点击页面右上方小图标,打开内置的串口监视器;
设置底部串口监视器波特率为115200,可以看到当前AHT20采集的温湿度数据。