本文将测试基于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([0x24, 0x0B])
- 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([0x24, 0x00])
-
- # 等待测量完成(典型值15ms,最大50ms)
- time.sleep_ms(50)
-
- # 读取6字节数据
- data = self._read_data(6)
-
- # 校验CRC (可选)
- if not self._check_crc(data[0:2], data[2]):
- raise ValueError("Temperature CRC mismatch")
- if not self._check_crc(data[3:5], data[5]):
- raise ValueError("Humidity CRC mismatch")
-
- # 转换温度值(°C)
- temp_raw = (data[0] << 8) | data[1]
- 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显示结果如下
工程文件如下
Temperature_test.rar
|