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 &