Temperature / humidity sensors benchmark for Raspberry Pi and Arduino
Almost ten years ago, as I began tinkering with an Arduino Uno, my first project required measuring indoor and outdoor temperature. As the Uno has analog inputs, I used very affordable 47K thermistors.
Few years later, the Raspberry Pi was introduced (2012), and the ESP8266 (ESP-01 model) became popular in 2014.
The RPi has no built-in Analog-to-Digital-Converter (ADC), and the ESP8266 analog input was not made available on the ESP-01 form factor (and expects 0-1V voltage range in other form factors).
Many digital temperature and humidity sensors with different communications protocols are commonly used in DIY projects:
Sensor | Price | Form factor | Communication protocol | Temperature | Humidity | Pressure |
DHT11 / DHT22 | ~$5 / ~$10 | Standalone, 4 pins | Custom | yes | yes | no |
BME280 | ~$20 | Breakout board, 7 pins | I2C / SPI | yes (internal) | yes | yes |
DS18B20 | ~$4 | Standalone, 3 pins | 1-Wire | yes | no | no |
Si7021 | ~$9 | Breakout board, 5 pins | I2C | yes | yes | no |
All these sensors have a different accuracy, so I wanted to compare the values they report, to check their consistency.
For the purpose of this benchmark, I wired all those sensors on a Raspberry Pi Zero, and wrote a simple Node.js script, reporting the measured temperature and humidity values every 30 seconds.
As you may notice, I actually wired 2 DS18B20 sensors, one of them being the waterproof version, so I can compare the values I get. Here are the results after 1 night running:
This chart brings many conclusions:
- BME280 and Si7021 have a much better precision than the other modules
- No difference is measured between the bare and the waterproof versions of the DS18B20
- The BME280 reports higher temperature than the other modules: this is because this sensor reports internal temperature, altered by the components dissipated heat
Analysing deeper this BME280 reported temperature difference:
This difference is fairly constant; ~1°C can be removed from BME280 reported values to get an acceptable value. Let's see about humidity:
Of three modules embedding a humidity sensor, DHT22 reported values are way lower than the other two ones (BME280 and Si7021): around 12% (points). I used the following Node.js libraries for this benchmark (thanks to all their authors/contributors):
- BME280: bme280-sensor
- Si7021: si7021-sensor
- DS18b20: ds18b20-raspi
- DHT22: node-dht-sensor
Conclusion
Except for the BME280 (internal temp sensor), reported temperatures are all within a few tenth of a degree Celsius, which is quite satisfying. So which sensor to choose? I'd go for the DS18B20 for temperature only, which is quite cheap, easy to connect, and has a good precision. If humidity measurements are also needed, I'd go for the Si7021. At last, if atmospheric pressure measurements are needed, I'd go for the BME280, subtracting about a degree Celsius from the reported temperature.
I'm Michael BOUVY, CTO and co-founder of Click&Mortar, a digital agency based in Paris, France, specialized in e-commerce.
Over the last years, I've worked as an Engineering Manager and CTO for brands like Zadig&Voltaire and Maisons du Monde.
With more than 10 years experience in e-commerce platforms, I'm always looking for new challenges, feel free to get in touch!