【Beetle 树莓派RP2350】温度检测
本文将测试基于IIC测量STS30传感器读取温度,之后基于SPI驱动1.8寸tft屏幕工程进一步开发该传感器接口如下
阅读STS30的数据手册,IIC地址默认为0x4A
阅读测量指令,这里选择0x24 0B作为测量指令
编写STS30驱动代码如下
class STS30:
def __init__(self, i2c_bus, i2c_address=0x4A):
"""
初始化STS30传感器
:param i2c_bus: 初始化的I2C总线对象
:param i2c_address: STS30的I2C地址,默认为0x4A
"""
self.i2c = i2c_bus
self.address = i2c_address
# 软复位传感器
self._send_command()
time.sleep(0.01)# 短暂延迟等待复位完成
def _send_command(self, command):
"""发送命令到STS30"""
self.i2c.writeto(self.address, bytes(command))
def _read_data(self, length):
"""从STS30读取数据"""
return self.i2c.readfrom(self.address, length)
def read_measurement(self):
"""
读取温湿度测量值
返回: (temperature, humidity)
"""
# 发送测量命令(0x2400 - 中等重复性,时钟拉伸启用)
self._send_command()
# 等待测量完成(典型值15ms,最大50ms)
time.sleep_ms(50)
# 读取6字节数据
data = self._read_data(6)
# 校验CRC (可选)
if not self._check_crc(data, data):
raise ValueError("Temperature CRC mismatch")
if not self._check_crc(data, data):
raise ValueError("Humidity CRC mismatch")
# 转换温度值(°C)
temp_raw = (data << 8) | data
temperature = -45 + 175 * (temp_raw / 65535.0)
return (round(temperature, 2))
def _check_crc(self, data, crc):
"""校验CRC8"""
# STS30使用CRC-8多项式0x31 (x^8 + x^5 + x^4 + 1)
calculated_crc = 0xFF
for byte in data:
calculated_crc ^= byte
for _ in range(8):
if calculated_crc & 0x80:
calculated_crc = (calculated_crc << 1) ^ 0x31
else:
calculated_crc = calculated_crc << 1
calculated_crc &= 0xFF
return calculated_crc == crc在主程序中,首先进行相关初始化,之后连续读取温度并显示在LCD屏幕上,输出到串口上,编写代码如下
def main():
tft.fill(TFT.BLACK)# 清空屏幕
x = 0
y = 50
fontSize = 2
fontType = sysfont # sysfont (the best), terminalfont, seriffont
# 初始化I2C
i2c = I2C(0, scl=Pin(5), sda=Pin(4), freq=400_000)
# 初始化STS30
sensor = STS30(i2c)
# 读取序列号
# 连续读取温湿度
while True:
temp = sensor.read_measurement()
message = "T:{:.1f}".format(temp)
tft.fill(TFT.BLACK)
tft.text((x, y), message, TFT.WHITE, fontType, fontSize) # 1
print(f"温度: {round(temp, 1)}°C")
time.sleep(0.5)
得到串口输出结果如下,在Thonny中还可以看到在手指接触上之后温度变化趋势
LCD显示结果如下
工程文件如下
页:
[1]