Sensors: BME680

From HiveTool
Revision as of 10:03, 20 August 2018 by Paul (talk | contribs) (Manufacturers and Suppliers)
Jump to: navigation, search
PiMoroni BME680 breakout board

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 BMS680:

These can also be purchased through Digi-Key.

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