这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » 我想要一部加热台+树莓派PICO驱动AHT10

共1条 1/1 1 跳转至

我想要一部加热台+树莓派PICO驱动AHT10

助工
2024-12-05 22:08:32     打赏

简介



AHT10 (奥松电子)是一款高精度的温湿度传感器,因其小巧的体积和高性能的测量能力而受到广泛应用。本帖将带你一步步实现 AHT10 的驱动,包括初始化、数据读取和结果解析,并封装成 MicroPython类,方便复用。


AHT10 简介


AHT10 通过 I2C 接口与主机进行通信,可以精确地测量环境温度和湿度。它的特点包括:

  • 供电电压:1.8V ~ 3.6V (3.3为典型工作电压)

  • 工作温度范围:-40°C ~ 80°C 

  • 湿度范围:0% ~ 100% RH(超过80% 会发生飘逸)

  • 分辨率:温度 0.003°C,湿度 0.001


接线说明


  • 硬件连接

    • SDA 接单片机的 SDA(I2C0, 8) 引脚

    • SCL 接单片机的 SCL(ISC0,9) 引脚

    • VCC 接 3.3V

    • GND 接地

  • I2C 地址

    • AHT10 的默认 I2C 地址为 0x38。


AHT10 驱动代码实现


from machine import I2C, Pin
import time


class AHT10:
    def __init__(self, i2c, i2c_addr=0x38):
        """
        初始化 AHT10 传感器。

        :param i2c: I2C 对象
        :param i2c_addr: AHT10 I2C 地址,默认 0x38
        """
        self.i2c = i2c
        self.i2c_addr = i2c_addr
        self.init_command = [0xF1, 0x08, 0x00]
        self.trigger_measurement = [0xAC, 0x00, 0x00]

    def initialize(self):
        """
        初始化 AHT10 传感器,确保其进入测量模式。
        """
        self.i2c.writeto(self.i2c_addr, bytes(self.init_command))
        time.sleep(0.05)  # 等待传感器初始化

    def read_data(self):
        """
        从 AHT10 传感器读取原始数据并计算湿度和温度。

        :return: 湿度(%)和温度(°C)
        """
        # 触发测量命令
        self.i2c.writeto(self.i2c_addr, bytes(self.trigger_measurement))
        time.sleep(0.1)  # 等待 100 毫秒

        # 读取 6 字节的数据
        data = self.i2c.readfrom(self.i2c_addr, 6)

        # 校验数据长度
        if len(data) != 6:
            raise ValueError("Failed to read data from AHT10 sensor")

        # 提取湿度和温度原始值
        humidity_raw = ((data[1] << 12) | (data[2] << 4) | (data[3] >> 4)) & 0xFFFFF
        temperature_raw = ((data[3] & 0x0F) << 16) | (data[4] << 8) | data[5]

        # 计算湿度 (%)
        humidity = (humidity_raw / (2 ** 20)) * 100

        # 计算温度 (°C)
        temperature = (temperature_raw / (2 ** 20)) * 200 - 50

        return humidity, temperature

    def read_raw_data(self):
        """
        获取原始传感器数据(用于调试)。
        :return: 原始 6 字节数据
        """
        return self.i2c.readfrom(self.i2c_addr, 6)


上述是完整的驱动代码,封装为一个 Python 类,其中的初始化传感器操作, 测试操作,数据转换操作皆严格按照AHT10的数据手册。可以做到开箱即用。


image.png

其中的逻辑分析仪数据解码时序为下图。


初始化传感器

image.png


开始测量

image.png


获取测量结果

image.png


使用驱动


以下是如何使用该驱动类进行温湿度测量的示例:

from machine import I2C, Pin
from driver_aht10 import AHT10
import time

# 初始化 I2C
i2c = I2C(0, scl=Pin(9), sda=Pin(8), freq=400000)

# 初始化 AHT10
sensor = AHT10(i2c)
sensor.initialize()

# 循环读取数据
while True:
    try:
        # 获取湿度和温度
        humidity, temperature = sensor.read_data()
        print(f"Humidity: {humidity:.2f}%")
        print(f"Temperature: {temperature:.2f}°C")
    except Exception as e:
        print(f"Error: {e}")

    time.sleep(1)  # 每秒更新一次


代码说明


  1. 初始化传感器

    • 使用 initialize() 方法将传感器置于测量模式。

    • 发送初始化命令 [0xF1, 0x08, 0x00]。

  2. 读取数据

    • 使用 read_data() 方法触发测量并获取湿度和温度数据。

    • 触发测量命令 [0xAC, 0x00, 0x00],等待 100 毫秒后读取 6 字节数据。

  3. 解析数据

    • 湿度和温度的计算公式由 AHT10 数据手册提供,分别提取原始数据进行处理。

  4. 异常处理

    • 如果通信异常(如数据长度不符),会抛出 ValueError。



实验效果


image.png


共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]