Home

Awesome

Sensirion Arduino Core Library

This library provides SHDLC and I2C protocol implementations for Sensirion sensors. There shouldn't be a reason to use it directly, but is required by the sensor driver libraries provided here:

More Drivers

Not looking for Arduino drivers? Check out our other drivers here:

Usage

SHDLC

SHDLC (Sensirion High-Level Data Link Control) is a byte-oriented master-slave communication protocol based on ISO HDLC. It is used to control some of Sensirion’s devices (for example mass flow controllers). The detailed protocol documentation is not publicly available (yet). If you need it, please contact our customer support.

This library provides the following classes for communication with Sensirion Sensors using the SHDLC protocol.

Example Usage

First initialize an instance of SensirionShdlcTxFrame and SensirionShdlcRxFrame with a properly sized buffer. A good worst case estimation for the buffer size is 2 * (n+6) where n is the number of bytes you want to send. After that you can build your frame by first calling begin(). Information about the correct COMMAND and ADDRESS can be found on the data sheet of your sensor. Then you can add data to the frame by using different add member functions. See the code below for examples. After adding your data finish the frame by calling finish().

To send this frame to the sensor you first need to initialize the correct Stream object (Serial,UART,...) to talk to your sensor. Don't forget to also call the .begin() function with the right configuration. Then call the static function sendAndReceiveFrame() from SensirionShdlcCommunication as shown below. You need to replace STREAMOBJECT with the initialized Stream object of your choice. Additionally you need to provide a timeout for to receive data back, consult the data sheet of your sensor for information on the best timeout value.

You can decode the frame by using the different get members to convert the received data to desired data types.

All functions return a error code if an error occurs during execution and zero otherwise.

uint8_t txBuffer[256];
uint8_t rxBuffer[256];

SensirionShdlcTxFrame txFrame(txBuffer, 256);
SensirionShdlcRxFrame rxFrame(rxBuffer, 256);

txFrame.begin(COMMAND, ADDRESS, DATALENGTH);

txFrame.addUInt8(UINT8);
txFrame.addUInt32(UINT32);

txFrame.finish();

SensirionShdlcCommunication::sendAndReceiveFrame(STREAMOBJECT, txFrame, rxFrame, TIMEOUT);

rxFrame.getUInt16(UINT16);
rxFrame.getFloat(FLOAT);

I2C

This library provides the following classes for communication with Sensirion Sensors using the I2C protocol.

Example Usage

First initialize an instance of SensirionI2CTxFrame and SensirionI2CRxFrame with a buffer sized the amount of data to read times 1.5. This is needed to account for the CRC which is added after every second byte. After that you can build your frame by first calling addCommand() to add the command at the beginning of the frame. Information about the different COMMANDs can be found on the data sheet of your sensor. Then you can add data to the frame by using different add member functions. See the code below for examples.

To send this frame to the sensor you first need to initialize a Wire object. Don't forget to also call the .begin() function with the right configuration. Then call the static function sendFrame() form SensirionI2CCommunication as shown below. You can find the ADDRESS on the data sheet of the sensor. You also need to replace WIREOBJECT with the initialized Wire object. Then wait the in the data sheet documented READ_DELAY before receiving the reply from the sensor by calling receiveFrame() with the same Wire object.

You then can decode the frame by using the different get members to convert the received data to desired data types.

All functions return a error code if an error occurs during execution and zero otherwise.

uint8_t txBuffer[256];
uint8_t rxBuffer[256];

SensirionShdlcTxFrame txFrame(txBuffer, 256);
SensirionShdlcRxFrame rxFrame(rxBuffer, 256);

txFrame.addCommand(COMMAND);

txFrame.addUInt8(UINT8);
txFrame.addUInt32(UINT32);

SensirionShdlcCommunication::sendFrame(ADDRESS, txFrame, WIREOBJECT);

delay(READ_DELAY);

SensirionShdlcCommunication::receiveFrame(ADDRESS, rxFrame, WIREOBJECT);

rxFrame.getUInt16(UINT16);
rxFrame.getFloat(FLOAT);