简介
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。
实验效果

我要赚赏金
