Sensors: BME680
Contents
Sumary
Support has been added for the Bosh BME680 temperature, humidity, air pressure, and VOC sensor. The sensor is available mounted on a breakout board from Adafruit and PiMoroni.
Introduction
The BME680 measures temperature, humidity, air pressure, and VOCs. It has both I2C and SPI buses.
Manufacturers and Suppliers
Adafruit and PiMoroni manufacture breakout boards for the BME680:
These can also be purchased from the manufactures or through Digi-Key and other electronic suppliers.
The PiMoroni I2C address can be changed by soldering a jumper on the board so two of them can be used on one Pi.
Wiring
The BME680 (or any I2C device) may be connected to Hive Interface Board two ways, by plugging into the LUX RJ11 (J1) or wired to the Real Time Clock connector, H2.
Plug into LUX RJ11 Input
The BME680 can plug into the LUX RJ11 input. It can be used in lieu of the LUX sensor or wired in parallel with it. The LUX sensor TSL2591 and the MBE680 (and the RTC) will all work plugged into the I2C bus.
Wire to H2
The H2 header connector is designed for the Real Time Clock, but if that is not used, the BME680 (or any I2C device) may be wired to this header.
Note that this pin out is only for the Hive Interface boards ver 1.0. The wiring will be slightly different for the ver 0.3 boards and earlier.
H2 I2C Bus ver 1.0 | Adafruit break out board | |
---|---|---|
Pin | Signal | BME680 |
1 | +3.3 | VIN |
2 | I2C | SDI |
3 | I2C | SCK |
4 | NC | |
5 | Ground | GND |
Test
A simple test is to run i2cdetect from the command line and see which device addresses are detected:
i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- 29 -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- 77
77 is the Adafruit BME680. The PiMoroni maps into 76 or 77 depending on how it is jumpered.
29 is the LUX sensor
Bosch Sensortec c routines
Download the drivers
git clone https://github.com/BoschSensortec/BME680_driver.git git clone https://github.com/twartzek/bme680-raspberry.git
Copy or move the raspberry pi code to the BME69-680_+driver directory.
cp bme680-raspberry/* BME680_driver/
Compile
gcc bme680_main.c bme680.c -o bme680
Test
./bme680 **** BME680 start measurements **** 2018-07-05 13:27:40 T: 25.14 degC, P: 942.12 hPa, H: 74.29 %rH, G: 8029 Ohms 2018-07-05 13:27:43 T: 25.13 degC, P: 942.12 hPa, H: 74.29 %rH, G: 9043 Ohms 2018-07-05 13:27:46 T: 25.11 degC, P: 942.10 hPa, H: 74.38 %rH, G: 9976 Ohms **** Measurement finished ****
Oops! Looks like we have a problem with the temperature readings going to zero. Notice that the pressure reading shifts about 60 hPa and rH shifts about 4% when the temperature goes to zero. Maybe try the SPI interface?
No. Seems to be a timing problem in reading the temperature sensor. It works fine on a Pi B+. I think the other sensors shift because the temperature is used to compensate them.
These bad reading were run on a Pi3B+:
**** BME680 start measurements **** 2018-07-05 14:28:38 T: 23.37 degC, P: 942.85 hPa, H: 84.02 %rH, G: 186746 Ohms 2018-07-05 14:28:41 T: 23.37 degC, P: 942.87 hPa, H: 84.05 %rH, G: 211715 Ohms 2018-07-05 14:28:44 T: 23.37 degC, P: 942.85 hPa, H: 84.06 %rH, G: 223194 Ohms **** Measurement finished **** **** BME680 start measurements **** 2018-07-05 14:28:53 T: 0.00 degC, P: 905.57 hPa, H: 80.40 %rH, G: 186007 Ohms 2018-07-05 14:28:56 T: 0.00 degC, P: 905.57 hPa, H: 80.41 %rH, G: 212125 Ohms 2018-07-05 14:28:59 T: 0.00 degC, P: 905.57 hPa, H: 80.41 %rH, G: 223043 Ohms **** Measurement finished **** **** BME680 start measurements **** 2018-07-05 14:29:08 T: 0.00 degC, P: 905.59 hPa, H: 80.46 %rH, G: 185797 Ohms 2018-07-05 14:29:11 T: 0.00 degC, P: 905.61 hPa, H: 80.45 %rH, G: 212261 Ohms 2018-07-05 14:29:14 T: 0.00 degC, P: 905.61 hPa, H: 80.43 %rH, G: 223497 Ohms **** Measurement finished **** **** BME680 start measurements **** 2018-07-05 14:29:23 T: 23.35 degC, P: 942.87 hPa, H: 84.19 %rH, G: 186640 Ohms 2018-07-05 14:29:26 T: 23.35 degC, P: 942.87 hPa, H: 84.20 %rH, G: 213361 Ohms 2018-07-05 14:29:29 T: 23.35 degC, P: 942.87 hPa, H: 84.18 %rH, G: 223497 Ohms **** Measurement finished **** **** BME680 start measurements **** 2018-07-05 14:29:39 T: 23.35 degC, P: 942.87 hPa, H: 84.23 %rH, G: 186428 Ohms 2018-07-05 14:29:42 T: 23.36 degC, P: 942.87 hPa, H: 84.19 %rH, G: 213361 Ohms 2018-07-05 14:29:45 T: 23.36 degC, P: 942.89 hPa, H: 84.03 %rH, G: 223043 Ohms **** Measurement finished **** **** BME680 start measurements **** 2018-07-05 14:29:54 T: 0.00 degC, P: 905.55 hPa, H: 80.39 %rH, G: 186640 Ohms 2018-07-05 14:29:57 T: 0.00 degC, P: 905.55 hPa, H: 80.46 %rH, G: 211715 Ohms 2018-07-05 14:30:00 T: 0.00 degC, P: 905.53 hPa, H: 80.49 %rH, G: 224105 Ohms **** Measurement finished ****
These reading were run on a Pi B+:
2018-07-06 18:46:01 T: 22.71 degC, P: 939.45 hPa, H: 87.01 %rH, G: 30935 Ohms 2018-07-06 18:51:02 T: 22.70 degC, P: 939.40 hPa, H: 87.06 %rH, G: 31165 Ohms 2018-07-06 18:56:03 T: 22.70 degC, P: 939.32 hPa, H: 87.12 %rH, G: 31469 Ohms 2018-07-06 19:01:03 T: 22.69 degC, P: 939.30 hPa, H: 86.99 %rH, G: 31398 Ohms 2018-07-06 19:06:04 T: 22.69 degC, P: 939.26 hPa, H: 87.11 %rH, G: 31493 Ohms 2018-07-06 19:11:04 T: 22.68 degC, P: 939.12 hPa, H: 87.02 %rH, G: 31446 Ohms
PiMoroni Python driver
This Python driver seems to work well.
Install
curl https://get.pimoroni.com/bme680 | bash
Test
cd /home/pi/Pimoroni/bme680/examples cp read-all.py bme689.py vi bme689.py
#!/usr/bin/env python # from https://github.com/pimoroni/bme680 # examples/read_all.py # # https://learn.pimoroni.com/tutorial/sandyj/getting-started-with-bme680-breakout # # NOTE: device address is set in /usr/local/lib/python2.7/dist-packages/bme680/__init__.py # # To list the i2c device addresses: sudo i2cdetect -y 1 # import bme680 import time sensor = bme680.BME680() # 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) for name in dir(sensor.data): value = getattr(sensor.data, name) 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) i=0 data_bad=True try: while i < 10 : if sensor.get_sensor_data(): output = "{0:.2f} {1:.2f} {2:.2f} ".format(sensor.data.temperature, sensor.data.humidity, sensor.data.pressure) if i == 9: if sensor.data.heat_stable: print("{0} {1}".format(output, sensor.data.gas_resistance)) data_bad = False else: print("{0} NULL".format(output)) else: time.sleep(1) i += 1 except KeyboardInterrupt: pass