Sense Hat sensor wierdness. Ambient light is affecting humididty reading?
Posted: Sun Apr 15, 2018 7:51 pm
I have a Sense Hat mounted to a Pi A+ setup as a weather clock. It displays the day, date, time, temp, humidity and barometric pressure in a continuously scrolling message on the LED matrix. Just recently the humidity started displaying negative values when I take it outside. I have another one in the house that never does this. I swapped sense hats between the two and it made no difference. The one in the house reads normal but my portable one reads negative values some times, when outside and the humidity is low. I redid the install with the latest Stretch and it didn't help.
My portable is in a waterproof enclosure, but I have drilled some vent holes in it so outside air can get in. And any hot air generated by the electronics can get out. I'm thinking I may have to add more holes or make them bigger maybe? The vent holes are small so rain and snow can't get on the electronics. I have a couple on each side and a few on the bottom. Build pictures are here, https://1drv.ms/f/s!AjOYwiwlwDtpgq8_0VrdS3_H5xL_AA
Power is supplied by a powerboost 1000c and LIPO battery. Temps did read high so I added a BMP180, mounted externally to read the ambient temps. I also have an Si1145 to read the UV and ambient light levels. I use the light levels to adjust the LED matrix brightness. Here is the code I'm using.
My portable is in a waterproof enclosure, but I have drilled some vent holes in it so outside air can get in. And any hot air generated by the electronics can get out. I'm thinking I may have to add more holes or make them bigger maybe? The vent holes are small so rain and snow can't get on the electronics. I have a couple on each side and a few on the bottom. Build pictures are here, https://1drv.ms/f/s!AjOYwiwlwDtpgq8_0VrdS3_H5xL_AA
Power is supplied by a powerboost 1000c and LIPO battery. Temps did read high so I added a BMP180, mounted externally to read the ambient temps. I also have an Si1145 to read the UV and ambient light levels. I use the light levels to adjust the LED matrix brightness. Here is the code I'm using.
Code: Select all
import os
import time, datetime
import Adafruit_BMP.BMP085 as BMP085
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
bmp = BMP085.BMP085()
uvs = SI1145.SI1145()
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()
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))
t = bmp.read_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)
h = sense.get_humidity()
h = (round(h))
if h > 100:
h = 100
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)
else:
hc = [255, w, w] # Red
msg = "with %s%% Humidity" % (h)
sense.show_message(msg, scroll_speed=s, text_colour=hc)
readvis()
ph = bmp.read_pressure()
p = ph / 100
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()
#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 April 12th 2018
# run sudo crontab -e
# add
# @reboot python3 /home/pi/THPU.py &