简介
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的数据手册。可以做到开箱即用。
其中的逻辑分析仪数据解码时序为下图。
初始化传感器
开始测量
获取测量结果
使用驱动
以下是如何使用该驱动类进行温湿度测量的示例:
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) # 每秒更新一次
代码说明
初始化传感器
使用 initialize() 方法将传感器置于测量模式。
发送初始化命令 [0xF1, 0x08, 0x00]。
读取数据
使用 read_data() 方法触发测量并获取湿度和温度数据。
触发测量命令 [0xAC, 0x00, 0x00],等待 100 毫秒后读取 6 字节数据。
解析数据
湿度和温度的计算公式由 AHT10 数据手册提供,分别提取原始数据进行处理。
异常处理
如果通信异常(如数据长度不符),会抛出 ValueError。
实验效果