alphanumeric
Posts: 1379
Joined: Tue Jan 19, 2016 2:17 pm
Location: Sydney, Nova Scotia, Canada

Sense Hat sensor wierdness. Ambient light is affecting humididty reading?

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.

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 &


Last edited by alphanumeric on Thu Apr 19, 2018 7:57 pm, edited 2 times in total.

alphanumeric
Posts: 1379
Joined: Tue Jan 19, 2016 2:17 pm
Location: Sydney, Nova Scotia, Canada

Re: Humididty reading negative values?

Mon Apr 16, 2018 7:37 pm

Increasing the case ventilation didn't help. So what is the trick to getting the sense hat to read accurately? They are in a case on the space station, do they not work there?

alphanumeric
Posts: 1379
Joined: Tue Jan 19, 2016 2:17 pm
Location: Sydney, Nova Scotia, Canada

Re: Humididty reading negative values?

Thu Apr 19, 2018 1:16 pm

The plot thickens? I just redid my portable with an older Jessie backup image I had made, and swapped in my current python file. Still doing it. What I discovered though, is its the sunlight doing it? If I put it in direct sunlight the % humidity goes to 0%. Almost immediately so its not from the heat of the sun. I have it coded to just show 0 if its zero or below. Thinking I may have messed up my code for the light sensor some how and it was interacting, I took my indoor one out side for a test. It does the same thing? No light sensor ect on this one and no auto DIM etc. If I manually set it to full bright, and all white text, inside it reads the humidity OK. So its not my python code.
My inside weather clock is a Pi A+, DS3231 RTC on a Proto Hat and Sense Hat on top of that. No case, open air cooling.
My portable weather clock is the same as above but has a BMP180 temp sensor and Si1145 light sensor. The BMP180 is mounted externally on the bottom of the case, and the Si1145 is mounted externally on the top of the case. Both Sense hats have black diffusers mounted in front. The portable is in a weather proof case that has ventilation holes drilled in it. It's powered by a powerboost 1000c and LIPO battery.
I usually place the portable in the shade to make reading the LED matrix easier, and help get accurate temp readings. Because of a wet field at our dog park we have moved and its been out in the sun more. And that's when I noticed the weird readings. Here is the simpler code I use for my indoor unit.

Code: Select all

import os
import time, datetime
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 = True

s=(0.065) # scroll speed
w=(0) # color all white toggle
x=(2) #shutdown variable

# is really stick down
def pushed_up(event):
    if event.action == ACTION_PRESSED:
       sense.low_light = True
        
# is really stick up
def pushed_down(event):
    if event.action == ACTION_PRESSED:
       sense.low_light = False

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

def pushed_middle(event):
    global x
    if event.action == ACTION_PRESSED:
        x = 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

while True:

    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 = sense.get_temperature()
    t = round(t)
          
    if t <= 0: 
        tc = [w, w, 255]  # Blue
    elif t > 0 and t < 13:
        tc = [255, 255, w]  # Yellow
    elif t >= 13 and t <= 25:
        tc = [w, 255, w]  # Green
    elif t > 25:
        tc = [255, w, w]  # Red                 
    msg = "and %sc" % (t)
    sense.show_message(msg, scroll_speed=s, text_colour=tc)

    h = sense.get_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)

    p = sense.get_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)
        
    if x == 0:
        sense.clear()
        os.system("sudo shutdown now -P")
        time.sleep(30)
    elif x == 1:
        sense.clear()
        raise SystemExit
        time.sleep(30)

I use the sense hat joystick to adjust the LED matrix screen brightness and do a shutdown. Stick up is bright, stick down is low light. Right changes the text to all white, left to colored text. Center push shuts down. I was doing this manually on my portable to make reading the LED matrix easier in bright light. Now I use the Si1145 to do it all manually.

alphanumeric
Posts: 1379
Joined: Tue Jan 19, 2016 2:17 pm
Location: Sydney, Nova Scotia, Canada

Re: Humididty reading negative values?

Thu Apr 19, 2018 7:11 pm

Ok, I had a friend check his Sense Hat and its doing the same thing? Ambient light shining on the sensor is causing the % humidity reading to immediately decrease. The brighter the light the more the reading goes negative. How is this even possible? :shock:

alphanumeric
Posts: 1379
Joined: Tue Jan 19, 2016 2:17 pm
Location: Sydney, Nova Scotia, Canada

Re: Sense Hat sensor wierdness. Ambient light is affecting humididty reading?

Fri Apr 20, 2018 9:12 am

I put a small piece of black packing foam over the sensor, and masked off the back part of the diffusor over the sensor. It appears to be reading normal now. Air is getting through the foam but the light isn't. It's giving me a reading and that's not changing when I move it from dark to light. The only gotcha may be if the foam retains any moisture in high humidity conditions. I'll likely figure something better out eventually, but it will do for now.

alphanumeric
Posts: 1379
Joined: Tue Jan 19, 2016 2:17 pm
Location: Sydney, Nova Scotia, Canada

Re: Sense Hat sensor wierdness. Ambient light is affecting humididty reading?

Sat Apr 21, 2018 8:59 am

No comment from Pi Foundation? Or anybody for that matter? I'm not making this stuff up guys.

alphanumeric
Posts: 1379
Joined: Tue Jan 19, 2016 2:17 pm
Location: Sydney, Nova Scotia, Canada

Re: Sense Hat sensor wierdness. Ambient light is affecting humididty reading?

Tue Apr 24, 2018 10:55 am

@ShiftPlusOne @jamesh Any comment? Just looking for some feedback?

User avatar
bensimmo
Posts: 2487
Joined: Sun Dec 28, 2014 3:02 pm
Location: East Yorkshire

Re: Sense Hat sensor wierdness. Ambient light is affecting humididty reading?

Tue Apr 24, 2018 11:37 am

I just used a small program with printing humidity and a sleep in a loop every half second
Shined and white led light tourch and no change. Just reading flickering between 56+-0.8, it not the most stable reading.


I can try brighter lights.
Putting a black SD card resting just above it doesn't alter it really. (We have bright led lighting in here).

alphanumeric
Posts: 1379
Joined: Tue Jan 19, 2016 2:17 pm
Location: Sydney, Nova Scotia, Canada

Re: Sense Hat sensor wierdness. Ambient light is affecting humididty reading?

Tue Apr 24, 2018 11:42 am

If you can, try bright sunlight, maybe its UV or non visible light? I'm going to go get a flashlight and see what that does for me. Thank's for the reply. This one really has me scratching my head.

alphanumeric
Posts: 1379
Joined: Tue Jan 19, 2016 2:17 pm
Location: Sydney, Nova Scotia, Canada

Re: Sense Hat sensor wierdness. Ambient light is affecting humididty reading?

Tue Apr 24, 2018 11:48 am

Shining a flashlight on the humidity sensor is lowering the reading for me. Went from 60% to 30%. Flashlight needs a new battery. My Sense hat shows as version 1.0 if that matters. And has (c) Raspberry Pi 2015 silk screened on it.

alphanumeric
Posts: 1379
Joined: Tue Jan 19, 2016 2:17 pm
Location: Sydney, Nova Scotia, Canada

Re: Sense Hat sensor wierdness. Ambient light is affecting humididty reading?

Tue Apr 24, 2018 11:53 am

Hmm, this is interesting. Shining my LED flashlight on it does noting, but shining my older flashlight with an incandescent bulb in it lowers the reading.

alphanumeric
Posts: 1379
Joined: Tue Jan 19, 2016 2:17 pm
Location: Sydney, Nova Scotia, Canada

Re: Sense Hat sensor wierdness. Ambient light is affecting humididty reading?

Tue Apr 24, 2018 12:01 pm

It appears white LED's are Blue LED's with extra phosphor.

Return to “Astro Pi”

Who is online

Users browsing this forum: No registered users and 1 guest