In this article we will connect a BME680 sensor to an Raspberry Pi
Sensor Information
BME680 is an integrated environmental sensor developed specifically for mobile applications and wearables where size and low power consumption are key requirements. Expanding Bosch Sensortec’s existing family of environmental sensors, the BME680 integrates for the first time high-linearity and high-accuracy gas, pressure, humidity and temperature sensors.
The gas sensor within the BME680 can detect a broad range of gases to measure air quality for personal well being.
Gases that can be detected by the BME680 include Volatile Organic Compounds (VOC) from paints (such as formaldehyde), lacquers, paint strippers, cleaning supplies, furnishings, office equipment, glues, adhesives and alcohol.
Parameters
Parameter | Technical data |
---|---|
Package dimensions | 8-Pin LGA with metal 3.0 x 3.0 x 0.93 mm³ |
Operation range (full accuracy) | Pressure: 300…1100 hPa Humidity 0…100% Temperature: -40…85°C |
Supply voltage VDDIO Supply voltage VDD |
1.2 … 3.6 V 1.71 … 3.6 V |
Interface | I²C and SPI |
Average current consumption (1Hz data refresh rate) |
2.1 µA at 1 Hz humidity and temperature 3.1 µA at 1 Hz pressure and temperature 3.7 µA at 1 Hz humidity, pressure and temperature 0.09‒12 mA for p/h/T/gas depending on operation mode |
Average current consumption in sleep mode | 0.15 μA |
Gas sensor Response time (τ 33-63%) Sensor-to-sensor deviation Power consumption Output data processing |
< 1 s (for new sensors) +/- 15% +/- 15 < 0.1 mA in ultra-low power mode direct output of IAQ: Index for Air Quality |
Humidity sensor Response time (τ0-63%) Accuracy tolerance Hysteresis |
8 s ± 3 % relative humidity ≤ 1.5 % relative humidity |
Pressure sensor RMS Noise Sensitivity Error Temperature coefficient offset |
0.12 Pa (equiv. to 1.7 cm) ± 0.25 % (equiv. to 1 m at 400 m height change) ±1.3 Pa/K (equiv. to ±10.9 cm at 1°C temperature change) |
Parts List
Name | Link |
Raspberry Pi Zero | Aliexpress product link |
BME680 Sensor | Aliexpress product linkAmazon link |
Connecting wire | Aliexpress product link |
Schematic
We chose a Pi Zero, any Raspberry Pi should work just fine.
Code
The example library and code examples come from pimoroni who have a breakout for this sensor, it worked just fine with my sensor as well
git clone https://github.com/pimoroni/bme680
cd bme680/library
sudo python setup.py install
The library should now be installed. You’ll find the examples in bme680/examples
.
I used the read-all.py example
[python]
#!/usr/bin/env python import bme680 import time print("""Display Temperature, Pressure, Humidity and Gas Press Ctrl+C to exit """) try: sensor = bme680.BME680(bme680.I2C_ADDR_PRIMARY) except IOError: sensor = bme680.BME680(bme680.I2C_ADDR_SECONDARY) # These calibration data can safely be commented # out, if desired. print('Calibration data:') for name in dir(sensor.calibration_data): if not name.startswith('_'): value = getattr(sensor.calibration_data, name) if isinstance(value, int): print('{}: {}'.format(name, value)) # These oversampling settings can be tweaked to # change the balance between accuracy and noise in # the data. sensor.set_humidity_oversample(bme680.OS_2X) sensor.set_pressure_oversample(bme680.OS_4X) sensor.set_temperature_oversample(bme680.OS_8X) sensor.set_filter(bme680.FILTER_SIZE_3) sensor.set_gas_status(bme680.ENABLE_GAS_MEAS) print('\n\nInitial reading:') for name in dir(sensor.data): value = getattr(sensor.data, name) if not name.startswith('_'): print('{}: {}'.format(name, value)) sensor.set_gas_heater_temperature(320) sensor.set_gas_heater_duration(150) sensor.select_gas_heater_profile(0) # Up to 10 heater profiles can be configured, each # with their own temperature and duration. # sensor.set_gas_heater_profile(200, 150, nb_profile=1) # sensor.select_gas_heater_profile(1) print('\n\nPolling:') try: while True: if sensor.get_sensor_data(): output = '{0:.2f} C,{1:.2f} hPa,{2:.2f} %RH'.format( sensor.data.temperature, sensor.data.pressure, sensor.data.humidity) if sensor.data.heat_stable: print('{0},{1} Ohms'.format( output, sensor.data.gas_resistance)) else: print(output) time.sleep(1) except KeyboardInterrupt: pass
[/python]
Output
In the terminal you should see something like this