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

[讨论] 【Beetle 树莓派RP2350】温度检测

[复制链接]
本文将测试基于IIC测量STS30传感器读取温度,之后基于SPI驱动1.8寸tft屏幕工程进一步开发
该传感器接口如下

【Beetle 树莓派RP2350】温度检测图2

阅读STS30的数据手册,IIC地址默认为0x4A
【Beetle 树莓派RP2350】温度检测图3

阅读测量指令,这里选择0x24 0B作为测量指令
【Beetle 树莓派RP2350】温度检测图4

编写STS30驱动代码如下
  1. class STS30:
  2.     def __init__(self, i2c_bus, i2c_address=0x4A):
  3.         """
  4.         初始化STS30传感器
  5.         :param i2c_bus: 初始化的I2C总线对象
  6.         :param i2c_address: STS30的I2C地址,默认为0x4A
  7.         """
  8.         self.i2c = i2c_bus
  9.         self.address = i2c_address
  10.         # 软复位传感器
  11.         self._send_command([0x24, 0x0B])
  12.         time.sleep(0.01)  # 短暂延迟等待复位完成
  13.    
  14.     def _send_command(self, command):
  15.         """发送命令到STS30"""
  16.         self.i2c.writeto(self.address, bytes(command))
  17.    
  18.     def _read_data(self, length):
  19.         """从STS30读取数据"""
  20.         return self.i2c.readfrom(self.address, length)
  21.    
  22.     def read_measurement(self):
  23.         """
  24.         读取温湿度测量值
  25.         返回: (temperature, humidity)
  26.         """
  27.         # 发送测量命令(0x2400 - 中等重复性,时钟拉伸启用)
  28.         self._send_command([0x24, 0x00])
  29.         
  30.         # 等待测量完成(典型值15ms,最大50ms)
  31.         time.sleep_ms(50)
  32.         
  33.         # 读取6字节数据
  34.         data = self._read_data(6)
  35.         
  36.         # 校验CRC (可选)
  37.         if not self._check_crc(data[0:2], data[2]):
  38.             raise ValueError("Temperature CRC mismatch")
  39.         if not self._check_crc(data[3:5], data[5]):
  40.             raise ValueError("Humidity CRC mismatch")
  41.         
  42.         # 转换温度值(°C)
  43.         temp_raw = (data[0] << 8) | data[1]
  44.         temperature = -45 + 175 * (temp_raw / 65535.0)
  45.         
  46.         
  47.         return (round(temperature, 2))
  48.    
  49.     def _check_crc(self, data, crc):
  50.         """校验CRC8"""
  51.         # STS30使用CRC-8多项式0x31 (x^8 + x^5 + x^4 + 1)
  52.         calculated_crc = 0xFF
  53.         for byte in data:
  54.             calculated_crc ^= byte
  55.             for _ in range(8):
  56.                 if calculated_crc & 0x80:
  57.                     calculated_crc = (calculated_crc << 1) ^ 0x31
  58.                 else:
  59.                     calculated_crc = calculated_crc << 1
  60.                 calculated_crc &= 0xFF
  61.         return calculated_crc == crc
复制代码
在主程序中,首先进行相关初始化,之后连续读取温度并显示在LCD屏幕上,输出到串口上,编写代码如下
  1. def main():
  2.     tft.fill(TFT.BLACK)  # 清空屏幕
  3.     x = 0
  4.     y = 50
  5.     fontSize = 2
  6.     fontType = sysfont # sysfont (the best), terminalfont, seriffont
  7.     # 初始化I2C
  8.     i2c = I2C(0, scl=Pin(5), sda=Pin(4), freq=400_000)
  9.    
  10.     # 初始化STS30
  11.     sensor = STS30(i2c)
  12.    
  13.     # 读取序列号
  14.    
  15.     # 连续读取温湿度
  16.     while True:
  17.         temp = sensor.read_measurement()
  18.         message = "T:{:.1f}".format(temp)
  19.         tft.fill(TFT.BLACK)
  20.         tft.text((x, y), message, TFT.WHITE, fontType, fontSize) # 1
  21.         print(f"温度: {round(temp, 1)}°C")
  22.         time.sleep(0.5)
复制代码

得到串口输出结果如下,在Thonny中还可以看到在手指接触上之后温度变化趋势
【Beetle 树莓派RP2350】温度检测图1

LCD显示结果如下
【Beetle 树莓派RP2350】温度检测图6

工程文件如下
下载附件Temperature_test.rar
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

硬件清单

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

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

mail