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
.venv\Scripts\Activate.ps1
.venv\Scripts\activate.bat
Install the driver:
python -m pip install sensirion_shdlc_sfc5xxx
Run Usage-Example
Connect the sfc5xxx sensor to your system with the serial USB cable.
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-portparameter 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()