Over the past few years, I've been frequently working with I²C environmental sensors for measuring temperature, humidity and so on. Here are some thoughts and observations of sensors and breakout boards I made along the way. Note that this is by no means a proper professional review, you should take everything posted here with a grain of salt.
Minimal drivers for all sensors listed here can be found in the multipass project.
Sensors and Datasheet specs
Sensor | Property | Resolution | Accuracy | Range |
---|---|---|---|---|
AM2320 | Temperature [°c] Humidity [%] |
0.1 0.1 |
±0.5 ±3 |
-40 .. 80 0 .. 99.9 |
BME280 | Temperature [°c] Humidity [%] Pressure [hPa] |
0.01 0.008 0.18 Pa |
±1 @ 0 .. 65 ±3 @ 20 .. 80 ±1 |
-40 .. 85 0 .. 100 300 .. 1100 |
BME680 | Temperature [°c] Humidity [%] Pressure [hPa] VOC [IAQ] |
0.01 0.008 0.18 Pa 1 |
±1 @ 0 .. 65 ±3 @ 20 .. 80 ±0.6 ±15% ±15 |
-40 .. 85 0 .. 100 300 .. 1100 0 .. ? |
CCS811 | TVOC [ppb] | 1 | ? | 0 .. 1187 |
HDC1080 | Temperature [°c] Humidity [%] |
0.1 0.1 |
±0.2 @ 5 .. 60 ±2 |
-40 .. 125 0 .. 100 |
LM75B | Temperature [°c] | 0.125 | ±2 / ±3 | -55 .. +125 |
Notes
AM2320
- I²C readout is a multi-step process with special timing requirements
- Reported humidity appears to be far too low on some devices
BME280
- max 3.6V; some breakout boards provide LDO and level shifters for 5V operation
- Supports both I²C and SPI; operating mode selected by CSB value
- The breakout boards I am aware of connect VCC to both VDD and VDDIO, making power sequencing with respect to CSB a tad difficult. On some of them, I had to power CSB before providing power to VCC to ensure that the chip starts up in I²C mode.
BME680
- IAQ calculation is only possible with a closed-source BLOB provided by Bosch SensorTec, setting that up on a Raspberry Pi is quite easy though.
CCS811
- In addition to Total Volatile Organic Compound (TVOC), the sensor reports “equivalent CO₂” (eCO₂) data calculated from TVOC. I found these to be unreliable.
LM75B
- readout is trivial
- SMBus compatible: using it on a Raspberry Pi is a simple as
i2cget -y 1 0x48 0x00 w
HDC1080
- reported humidity appears to be a tad too low