Difference between revisions of "Sensors: BME680"
Line 1: | Line 1: | ||
− | ==BME680== | + | ==Introduction== |
+ | |||
+ | The BME680 measures temperature, humidity, air pressure, and VOCs. It has both I2C and SPI buses. | ||
+ | |||
+ | ===Suppliers=== | ||
Two sources for the BMS680 board are: | Two sources for the BMS680 board are: | ||
*Adafruit | *Adafruit | ||
− | * | + | *PimMroni |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | ==Wiring== | |
− | + | ===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. | 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=== | |
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. | 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. | ||
Line 58: | Line 48: | ||
|} | |} | ||
− | ====Test | + | ==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 | ||
Line 113: | Line 117: | ||
2018-07-06 19:11:04 T: 22.68 degC, P: 939.12 hPa, H: 87.02 %rH, G: 31446 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. | This Python driver seems to work well. | ||
− | + | ===Install=== | |
curl https://get.pimoroni.com/bme680 | bash | curl https://get.pimoroni.com/bme680 | bash | ||
− | + | ===Test=== | |
cd /home/pi/Pimoroni/bme680/examples | cd /home/pi/Pimoroni/bme680/examples | ||
cp read-all.py bme689.py | cp read-all.py bme689.py |
Revision as of 02:49, 20 August 2018
Contents
Introduction
The BME680 measures temperature, humidity, air pressure, and VOCs. It has both I2C and SPI buses.
Suppliers
Two sources for the BMS680 board are:
- Adafruit
- PimMroni
Wiring
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
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 |
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