SI7021 is a temperature and humidity sensor chip produced by Silicon Labs. Its main features:
- Humidity accuracy: Error typ. +/-2%RH, Max +/-3%rh (0~80%RH), factory corrected
- Temperature accuracy: Error typ. +/-0.3%°c, Max +/-0.4%°c ( -10°c~85°c), factory corrected
- Measuring range: Temperature range 0~100%rh, maximum temperature range -40°c~125°c
- Operating voltage: 1.9~3.6v
- Low power consumption: Low 150μa at work, 60nA at standby
- Interface: I²C, maximum rate support 400kbps
- Long-term stability: humidity ≤0.25%rh/yr, temperature ≤0.01°c/yr
- Package: 3x3 mm DFN
- On-Chip integrated heaters (heater)
- Optional hydrophobic protective cover
AndArduinoThe connection
Since the operating voltage of the Arduino Uno is 5V, and the Si7021 cannot operate at 5V, the connection requires a level shift. The method of conversion is to connect between Si7021 and Arduino via the I²c Logic level converter. The principle of bi-directional logic level translators can be consulted in the application notes of Philips Semiconductor "bi-directional levels shifter for I²C bus and other systems". The converter ends up with the pull-up resistor required by the I²C bus.
Functional commissioning
1. During the Si7021 measurement process, you can choose to have the SCL pull down (hold Master mode) or not to respond to the message from the MCU (No to master mode).
2. The relative humidity measurement includes the temperature measurement, and the temperature measurement can be carried out separately.
3. For relative humidity or temperature measurement, whether the MCU sends an ACK to the measured low byte determines whether the Si7021 returns a CRC check code. When reading the temperature value of the last relative humidity measurement, the Si7021 does not reply to the CRC check code. Half of the following code is related to CRC validation and is not required, and the CRC algorithm is not optimized.
4. When Si7021 is used for environmental measurement, chip placement, PCB thermal barrier design has a significant impact on measurement accuracy, response time, see the official "si70xx Humidity Sensor Designer's Guide" document.
Test code
1 /*2 measurement of relative humidity and temperature using Si70213 */4 5#include <Wire.h>6 7 #defineaddress_si7021 0x408 #defineMeasure_rh_hold 0xe59 #defineRead_t_from_pre_rh_measurement 0xE0Ten One byteBuffer[] = {0,0,0}; A byteCrchumi; - -Word Outhumi =0; theWord outtemp =0; - floatValuehumi =0; - floatValuetemp =0; - + voidSetup () - { + Wire.begin (); ASerial.begin (115200); at } - - voidLoop () - { - //perform a RH measurement and read back the RH value - wire.begintransmission (address_si7021); in Wire.write (measure_rh_hold); - wire.endtransmission (); to +Wire.requestfrom (address_si7021,3); - if(Wire.available () >=3) the { *buffer[0] = Wire.read ();//High byte $buffer[1] = Wire.read ();//Low bytePanax Notoginsengbuffer[2] = Wire.read ();//CRC - } theOuthumi = (buffer[0]<<8) | buffer[1]; +Crchumi = CRC8 (buffer,3); A the //read temperature from previous RH measurement + wire.begintransmission (address_si7021); - Wire.write (read_t_from_pre_rh_measurement); $ wire.endtransmission (); $ -Wire.requestfrom (address_si7021,2); - if(Wire.available () >=2) the { -buffer[0] = Wire.read ();//High byteWuyibuffer[1] = Wire.read ();//Low byte; no CRC the } -Outtemp = (buffer[0]<<8) | buffer[1]; Wu -Valuehumi =125.0*outhumi/65536-6; AboutValuetemp =175.72*outtemp/65536-46.85; $ -Serial.print (Valuehumi); Serial.print ("\%rh\t"); -Serial.print (valuetemp); Serial.println ("' C"); - A if(Crchumi = =0) + { theSerial.println ("CRC checked."); - } $ Else the { theSerial.println ("CRC error!"); the } the -Delay4000); in } the the byteCRC8 (byte*data,bytelen) About { the bytecrc[8]; the byteresult =0; the bytei; + byteDoinvert; -String bitstring =makestring (data, Len); the Bayi for(i =0; I <8; i++) the { theCrc[i] =0; - } - the for(i =0; I < bitstring.length (); i + +) the { theDoinvert = (byte(Bitstring[i] = ='1') ^ crc[7]; thecrc[7] = crc[6]; -crc[6] = crc[5]; thecrc[5] = crc[4] ^Doinvert; thecrc[4] = crc[3] ^Doinvert; thecrc[3] = crc[2];94crc[2] = crc[1]; thecrc[1] = crc[0]; thecrc[0] =Doinvert; the }98 About for(i =0; I <8; i++) - {101 Bitwrite (result, I, crc[i]);102 }103 104 returnresult; the }106 107String makestring (byte*data,bytelen)108 {109 intI, J; the String Tempstring[len];111String bitstring=""; the 113 for(i =0; i < Len; i++) the { theTempstring[i] =String (Data[i], BIN); the intZeros =8-tempstring[i].length ();117 for(j =0; J < Zeros; J + +)118 {119Tempstring[i] ='0'+Tempstring[i]; - }121 }122 123 for(i =0; i < Len; i++)124 { thebitstring = bitstring +Tempstring[i];126 }127 - returnbitstring;129}
View Code
If the connection is normal, the Si7021 will trigger the measurement every 4 seconds and print the result via the serial port:
Resources
Silicon labs-si7021 Datasheet
Application note:bi-directional level shifter for I²c bus and other systems
Application note:si70xx Humidity Sensor Designer ' s Guide
Online CRC Calculation
Arduino I²c + temperature and humidity sensor Si7021