本文将测试基于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 
 |