无垠的广袤 发表于 2025-5-11 23:30:18

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]
查看完整版本: Beetle 树莓派RP2350 - 便携AHT10温湿度计