Jetson项目用到多个传感器,这里记录一个温湿度传感器SHT30.
初识温湿度传感器
如下图所示,SHT30温湿度传感器。
这是一片基于I2C通讯的温湿度传感器。
通讯协议
SCL与SDA需要与Jetson对应的引脚相连,可参考下图。
使用Jetson 40pin的3、5这一对I2C物理引脚(SDA、SCL)。
硬件连接
Jetson与SHT30物理连接参考下图。
依赖库准备
在正式编码前,记得装一下Adafruit的相应的库。
pip install adafruit-circuitpython-sht31d
adafruit的库会自动侦测0x44地址,即SHT30的I2C总线上的地址。
代码实现
由于使用I2C设备时,可能有异常导致I2C设备访问异常,使用软复位的方式解锁I2C总线。
def soft_reset(i2c):
try:
i2c.try_lock()
i2c.writeto(0x44, bytes([0x30, 0xA2])) # 发送软复位命令
except Exception as e:
print("Reset error:", e)
finally:
i2c.unlock()
time.sleep(0.5) # 等待复位完成
否则,第二次使用I2C设备时,很可能就找不到相应的地址了。
完整实现如下:
import adafruit_sht31d
import board
import busio
import time
def soft_reset(i2c):
try:
i2c.try_lock()
i2c.writeto(0x44, bytes([0x30, 0xA2])) # 发送软复位命令
except Exception as e:
print("Reset error:", e)
finally:
i2c.unlock()
time.sleep(0.5) # 等待复位完成
def read_sensor_data():
try:
i2c = busio.I2C(board.SCL, board.SDA)
soft_reset(i2c)
sensor = adafruit_sht31d.SHT31D(i2c)
temperature = sensor.temperature
humidity = sensor.relative_humidity
print(f"温湿度: {temperature:.2f} °C | {humidity:.2f} %")
except Exception as e:
print("Read error:", e)
finally:
if 'i2c' in locals():
i2c.deinit() # 确保释放I2C资源
if __name__ == "__main__":
while True:
read_sensor_data()
效果展示
程序执行效果如下:
温度湿度一目了然。