Raspberry Pi and SI7021 temperature sensor example in C

868

The Si7021 I2C Humidity and Temperature Sensor is a monolithic CMOS IC integrating humidity and temperature sensor elements, an analog-to-digital converter, signal processing, calibration data, and an I2C Interface. The patented use of industry-standard, low-K polymeric dielectrics for sensing humidity enables the construction of low-power, monolithic CMOS Sensor ICs with low drift and hysteresis, and excellent long term stability.

The humidity and temperature sensors are factory-calibrated and the calibration data is stored in the on-chip non-volatile memory. This ensures that the sensors are fully interchangeable, with no recalibration or software changes required.

The Si7021 is available in a 3×3 mm DFN package and is reflow solderable. It can be used as a hardware- and software-compatible drop-in upgrade for existing RH/ temperature sensors in 3×3 mm DFN-6 packages, featuring precision sensing over a wider range and lower power consumption. The optional factory-installed cover offers a low profile, convenient means of protecting the sensor during assembly (e.g., reflow soldering) and throughout the life of the product, excluding liquids (hydrophobic/oleophobic) and particulates.

The Si7021 offers an accurate, low-power, factory-calibrated digital solution ideal for measuring humidity, dew-point, and temperature, in applications ranging from HVAC/R and asset tracking to industrial and consumer platforms.

 

Layout

 

 

Code

save the file below as SI7021.c

// Distributed with a free-will license.
// Use it any way you want, profit or free, provided it fits in the licenses of its associated works.
// SI7021
// This code is designed to work with the SI7021_I2CS I2C Mini Module available from ControlEverything.com.
// https://www.controleverything.com/content/Humidity?sku=SI7021_I2CS#tabs-0-product_tabset-2
#include <stdio.h>
#include <stdlib.h>
#include <linux/i2c-dev.h>
#include <sys/ioctl.h>
#include <fcntl.h>
void main()
{
// Create I2C bus
int file;
char *bus = "/dev/i2c-1";
if((file = open(bus, O_RDWR)) < 0)
{
printf("Failed to open the bus. \n");
exit(1);
}
// Get I2C device, SI7021 I2C address is 0x40(64)
ioctl(file, I2C_SLAVE, 0x40);
// Send humidity measurement command(0xF5)
char config[1] = {0xF5};
write(file, config, 1);
sleep(1);
// Read 2 bytes of humidity data
// humidity msb, humidity lsb
char data[2] = {0};
if(read(file, data, 2) != 2)
{
printf("Error : Input/output Error \n");
}
else
{
// Convert the data
float humidity = (((data[0] * 256 + data[1]) * 125.0) / 65536.0) - 6;
// Output data to screen
printf("Relative Humidity : %.2f RH \n", humidity);
}
// Send temperature measurement command(0xF3)
config[0] = 0xF3;
write(file, config, 1);
sleep(1);
// Read 2 bytes of temperature data
// temp msb, temp lsb
if(read(file, data, 2) != 2)
{
printf("Error : Input/output Error \n");
}
else
{
// Convert the data
float cTemp = (((data[0] * 256 + data[1]) * 175.72) / 65536.0) - 46.85;
float fTemp = cTemp * 1.8 + 32;
// Output data to screen
printf("Temperature in Celsius : %.2f C \n", cTemp);
printf("Temperature in Fahrenheit : %.2f F \n", fTemp);
}
}

compile this like the following

gcc SI7021.c -o SI7021 -lwiringPi - lm

 

run this like this

sudo ./SI7021

 

Output

You should see something like this in the terminal

si7021 output
si7021 output

 

Link

https://www.silabs.com/documents/public/data-sheets/Si7021-A20.pdf

Industrial High Precision Si7021 Humidity Sensor with I2C Interface for Arduino

You might also like More from author

Comments are closed, but trackbacks and pingbacks are open.