发帖
6 0 0

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

WangChong
论坛元老

75

主题

857

回帖

1万

积分

论坛元老

积分
11289
Ai-WB2系列 610 6 2024-9-9 21:22:13
外设介绍



                               
登录/注册后可看大图



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



154025bz35vg1bf31mfvv1.png


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


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

微信图片_20240909212124.jpg


上传的附件: AHT20产品规格书(中文版) B1.pdf (1.7 MB, 下载次数: 5)



代码如下所示

  1. #include <stdio.h>
  2. #include <FreeRTOS.h>
  3. #include <task.h>
  4. #include <hosal_i2c.h>
  5. #include <bl_gpio.h>
  6. #include <blog.h>

  7. #define AHT20_DEFAULT_ADDR 0x38 // AHT20 I2C地址

  8. #define AHT20_CMD_INIT 0xE1       // AHT20初始化命令
  9. #define AHT20_CMD_TRIGGER 0xAC    // AHT20触发测量命令
  10. #define AHT20_CMD_SOFT_RESET 0xBA // AHT20软复位命令

  11. // AHT20 传感器数据的结构体
  12. #pragma pack(1)
  13. struct aht20_data
  14. {
  15.     uint8_t status;
  16.     uint8_t humidity_high;
  17.     uint8_t humidity_mid;
  18.     uint8_t humidity_low;
  19.     uint8_t temp_high;
  20.     uint8_t temp_mid;
  21.     uint8_t temp_low;
  22. };
  23. #pragma pack()

  24. // 初始化AHT20传感器
  25. static void aht20_init(hosal_i2c_dev_t *i2c)
  26. {
  27.     uint8_t init_cmd[3] = {AHT20_CMD_INIT, 0x08, 0x00};                              // 初始化命令
  28.     hosal_i2c_master_send(i2c, AHT20_DEFAULT_ADDR, init_cmd, sizeof(init_cmd), 100); // 发送初始化命令
  29. }

  30. // 触发AHT20测量
  31. static void aht20_trigger_measurement(hosal_i2c_dev_t *i2c)
  32. {
  33.     uint8_t trigger_cmd[3] = {AHT20_CMD_TRIGGER, 0x33, 0x00};                              // 触发测量命令
  34.     hosal_i2c_master_send(i2c, AHT20_DEFAULT_ADDR, trigger_cmd, sizeof(trigger_cmd), 100); // 发送测量命令
  35. }

  36. // 主函数
  37. int main(void)
  38. {
  39.     // I2C 设备配置
  40.     static hosal_i2c_dev_t i2c0 = {
  41.         .config = {
  42.             .address_width = HOSAL_I2C_ADDRESS_WIDTH_7BIT, // 7位I2C地址模式
  43.             .freq = 100000,                                // 100kHz I2C速率
  44.             .mode = HOSAL_I2C_MODE_MASTER,                 // 主模式
  45.             .scl = 12,                                     // SCL连接到GPIO 12
  46.             .sda = 3,                                      // SDA连接到GPIO 3
  47.         },
  48.         .port = 0, // I2C端口号
  49.     };

  50.     hosal_i2c_init(&i2c0); // 初始化I2C

  51.     aht20_init(&i2c0); // 初始化AHT20传感器

  52.     for (;;)
  53.     {                                     // 无限循环,定时读取温湿度数据
  54.         aht20_trigger_measurement(&i2c0); // 触发AHT20进行一次测量

  55.         vTaskDelay(portTICK_RATE_MS * 100); // 延时100ms,等待测量完成

  56.         struct aht20_data data;                                                                // 数据存储结构体
  57.         hosal_i2c_master_recv(&i2c0, AHT20_DEFAULT_ADDR, (uint8_t *)&data, sizeof(data), 100); // 接收传感器返回的数据

  58.         if ((data.status & 0x80) == 0)
  59.         {                                                                                                                                 // 检查数据是否有效
  60.             uint32_t humidity_raw = ((uint32_t)data.humidity_high << 12) | ((uint32_t)data.humidity_mid << 4) | (data.humidity_low >> 4); // 提取湿度数据
  61.             uint32_t temp_raw = (((uint32_t)data.temp_high & 0x0F) << 16) | ((uint32_t)data.temp_mid << 8) | data.temp_low;               // 提取温度数据

  62.             float humidity = (humidity_raw * 100.0) / 1048576.0;       // 转换为实际湿度
  63.             float temperature = (temp_raw * 200.0) / 1048576.0 - 50.0; // 转换为实际温度

  64.             blog_info("Temperature: %.2f C, Humidity: %.2f %%\r\n", temperature, humidity); // 输出温湿度数据
  65.         }
  66.         else
  67.         {
  68.             blog_error("AHT20 Data Invalid\r\n"); // 数据无效时输出错误信息
  69.         }

  70.         vTaskDelay(portTICK_RATE_MS * 1000); // 延时1秒,进入下一次测量
  71.     }

  72.     return 0;
  73. }
复制代码


烧录验证


                               
登录/注册后可看大图



360截图20240909211420.jpg


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

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

项目工程如下
上传的附件: demo_aht20.zip (307.34 KB, 下载次数: 7)


如何使用

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


──── 0人觉得很赞 ────

使用道具 举报

2024-9-10 09:03:38
后续请大佬验证一下
2024-9-10 09:08:25
本帖最后由 djy876 于 2024-9-10 09:45 编辑

可以呼叫狗哥
2024-9-10 11:53:47
爱笑 发表于 2024-9-10 09:03
后续请大佬验证一下

这个传感器有问题, 我都Arduino 也试过了 漂移超级大
2024-9-10 17:40:19
WangChong 发表于 2024-9-10 11:53
这个传感器有问题, 我都Arduino 也试过了 漂移超级大

可能你买的是有问题的一个,再买两个对比看看
2024-9-10 21:00:08
再买两个对比看看
2024-9-10 22:56:15
bzhou830 发表于 2024-9-10 17:40
可能你买的是有问题的一个,再买两个对比看看

要等的时间太长了 , 来不及了
您需要登录后才可以回帖 立即登录
高级模式
返回
统计信息
  • 会员数: 28200 个
  • 话题数: 40097 篇