Beetle 树莓派RP2350 - 便携AHT10温湿度计
本帖最后由 无垠的广袤 于 2025-5-11 23:42 编辑Beetle 树莓派RP2350 - 便携AHT10温湿度计
本文介绍了 DFRobot Beetle RP2350 开发板结合 AHT10 模块实现随身便携温湿度计,并通过 LabVIEW 上位机串口采集 AHT10 数据的项目设计。
扩展板项目:Beetle-RP2350扩展板 - 立创开源硬件平台 . 3D 外壳详见:无垠的广袤 | Home - MakerWorld .
项目介绍
包括 AHT10 模块(关键部件)、芯片介绍、工作原理、参数特点等信息,在此基础上实现工程代码编写、硬件测试等流程,最终实现随身便携温湿度计的项目设计。导入 MicroPython 串口库,通过串口发送查询指令,获取对应的温湿度数据;编写 LabVIEW 上位机程序,连接开发板串口,将接收到的温湿度数据绘制曲线,并保存数据至本地。
AHT10
AHT10 传感器是一款高精度、数字式温湿度传感器,由 ASAIR(奥松电子)生产。它采用 I²C 通信接口,适用于各种需要环境温湿度监测的场景,如智能家居、气象站、工业控制等。
特性
[*]测量范围与精度:
[*]温度:-40°C ~ +85°C,精度±0.5°C(典型值)。
[*]湿度:0% ~ 100% RH,精度±2% RH(典型值,25°C时)。
[*]数字输出:
[*]通过I²C接口(最大速率400kHz)直接输出数字信号,无需额外ADC。
[*]低功耗:
[*]工作电流约0.25mA,休眠电流小于0.1μA,适合电池供电设备。
[*]稳定性:
[*]内置电容式湿度传感元件和半导体温度传感器,抗干扰能力强。
[*]封装:
[*]紧凑型DFN封装(3mm × 3mm),易于集成。
通信协议
[*]I²C地址:默认0x38(可通过硬件调整)。
[*]命令格式:
[*]初始化:发送0xE1进行校准。
[*]触发测量:发送0xAC + 参数。
[*]读取数据:6字节(温湿度原始数据)。
库文件
上传 aht10.py 至芯片根目录
import time
from math import log
# AHT10 Library for MicroPython on ESP32
# Author: Sean Yong
# Date: 23rd December, 2019
# Version 1.0
#CONSTANTS
AHT10_ADDRESS = 0x38 # 0111000 (7bit address)
AHT10_READ_DELAY_MS = 75 # Time it takes for AHT to collect data
AHT_TEMPERATURE_CONST = 200
AHT_TEMPERATURE_OFFSET = 50
KILOBYTE_CONST = 1048576
CMD_INITIALIZE = bytearray()
CMD_MEASURE = bytearray()
FARENHEIT_MULTIPLIER = 9/5
FARENHEIT_OFFSET = 32
class AHT10:
def __init__(self, i2c, mode=0, address=AHT10_ADDRESS):
if i2c is None:
raise ValueError('I2C object required.')
if mode is not (0 and 1):
raise ValueError('Mode must be either 0 for Celsius or 1 Farenheit')
self.i2c = i2c
self.address = address
self.i2c.writeto(address, CMD_INITIALIZE)
self.readings_raw = bytearray(8)
self.results_parsed =
self.mode = mode # 0 for Celsius, 1 for Farenheit
def read_raw(self):
self.i2c.writeto(self.address, CMD_MEASURE)
time.sleep_ms(AHT10_READ_DELAY_MS)
self.readings_raw = self.i2c.readfrom(AHT10_ADDRESS, 6)
self.results_parsed = self.readings_raw << 12 | self.readings_raw << 4 | self.readings_raw >> 4
self.results_parsed = (self.readings_raw & 0x0F) << 16 | self.readings_raw << 8 | self.readings_raw
def humidity(self):
self.read_raw()
return (self.results_parsed / KILOBYTE_CONST) * 100
def temperature(self):
self.read_raw()
if self.mode is 0:
return (self.results_parsed / KILOBYTE_CONST) * AHT_TEMPERATURE_CONST - AHT_TEMPERATURE_OFFSET
else:
return ((self.results_parsed / KILOBYTE_CONST) * AHT_TEMPERATURE_CONST - AHT_TEMPERATURE_OFFSET) * FARENHEIT_MULTIPLIER + FARENHEIT_OFFSET
def set_mode(self, mode):
if mode is not (0 or 1):
raise ValueError('Mode must be either 0 for Celsius or 1 Farenheit')
self.mode = mode
def print(self):
print("Temperature: " + str(self.temperature()) + ("C","F") + ", Humidity: " + str(self.humidity()))
def dew_point(self):
h = self.humidity()
t = self.temperature()
prev_mode = self.mode
self.mode = 0
h = (log(h, 10) - 2) / 0.4343 + (17.62 * t) / (243.12 + t)
return 243.12 * h / (17.62 - h)
参考:Raspberry Pi Pico AHT10温湿度传感器 .
硬件连接
代码
通过复用 IIC 引脚 GPIO4 和 GPIO5 ,实现 AHT10 模块的数据采集、终端打印以及 OLED 显示。
'''
Name: AHT10 demo, print temperature and humidity, display on OLED
Version: v1.0
Date: 2025.05
Author: ljl
Other: Shell print and OLED display temperature and humidity which test by AHT10 sensor.
'''
from machine import Pin,I2C
import utime
import aht10
import ssd1306
# ==== Initialized IIC OLED ====
i2c = I2C(0, scl=Pin(5), sda=Pin(4),freq=400000)
oled_width = 128
oled_height = 64
oled = ssd1306.SSD1306_I2C(oled_width, oled_height, i2c)
devlist = i2c.scan() # devices list -- array
print("Address List:",devlist)
for dev in devlist:
print(hex(dev))
aht10 = aht10.AHT10(i2c, mode=0, address=0x38)
def display_TH(temp,humi): # temperature and humidity
oled.fill(0)# 清屏
oled.text("Temperature: ", 0, 0)
oled.text("{:.2f} C".format(temp), 0, 15)
oled.text("Humidity: ", 0, 35)
oled.text("{:.2f} %".format(humi), 0, 50)
oled.show()
while True:
humi = aht10.humidity()
temp = aht10.temperature()
#aht10.print()
print('Temp: {:.2f} C, Humi: {:.2f} %'.format(temp,humi))
display_TH(temp,humi);
utime.sleep(1)
LabVIEW上位机
介绍了 LabVIEW 上位机向单片机发送串口指令,获取 AHT10 传感器温湿度数据,并绘制温湿度数值演化曲线。
代码
串口以十六进制发送 55 AA 10 或 55 AA 11 分别获得温度和湿度数值。
'''
Name: AHT10 demo, print temperature and humidity, display on OLED, UART send data
Version: v1.0
Date: 2025.05
Author: ljl
Other: Shell print and OLED display and UART send temperature and humidity which test by AHT10 sensor.
'''
from machine import Pin, I2C, UART
import aht10
import ssd1306
import ujson # read uart string
import utime
# ==== Initialized IIC OLED ====
i2c = I2C(0, scl=Pin(5), sda=Pin(4),freq=400000)
oled_width = 128
oled_height = 64
oled = ssd1306.SSD1306_I2C(oled_width, oled_height, i2c)
devlist = i2c.scan() # devices list -- array
print("Address List:",)
aht10 = aht10.AHT10(i2c, mode=0, address=0x38)
# Initialize UART (change pins as needed for your board)
uart = machine.UART(1, baudrate=9600, tx=Pin(8), rx=Pin(9))
comdata = bytearray(3)
def display_TH(temp,humi): # temperature and humidity
oled.fill(0)# 清屏
oled.text("Temperature: ", 0, 0)
oled.text("{:.2f} C".format(temp), 0, 15)
oled.text("Humidity: ", 0, 35)
oled.text("{:.2f} %".format(humi), 0, 50)
oled.show()
def receive_data():
for i in range(3):
while not uart.any():# Wait for data to be available
pass
comdata = uart.read(1)# Read one byte
utime.sleep_ms(2)# Small delay between bytes
def test_do_data():
if comdata == 0x55 and comdata == 0xAA:
try:
if comdata == 0x10:
temp = aht10.temperature()# get temperature
uart.write("{:.2f}\r\n".format(temp))
elif comdata == 0x11:
humi = aht10.humidity()# get humidity
uart.write("{:.2f}\r\n".format(humi))
except Exception as e:
uart.write("Error reading sensor.\n")
# Serial acquire data
def uart_acquire():
if uart.any() >= 3:
receive_data()
test_do_data()
while True:
uart_acquire()
前面板
功能实现:
[*]配置串口,
[*]运行程序,
[*]点击 Start 开始采集数据,
[*]点击 Stop 停止采集,
[*]点击 Terminate 终止程序。
程序框图
Page 1
Page 2
效果
OLED 刷新并显示 AHT10 传感器采集的温湿度数据
终端打印
OLED实时显示
LabVIEW 数据采集
动态效果
总结
本文介绍了 DFRobot Beetle RP2350 开发板结合 AHT10 模块实现随身便携温湿度计,并通过 LabVIEW 上位机串口采集 AHT10 数据的项目设计,为 Beetle RP2350 开发板的开发设计和产品应用提供了参考。
页:
[1]