Quick Start

SensorBridge Example

Following example code shows how to use this driver with a Sensirion SGP40/SGP41 connected to the computer using a Sensirion SEK-SensorBridge. The driver for the SensorBridge and the base SHDLC driver used in the example can be installed with

pip install python-i2c-sgp4x[example]

SGP40

import time
from sensirion_shdlc_driver import ShdlcSerialPort, ShdlcConnection
from sensirion_shdlc_sensorbridge import SensorBridgePort, \
    SensorBridgeShdlcDevice, SensorBridgeI2cProxy
from sensirion_i2c_driver import I2cConnection
from sensirion_i2c_sgp4x import Sgp40I2cDevice

# Connect to the SensorBridge with default settings:
#  - baudrate:      460800
#  - slave address: 0
with ShdlcSerialPort(port='COM1', baudrate=460800) as port:
    bridge = SensorBridgeShdlcDevice(ShdlcConnection(port), slave_address=0)
    print("SensorBridge SN: {}".format(bridge.get_serial_number()))

    # Configure SensorBridge port 1 for SGP40
    bridge.set_i2c_frequency(SensorBridgePort.ONE, frequency=100e3)
    bridge.set_supply_voltage(SensorBridgePort.ONE, voltage=3.3)
    bridge.switch_supply_on(SensorBridgePort.ONE)

    # Create SGP40 device
    i2c_transceiver = SensorBridgeI2cProxy(bridge, port=SensorBridgePort.ONE)
    sgp40 = Sgp40I2cDevice(I2cConnection(i2c_transceiver))

    print("SGP40 Serial Number: {}".format(sgp40.get_serial_number()))

    # Measure every second for one minute
    for _ in range(60):
        time.sleep(1)
        sraw_voc = sgp40.measure_raw()
        # use default formatting for printing output:
        print("SRAW VOC: {}".format(sraw_voc))

    bridge.switch_supply_off(SensorBridgePort.ONE)

SGP41

import time
from sensirion_shdlc_driver import ShdlcSerialPort, ShdlcConnection
from sensirion_shdlc_sensorbridge import SensorBridgePort, \
    SensorBridgeShdlcDevice, SensorBridgeI2cProxy
from sensirion_i2c_driver import I2cConnection
from sensirion_i2c_sgp4x import Sgp41I2cDevice

# Connect to the SensorBridge with default settings:
#  - baudrate:      460800
#  - slave address: 0
with ShdlcSerialPort(port='COM1', baudrate=460800) as port:
    bridge = SensorBridgeShdlcDevice(ShdlcConnection(port), slave_address=0)
    print("SensorBridge SN: {}".format(bridge.get_serial_number()))

    # Configure SensorBridge port 1 for SGP40
    bridge.set_i2c_frequency(SensorBridgePort.ONE, frequency=100e3)
    bridge.set_supply_voltage(SensorBridgePort.ONE, voltage=3.3)
    bridge.switch_supply_on(SensorBridgePort.ONE)

    # Create SGP40 device
    i2c_transceiver = SensorBridgeI2cProxy(bridge, port=SensorBridgePort.ONE)
    sgp41 = Sgp41I2cDevice(I2cConnection(i2c_transceiver))

    print("SGP41 Serial Number: {}".format(sgp41.get_serial_number()))

    # Run conditioning for 10 seconds
    # WARNING: To avoid damage to the sensing material the conditioning must not exceed 10s!
    for _ in range(10):
        time.sleep(1)
        sraw_voc = sgp41.conditioning()
        # use default formatting for printing output:
        print("SRAW VOC: {}\t\tSRAW NOx: conditioning".format(sraw_voc))

    # Measure every second for one minute
    for _ in range(60):
        time.sleep(1)
        sraw_voc, sraw_nox = sgp41.measure_raw()
        # use default formatting for printing output:
        print("SRAW VOC: {}\t\tSRAW NOx: {}".format(sraw_voc, sraw_nox))

    bridge.switch_supply_off(SensorBridgePort.ONE)

Linux I²C Hardware

The following examples show how to use the SGP40 and SGP41 sensors with a generic Linux I²C hardware (e.g. attached to the Raspberry Pi I²C port 1)

SGP40

import time
from sensirion_i2c_driver import LinuxI2cTransceiver, I2cConnection
from sensirion_i2c_sgp4x import Sgp40I2cDevice

# Connect to the I²C 1 port /dev/i2c-1
with LinuxI2cTransceiver('/dev/i2c-1') as i2c_transceiver:
    # Create SGP40 device
    sgp40 = Sgp40I2cDevice(I2cConnection(i2c_transceiver))

    print("SGP40 Serial Number: {}".format(sgp40.get_serial_number()))

    # Measure every second for one minute
    for _ in range(60):
        time.sleep(1)
        sraw_voc = sgp40.measure_raw()
        # use default formatting for printing output:
        print("SRAW VOC: {}".format(sraw_voc))

SGP41

import time
from sensirion_i2c_driver import LinuxI2cTransceiver, I2cConnection
from sensirion_i2c_sgp4x import Sgp41I2cDevice

# Connect to the I²C 1 port /dev/i2c-1
with LinuxI2cTransceiver('/dev/i2c-1') as i2c_transceiver:
    # Create SGP41 device
    sgp41 = Sgp41I2cDevice(I2cConnection(i2c_transceiver))

    print("SGP41 Serial Number: {}".format(sgp41.get_serial_number()))

    # Run conditioning for 10 seconds
    # WARNING: To avoid damage to the sensing material the conditioning must not exceed 10s!
    for _ in range(10):
        time.sleep(1)
        sraw_voc = sgp41.conditioning()
        # use default formatting for printing output:
        print("SRAW VOC: {}\t\tSRAW NOx: conditioning".format(sraw_voc))

    # Measure every second for one minute
    for _ in range(60):
        time.sleep(1)
        sraw_voc, sraw_nox = sgp41.measure_raw()
        # use default formatting for printing output:
        print("SRAW VOC: {}\t\tSRAW NOx: {}".format(sraw_voc, sraw_nox))