Install the sfc5xxx Driver

The driver installation consists of creating a Python virtual environment, activating it, and installing the driver using pip.

Create a Python virtual environment:

python -m venv .venv

Activate the virtual environment:

source .venv/bin/activate

Install the driver:

python -m pip install sensirion_shdlc_sfc5xxx

Run Usage-Example

  1. Connect the sfc5xxx sensor to your system with the serial USB cable.

  2. Run the example script from the root of the repository.

    By default the script assumes the sensor is connected to COM1 serial port. If this is different on your system, pass the port in use with the --serial-port parameter as outlined below.

    python <example script>.py --serial-port <your COM port>
    

Example script

# -*- coding: utf-8 -*-
import time
from sensirion_shdlc_driver import ShdlcSerialPort, ShdlcConnection
from sensirion_shdlc_sfc5xxx import Sfc5xxxShdlcDevice, Sfc5xxxScaling, \
    Sfc5xxxValveInputSource, Sfc5xxxUnitPrefix, Sfc5xxxUnit, \
    Sfc5xxxUnitTimeBase, Sfc5xxxMediumUnit

# Connect to the device with default settings:
#  - baudrate:      115200
#  - slave address: 0
with ShdlcSerialPort(port='COM1', baudrate=115200) as port:
    device = Sfc5xxxShdlcDevice(ShdlcConnection(port), slave_address=0)

    # Print some device information
    print("Version: {}".format(device.get_version()))
    print("Product Name: {}".format(device.get_product_name()))
    print("Article Code: {}".format(device.get_article_code()))
    print("Serial Number: {}".format(device.get_serial_number()))

    # List all available calibration blocks
    print("Available gas calibration blocks:")
    for i in range(device.get_number_of_calibrations()):
        if device.get_calibration_validity(i):
            gas = device.get_calibration_gas_description(i)
            fullscale = device.get_calibration_fullscale(i)
            unit = device.get_calibration_gas_unit(i)
            print(" - {}: {:.2f} {} {}".format(i, fullscale, unit, gas))

    # Select gas calibration 0 (usually there is a calibration at index 0)
    device.activate_calibration(0)

    # Get some information about the currently active gas calibration
    print("Calibration Gas: {}".format(device.get_current_gas_description()))
    print("Calibration Fullscale: {}".format(device.get_current_fullscale()))
    print("Calibration Unit: {}".format(device.get_current_gas_unit()))

    # Set user defined flow unit to sccm so we don't have to care about
    # the actual calibration unit of the connected MFC
    unit = Sfc5xxxMediumUnit(
        Sfc5xxxUnitPrefix.MILLI,
        Sfc5xxxUnit.STANDARD_LITER,
        Sfc5xxxUnitTimeBase.MINUTE
    )
    device.set_user_defined_medium_unit(unit)

    # Get the flow fullscale in the user defined medium unit (i.e. sccm)
    fullscale = device.get_user_defined_fullscale()
    print("Fullscale: {:.2f} {}".format(fullscale, unit))

    # Set flow setpoint to 100sccm
    device.set_setpoint(100, Sfc5xxxScaling.USER_DEFINED)

    # Read single flow value
    flow = device.read_measured_value(Sfc5xxxScaling.USER_DEFINED)
    print("Measured Flow: {:.2f} {}".format(flow, unit))

    # Read single temperature value
    temperature = device.measure_temperature()
    print("Measured Temperature: {:.2f} °C".format(temperature))

    # Read whole flow value buffer
    buffer = device.read_measured_value_buffer(Sfc5xxxScaling.USER_DEFINED)
    print("Lost Values (Buffer Overrun): {}".format(buffer.lost_values))
    print("Sampling Time of Values: {:.3f} s".format(buffer.sampling_time))
    print("Buffered Flow Values: {}".format(buffer.values))

    # Purge system by fully opening the valve for 1s
    device.set_valve_input_source(Sfc5xxxValveInputSource.FORCE_OPEN)
    time.sleep(1.0)
    device.set_valve_input_source(Sfc5xxxValveInputSource.CONTROLLER)

    # Perform a device reset (reboot firmware)
    device.device_reset()