本帖最后由 无垠的广袤 于 2025-5-11 23:14 编辑  
 
Beetle 树莓派RP2350 - 高精度AHT10温湿度计与LabVIEW数据采集本文介绍了 DFRobot Beetle RP2350 开发板结合 AHT10 模块实现随身便携温湿度计,并通过 LabVIEW 上位机串口采集 AHT10 数据的项目设计。  
 
项目介绍包括 AHT10 模块(关键部件)、芯片介绍、工作原理、参数特点等信息,在此基础上实现工程代码编写、硬件测试等流程,最终实现随身便携温湿度计的项目设计。 导入 MicroPython 串口库,通过串口发送查询指令,获取对应的温湿度数据;编写 LabVIEW 上位机程序,连接开发板串口,将接收到的温湿度数据绘制曲线,并保存数据至本地。  
AHT10 
AHT10 传感器是一款高精度、数字式温湿度传感器,由 ASAIR(奥松电子)生产。它采用 I²C 通信接口,适用于各种需要环境温湿度监测的场景,如智能家居、气象站、工业控制等。 特性通信协议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([0xE1, 0x08, 0x00])
 - CMD_MEASURE = bytearray([0xAC, 0x33, 0x00])
 - 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 = [0, 0]
 -         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[0] = self.readings_raw[1] << 12 | self.readings_raw[2] << 4 | self.readings_raw[3] >> 4
 -         self.results_parsed[1] = (self.readings_raw[3] & 0x0F) << 16 | self.readings_raw[4] << 8 | self.readings_raw[5]
 - 
 -     def humidity(self):
 -         self.read_raw()
 -         return (self.results_parsed[0] / KILOBYTE_CONST) * 100
 - 
 -     def temperature(self):
 -         self.read_raw()
 -         if self.mode is 0:
 -             return (self.results_parsed[1] / KILOBYTE_CONST) * AHT_TEMPERATURE_CONST - AHT_TEMPERATURE_OFFSET
 -         else:
 -             return ((self.results_parsed[1] / 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")[self.mode] + ", 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)
 
  复制代码
  
 
代码 
通过复用 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:",[hex(dev) for dev in devlist])
 - 
 - 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)[0]  # Read one byte
 -         utime.sleep_ms(2)  # Small delay between bytes
 - 
 - def test_do_data():
 -     if comdata[0] == 0x55 and comdata[1] == 0xAA:
 -         try:
 -             if comdata[2] == 0x10:
 -                 temp = aht10.temperature()  # get temperature
 -                 uart.write("{:.2f}\r\n".format(temp))
 -             elif comdata[2] == 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 开发板的开发设计和产品应用提供了参考。  
 
 
 |