本帖最后由 无垠的广袤 于 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 开发板的开发设计和产品应用提供了参考。
|