FuShenxiao 发表于 2025-5-17 10:54:46

【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]
查看完整版本: 【Beetle 树莓派RP2350】温度检测