Added a BME680 to one of my projects


#1

I have a portable Weather Clock that consists of a Pi A+, DS3231 RTC, Sense Hat, SI1145 light sensor and now a BME680. And a few other odds and ends, power boost and battery etc.


While the Sense Hat can measure most of what the BME680 can, the Sense Hat has issues when put in an enclosure, even a ventilated enclosure. The heat from the Pi and other electronics makes the temp read high. I think it also affects the humidity reading. I had a BMP180 mounted externally on the bottom of the case to get accurate temp readings.
Then I decided to move all the sensors to the exterior of the case and replaced the BMP180 with the BME680.
My case in ventilated and for the most part weatherproof. Rain and snow don’t get in, not that I’m aware of anyway. It was a waterproof case but isn’t now.
The SI1145 I use to measure the UV index and auto adjust the Sense Hat LED matrix. In very bright sunlight the text is set to all white and full bright to make it easier to read. In normal lighting conditions the text is colored based on conditions. The temp message will be blue if the temp is below 0c for example. I also have 4 10mm LEDS that I use as a secondary indication. Red, Yellow, Green and Blue. If the temp is below 0c the Blue LED is lit. Above 25c and the Red LED is lit etc. Those are turned off in dark conditions, and the LED matrix is set to low light (dimmed). It makes it easy on the eyes when I’m out on my deck after sunset. ;)
My next upgrade will be to replace the Sense Hat with a Unicorn Hat HD. Full build pictures are here,
https://1drv.ms/f/s!AjOYwiwlwDtpgq8_0VrdS3_H5xL_AA If anybody wants a look see. And here is the python code I’m using.

import os
import time, datetime
import bme680
import SI1145.SI1145 as SI1145
import RPi.GPIO as GPIO
from sense_hat import SenseHat, ACTION_PRESSED, ACTION_HELD, ACTION_RELEASED
   
sense = SenseHat()
sense.set_rotation(180)
sense.set_imu_config(False, False, False)
sense.low_light = False

uvs = SI1145.SI1145()
sensor = bme680.BME680()

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.DISABLE_GAS_MEAS)
#sensor.set_gas_heater_temperature(320)
#sensor.set_gas_heater_duration(150)
#sensor.select_gas_heater_profile(0)


GPIO.setmode(GPIO.BCM)  
GPIO.setwarnings(False)
GPIO.setup(5, GPIO.IN, pull_up_down = GPIO.PUD_OFF)  
GPIO.setup(16,GPIO.OUT, initial=1) #Red
GPIO.setup(19,GPIO.OUT, initial=1) #Yellow
GPIO.setup(20,GPIO.OUT, initial=1) #Green
GPIO.setup(21,GPIO.OUT, initial=1) #Blue


s=(0.1) # scroll speed
w=(0) # color all white toggle
o=(165)
L=(1) #LED's on or off
x=(2) #shutdown variable
m=(0)

def Shutdown(channel):  
    global x
    x = (0)

def readvis():
    vis = uvs.readVisible()
    vis = (round(vis))

    global w
    global o
    global L
    global m

    if vis < 270 and m == (0):
        sense.low_light = True
        w = (0)
        o = (165)
        L = (1)
    elif vis >= 270 and vis < 500 and m == (0):
        sense.low_light = False
        w = (0)
        o = (165)
        L = (0)
    elif vis >= 500 and m == (0):
        sense.low_light = False
        w = (255)
        o = (255)
        L = (0)
    
# is really stick down
def pushed_up(event):
    global L
    global m
    if event.action == ACTION_PRESSED:
       sense.low_light = True
       L = (1)
       m = (1)
        
# is really stick up
def pushed_down(event):
    global L
    global m
    if event.action == ACTION_PRESSED:
       sense.low_light = False
       L = (0)
       m = (1)

#is really stick right
def pushed_left(event):
    global w
    global o
    global m
    if event.action == ACTION_PRESSED:
        w = (255)
        o = (255)
        m = (1)
        
# is really stick left
def pushed_right(event):
    global w
    global o
    global m
    if event.action == ACTION_PRESSED:
        w = (0)
        o = (165)
        m = (1)

def pushed_middle(event):
    global m
    if event.action == ACTION_PRESSED:
        m = (0)

sense.stick.direction_up = pushed_up
sense.stick.direction_down = pushed_down
sense.stick.direction_left = pushed_left
sense.stick.direction_right = pushed_right
sense.stick.direction_middle = pushed_middle

GPIO.add_event_detect(5, GPIO.FALLING, callback = Shutdown, bouncetime = 2000)

while True:

    readvis()

    dateString = "%A %B %-d %-I:%M:%p"
    msg = "It is %s" % (datetime.datetime.now().strftime(dateString))
    sense.show_message(msg, scroll_speed=s, text_colour=(w, 255, 255))


    if sensor.get_sensor_data(): 

       t = (sensor.data.temperature) 
       t = (round(t))
          
    if t <= 0: 
        tc = [w, w, 255]   # Blue
        GPIO.output(16, 1) # Red
        GPIO.output(19, 1) # Yellow
        GPIO.output(20, 1) # Green
        GPIO.output(21, L) # Blue <
    elif t > 0 and t < 13:
        tc = [255, 255, w] # Yellow
        GPIO.output(16, 1) # Red
        GPIO.output(19, L) # Yellow <
        GPIO.output(20, 1) # Green
        GPIO.output(21, 1) # Blue
    elif t >= 13 and t <= 25:
        tc = [w, 255, w]   # Green
        GPIO.output(16, 1) # Red
        GPIO.output(19, 1) # Yellow
        GPIO.output(20, L) # Green <
        GPIO.output(21, 1) # Blue
    else:
        tc = [255, w, w]   # Red
        GPIO.output(16, L) # Red <
        GPIO.output(19, 1) # Yellow
        GPIO.output(20, 1) # Green
        GPIO.output(21, 1) # Blue
        
    msg = "and %sc" % (t)
    sense.show_message(msg, scroll_speed=s, text_colour=tc)


    if sensor.get_sensor_data(): 
       h = (sensor.data.humidity)
       h = (round(h))

    if h < 0:
        h = 0

    if h > 100:
        h = 100

    if h < 30:
        hc = [255, w, w]  # Red
        msg = "with %s%% Humidity" % (h)
        sense.show_message(msg, scroll_speed=s, text_colour=hc)
    elif h >= 30 and h <= 60:
        hc = [w, 255, w]  # Green
        msg = "with %s%% Humidity" % (h)
        sense.show_message(msg, scroll_speed=s, text_colour=hc)
    elif h > 60 and h < 80:
        hc = [255, 255, w]  # Yellow
        msg = "with %s%% Humidity" % (h)
        sense.show_message(msg, scroll_speed=s, text_colour=hc)
    elif h >= 80:
        hc = [255, w, w]  # Red
        msg = "with %s%% Humidity" % (h)
        sense.show_message(msg, scroll_speed=s, text_colour=hc)

    readvis()

    if sensor.get_sensor_data(): 
       p = (sensor.data.pressure) 
       p = round(p)
        
    if p > 0 and p < 985:
        pc = [255, w, w]  # Red
        msg = "- Barometer is Very Low @ %smb - Storm Watch" % (p)
        sense.show_message(msg, scroll_speed=s, text_colour=pc)
    elif p >= 985 and p < 1005:
        pc = [255, 255, w]  # Yellow
        msg = "- Barometer is Low @ %smb - Possible Percipitation" % (p)
        sense.show_message(msg, scroll_speed=s, text_colour=pc)
    elif p >= 1005 and p < 1025:
        pc = [w, 255, w]  # Green
        msg = "- Barometer is Mid Range @ %smb" % (p)
        sense.show_message(msg, scroll_speed=s, text_colour=pc)
    elif p >= 1025 and p < 1050:
        pc = [w, w, 255]  # Blue
        msg = "- Barometer is High @ %smb" % (p)
        sense.show_message(msg, scroll_speed=s, text_colour=pc)
    elif p >= 1050:
        pc = [255, w, w]  # Red
        msg = "- Barometer is Very High @ %smb - Expect Dry Conditions" % (p) 
        sense.show_message(msg, scroll_speed=s, text_colour=pc)

    uv = uvs.readUV()
    u = uv/100
    u = (round(u))

    if u > 0 and u < 3 and L == 0:
        msg = "- UV Index is Low @ %s" % (u)
        sense.show_message(msg, scroll_speed=s, text_colour=(w, 255, w)) # Green        
    elif u >= 3 and u < 6 and L == 0:
        msg = "- UV Index is Moderate @ %s" % (u)
        sense.show_message(msg, scroll_speed=s, text_colour=(255, 255, w)) # Yellow        
    elif u >= 6 and u < 8 and L == 0:
        msg = "- UV Index is High @ %s" % (u)
        sense.show_message(msg, scroll_speed=s, text_colour=(255, o, w)) # Orange       
    elif u >= 8 and u < 11 and L == 0:
        msg = "- UV Index is Very High @ %s" % (u)
        sense.show_message(msg, scroll_speed=s, text_colour=(255, w ,w)) # Red
    elif u >= 11 and L == 0:
        msg = "- UV Index is Extreme @ %s" % (u)
        sense.show_message(msg, scroll_speed=s, text_colour=(255, w, 255)) # Violet
        
    #vis = uvs.readVisible()
    #vis = (round(vis)) 

    #msg = "and the VIS is %s" % (vis)
    #sense.show_message(msg, scroll_speed=s, text_colour=(255, w, 255))

    if x == 0:
        sense.clear()
        os.system("sudo shutdown now -P")
        time.sleep(30)
    elif x == 1:
        sense.clear()
        raise SystemExit
        time.sleep(30)

# Last edited on May 10thth 2018
# run sudo crontab -e
# add
# @reboot python3 /home/pi/THPUVBME.py &