45浏览
查看: 45|回复: 0

[讨论] Beetle 树莓派RP2350 - 高精度AHT10温湿度计与LabVIEW数据采集

[复制链接]
本帖最后由 无垠的广袤 于 2025-5-11 23:14 编辑

Beetle 树莓派RP2350 - 高精度AHT10温湿度计与LabVIEW数据采集
本文介绍了 DFRobot Beetle RP2350 开发板结合 AHT10 模块实现随身便携温湿度计,并通过 LabVIEW 上位机串口采集 AHT10 数据的项目设计。


项目介绍
包括 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 至芯片根目录

  1. import time
  2. from math import log
  3. # AHT10 Library for MicroPython on ESP32
  4. # Author: Sean Yong
  5. # Date: 23rd December, 2019
  6. # Version 1.0
  7. #CONSTANTS
  8. AHT10_ADDRESS = 0x38 # 0111000 (7bit address)
  9. AHT10_READ_DELAY_MS = 75 # Time it takes for AHT to collect data
  10. AHT_TEMPERATURE_CONST = 200
  11. AHT_TEMPERATURE_OFFSET = 50
  12. KILOBYTE_CONST = 1048576
  13. CMD_INITIALIZE = bytearray([0xE1, 0x08, 0x00])
  14. CMD_MEASURE = bytearray([0xAC, 0x33, 0x00])
  15. FARENHEIT_MULTIPLIER = 9/5
  16. FARENHEIT_OFFSET = 32
  17. class AHT10:
  18.     def __init__(self, i2c, mode=0, address=AHT10_ADDRESS):
  19.         if i2c is None:
  20.             raise ValueError('I2C object required.')
  21.         if mode is not (0 and 1):
  22.             raise ValueError('Mode must be either 0 for Celsius or 1 Farenheit')
  23.         self.i2c = i2c
  24.         self.address = address
  25.         self.i2c.writeto(address, CMD_INITIALIZE)
  26.         self.readings_raw = bytearray(8)
  27.         self.results_parsed = [0, 0]
  28.         self.mode = mode # 0 for Celsius, 1 for Farenheit
  29.     def read_raw(self):
  30.         self.i2c.writeto(self.address, CMD_MEASURE)
  31.         time.sleep_ms(AHT10_READ_DELAY_MS)
  32.         self.readings_raw = self.i2c.readfrom(AHT10_ADDRESS, 6)
  33.         self.results_parsed[0] = self.readings_raw[1] << 12 | self.readings_raw[2] << 4 | self.readings_raw[3] >> 4
  34.         self.results_parsed[1] = (self.readings_raw[3] & 0x0F) << 16 | self.readings_raw[4] << 8 | self.readings_raw[5]
  35.     def humidity(self):
  36.         self.read_raw()
  37.         return (self.results_parsed[0] / KILOBYTE_CONST) * 100
  38.     def temperature(self):
  39.         self.read_raw()
  40.         if self.mode is 0:
  41.             return (self.results_parsed[1] / KILOBYTE_CONST) * AHT_TEMPERATURE_CONST - AHT_TEMPERATURE_OFFSET
  42.         else:
  43.             return ((self.results_parsed[1] / KILOBYTE_CONST) * AHT_TEMPERATURE_CONST - AHT_TEMPERATURE_OFFSET) * FARENHEIT_MULTIPLIER + FARENHEIT_OFFSET
  44.     def set_mode(self, mode):
  45.         if mode is not (0 or 1):
  46.             raise ValueError('Mode must be either 0 for Celsius or 1 Farenheit')
  47.         self.mode = mode
  48.     def print(self):
  49.         print("Temperature: " + str(self.temperature()) + ("C","F")[self.mode] + ", Humidity: " + str(self.humidity()))
  50.     def dew_point(self):
  51.         h = self.humidity()
  52.         t = self.temperature()
  53.         prev_mode = self.mode
  54.         self.mode = 0
  55.         h = (log(h, 10) - 2) / 0.4343 + (17.62 * t) / (243.12 + t)
  56.         return 243.12 * h / (17.62 - h)
复制代码


代码
通过复用 IIC 引脚 GPIO4 和 GPIO5 ,实现 AHT10 模块的数据采集、终端打印以及 OLED 显示。

  1. '''
  2. Name: AHT10 demo, print temperature and humidity, display on OLED
  3. Version: v1.0
  4. Date: 2025.05
  5. Author: ljl
  6. Other: Shell print and OLED display temperature and humidity which test by AHT10 sensor.
  7. '''
  8. from machine import Pin,I2C
  9. import utime
  10. import aht10
  11. import ssd1306
  12. # ==== Initialized IIC OLED ====
  13. i2c = I2C(0, scl=Pin(5), sda=Pin(4),freq=400000)
  14. oled_width = 128
  15. oled_height = 64
  16. oled = ssd1306.SSD1306_I2C(oled_width, oled_height, i2c)
  17. devlist = i2c.scan() # devices list -- array
  18. print("Address List:",devlist)
  19. for dev in devlist:
  20.     print(hex(dev))
  21. aht10 = aht10.AHT10(i2c, mode=0, address=0x38)
  22. def display_TH(temp,humi): # temperature and humidity
  23.     oled.fill(0)  # 清屏
  24.     oled.text("Temperature: ", 0, 0)
  25.     oled.text("{:.2f} C".format(temp), 0, 15)
  26.     oled.text("Humidity: ", 0, 35)
  27.     oled.text("{:.2f} %".format(humi), 0, 50)
  28.     oled.show()
  29.    
  30. while True:
  31.     humi = aht10.humidity()
  32.     temp = aht10.temperature()
  33.     #aht10.print()
  34.     print('Temp: {:.2f} C, Humi: {:.2f} %'.format(temp,humi))
  35.     display_TH(temp,humi);
  36.     utime.sleep(1)   
复制代码



LabVIEW上位机

介绍了 LabVIEW 上位机向单片机发送串口指令,获取 AHT10 传感器温湿度数据,并绘制温湿度数值演化曲线。

代码
串口以十六进制发送 55 AA 1055 AA 11 分别获得温度和湿度数值。

  1. '''
  2. Name: AHT10 demo, print temperature and humidity, display on OLED, UART send data
  3. Version: v1.0
  4. Date: 2025.05
  5. Author: ljl
  6. Other: Shell print and OLED display and UART send temperature and humidity which test by AHT10 sensor.
  7. '''
  8. from machine import Pin, I2C, UART
  9. import aht10
  10. import ssd1306
  11. import ujson # read uart string
  12. import utime
  13. # ==== Initialized IIC OLED ====
  14. i2c = I2C(0, scl=Pin(5), sda=Pin(4),freq=400000)
  15. oled_width = 128
  16. oled_height = 64
  17. oled = ssd1306.SSD1306_I2C(oled_width, oled_height, i2c)
  18. devlist = i2c.scan() # devices list -- array
  19. print("Address List:",[hex(dev) for dev in devlist])
  20. aht10 = aht10.AHT10(i2c, mode=0, address=0x38)
  21. # Initialize UART (change pins as needed for your board)
  22. uart = machine.UART(1, baudrate=9600, tx=Pin(8), rx=Pin(9))
  23. comdata = bytearray(3)
  24. def display_TH(temp,humi): # temperature and humidity
  25.     oled.fill(0)  # 清屏
  26.     oled.text("Temperature: ", 0, 0)
  27.     oled.text("{:.2f} C".format(temp), 0, 15)
  28.     oled.text("Humidity: ", 0, 35)
  29.     oled.text("{:.2f} %".format(humi), 0, 50)
  30.     oled.show()
  31. def receive_data():
  32.     for i in range(3):
  33.         while not uart.any():  # Wait for data to be available
  34.             pass
  35.         comdata = uart.read(1)[0]  # Read one byte
  36.         utime.sleep_ms(2)  # Small delay between bytes
  37. def test_do_data():
  38.     if comdata[0] == 0x55 and comdata[1] == 0xAA:
  39.         try:
  40.             if comdata[2] == 0x10:
  41.                 temp = aht10.temperature()  # get temperature
  42.                 uart.write("{:.2f}\r\n".format(temp))
  43.             elif comdata[2] == 0x11:
  44.                 humi = aht10.humidity()  # get humidity
  45.                 uart.write("{:.2f}\r\n".format(humi))
  46.         except Exception as e:
  47.                 uart.write("Error reading sensor.\n")
  48. # Serial acquire data
  49. def uart_acquire():
  50.     if uart.any() >= 3:
  51.         receive_data()
  52.         test_do_data()
  53. while True:
  54.     uart_acquire()
复制代码


前面板
功能实现:
  • 配置串口,
  • 运行程序,
  • 点击 Start 开始采集数据,
  • 点击 Stop 停止采集,
  • 点击 Terminate 终止程序。


程序框图
Page 1


Page 2


效果
OLED 刷新并显示 AHT10 传感器采集的温湿度数据


终端打印

OLED实时显示

LabVIEW 数据采集


总结
本文介绍了 DFRobot Beetle RP2350 开发板结合 AHT10 模块实现随身便携温湿度计,并通过 LabVIEW 上位机串口采集 AHT10 数据的项目设计,为 Beetle RP2350 开发板的开发设计和产品应用提供了参考。



您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail