Skip to content

由 WangChong 贡献,Ai-Thinker 进行整理

【外设移植】Ai-WB2+AHT20 湿温度传感器

外设介绍

AHT20 是由 Aosong(奥松)公司推出的一款高精度温湿度传感器。与上一代 AHT10 相比,AHT20 具有更高的精度和更稳定的性能。

主要特点:

  • 高精度
    • 温度测量精度:±0.3°C
    • 湿度测量精度:±2% RH
  • 宽工作范围
    • 温度测量范围:-40°C 到 85°C
    • 湿度测量范围:0% RH 到 100% RH
  • 数字输出
    • I²C 通信接口,便于与各种微控制器和开发板集成。
  • 低功耗
    • 适用于低功耗应用,如电池供电设备。
  • 快速响应时间
    • 响应速度快,适合实时温湿度监测。
  • 校准和补偿
    • 传感器出厂时已校准,使用过程中无需再次校准。
  • 封装

小巧封装,便于集成在各种应用中。

**应用场景:**AHT20 被广泛应用于需要高精度温湿度监测的场景,例如:

  • 智能家居(如空气质量监测器、智能空调)
  • 工业自动化
  • 气象站
  • 医疗设备
  • 农业环境监控

AHT20 的 I²C 接口使其能够与各种常见的单片机轻松连接,并且提供丰富的库和驱动支持,方便开发者快速集成使用。

移植过程

根据数据手册得知, AHT20 是使用的 I2C 通信,同时我们使用的是 WB2,因此我们需要根据原理图确认 WB2 的 IIC 接口 PIN,由于我使用的是 WB2-12f 的开发板,所以可以在安信可社区 Wb2 专题下找到对应的原理图,同时根据博流官方 GPIO 的功能复用可以找到哪些 PIN 支持 IIC

我们拷贝SDK/application/iot_solusion中的任何一个项目, 然后删除里面的所有代码。同时修改对应得项目名称。重新命名为demo_aht20.

我们根据AHT20得官方文档编写驱动函数。 来读取AHT20传感器得湿度和温度数据。其中如果你拷贝的是IIC相关的项目, 你可以使用之前的IIC驱动。

上传的附件:

AHT20产品规格书(中文版) B1.pdf(1.7 MB, 下载次数: 8)

代码如下所示

📜 点击展开完整代码
c
#include <stdio.h>
#include <FreeRTOS.h>
#include <task.h>
#include <hosal_i2c.h>
#include <bl_gpio.h>
#include <blog.h>
#define AHT20_DEFAULT_ADDR 0x38 // AHT20 I2C地址
#define AHT20_CMD_INIT 0xE1       // AHT20初始化命令
#define AHT20_CMD_TRIGGER 0xAC    // AHT20触发测量命令
#define AHT20_CMD_SOFT_RESET 0xBA // AHT20软复位命令
// AHT20 传感器数据的结构体
#pragma pack(1)
struct aht20_data
{
uint8_t status;
uint8_t humidity_high;
uint8_t humidity_mid;
uint8_t humidity_low;
uint8_t temp_high;
uint8_t temp_mid;
uint8_t temp_low;
};
#pragma pack()
// 初始化AHT20传感器
static void aht20_init(hosal_i2c_dev_t *i2c)
{
uint8_t init_cmd[3] = {AHT20_CMD_INIT, 0x08, 0x00};                              // 初始化命令
hosal_i2c_master_send(i2c, AHT20_DEFAULT_ADDR, init_cmd, sizeof(init_cmd), 100); // 发送初始化命令
}
// 触发AHT20测量
static void aht20_trigger_measurement(hosal_i2c_dev_t *i2c)
{
uint8_t trigger_cmd[3] = {AHT20_CMD_TRIGGER, 0x33, 0x00};                              // 触发测量命令
hosal_i2c_master_send(i2c, AHT20_DEFAULT_ADDR, trigger_cmd, sizeof(trigger_cmd), 100); // 发送测量命令
}
// 主函数
int main(void)
{
// I2C 设备配置
static hosal_i2c_dev_t i2c0 = {
.config = {
.address_width = HOSAL_I2C_ADDRESS_WIDTH_7BIT, // 7位I2C地址模式
.freq = 100000,                                // 100kHz I2C速率
.mode = HOSAL_I2C_MODE_MASTER,                 // 主模式
.scl = 12,                                     // SCL连接到GPIO 12
.sda = 3,                                      // SDA连接到GPIO 3
},
.port = 0, // I2C端口号
};
hosal_i2c_init(&i2c0); // 初始化I2C
aht20_init(&i2c0); // 初始化AHT20传感器
for (;;)
{                                     // 无限循环,定时读取温湿度数据
aht20_trigger_measurement(&i2c0); // 触发AHT20进行一次测量
vTaskDelay(portTICK_RATE_MS * 100); // 延时100ms,等待测量完成
struct aht20_data data;                                                                // 数据存储结构体
hosal_i2c_master_recv(&i2c0, AHT20_DEFAULT_ADDR, (uint8_t *)&data, sizeof(data), 100); // 接收传感器返回的数据
if ((data.status & 0x80) == 0)
{                                                                                                                                 // 检查数据是否有效
uint32_t humidity_raw = ((uint32_t)data.humidity_high << 12) | ((uint32_t)data.humidity_mid << 4) | (data.humidity_low >> 4); // 提取湿度数据
uint32_t temp_raw = (((uint32_t)data.temp_high & 0x0F) << 16) | ((uint32_t)data.temp_mid << 8) | data.temp_low;               // 提取温度数据
float humidity = (humidity_raw * 100.0) / 1048576.0;       // 转换为实际湿度
float temperature = (temp_raw * 200.0) / 1048576.0 - 50.0; // 转换为实际温度
blog_info("Temperature: %.2f C, Humidity: %.2f %%\r\n", temperature, humidity); // 输出温湿度数据
}
else
{
blog_error("AHT20 Data Invalid\r\n"); // 数据无效时输出错误信息
}
vTaskDelay(portTICK_RATE_MS * 1000); // 延时1秒,进入下一次测量
}
return 0;
}

烧录验证

我这里的这个AHT20的温度传感器可能有问题。它上下温度漂移太大了,请哪位大佬手中有这个传感器了帮我验证一下这个代码是否可以用你的传感器正常工作

我这里就不修改为库函数的形式了,方便直接编译烧录验证。

项目工程如下

上传的附件:

demo_aht20.zip(307.34 KB, 下载次数: 9)

如何使用

将项目解压后拷贝到SDK/application/iot-solusion目录下, 然后进入到项目的根目录执行make -j 编译

Released under the MIT License. Build Time 2026-09-11 14:52:23