PIR Sensor



  • Hi, i have recently started building a smart mirror. Its taken me a while (software side) but i am getting there. My only issue is the PIR sensor. I have followed a tutorial and have it working great. It switches off my tv and turns it back on again. The problem is the no signal back ground i have when it switches off. I have a lg tv and its got an annoying cube that bounces around the screen. My question is how do i turn my screen black and not off. I have read some articles but i have not found any that work for me. I am using a PIR.py script and two on/off shell scripts. The shell scripts are as follows

    monitor_on.sh
    vcgencmd display_power 1

    monitor_off.sh
    vcgencmd display_power 0

    This works perfectly for turning my tv/hdmi off and back on again.
    I have read that the following shell scripts should turn the screen black but ive had no luck so far

    export DISPLAY=:0
    xset dpms force on

    export DISPLAY=:0
    xset dpms force off

    Any help would be appreciated as im a beginner and have run out of ideas. Thanks


  • Project Sponsor

    Do you have xscreensaver installed? that should do exactly what you are asking
    https://www.jwz.org/xscreensaver/man3.html

    Or maybe a wifi- wall plug could work better? (i.e cut the power to the tv completly)



  • @broberg

    Thanks for your response. No I haven’t got that installed. My question is how would I add that into my pir script so that the screen saver came on after a set time and to go off when the pir is activated? Many thanks


  • Project Sponsor

    @tinsebayacc

    Just replace your screen on and off commands with the xscreensaver commands. Should work.

    like

    for black screen :
    xscreensaver-command -activate

    and to deactivate black screen :
    xscreensaver-command -deactivate



  • Thanks again, i have just tried the following but nothing happens. If i run “xscreensaver-command -activate” from the terminal i get

    “xscreensaver-command: warning: $DISPLAY is not set: defaulting to “:0.0”.
    xscreensaver-command: activating”

    It then works and goes into a black screen, same thing for when i deactivate it. But nothing happens when i add it to my sh monitor on/off commands for my pir.py script.



  • @tinsebayacc U need to add

    DISPLAY=:0

    in front of your command

    See the installers/mm.sh for an example



  • Thank you, that got rid of that error. Still no joy with the PIR sensor though unfortunately.
    The strange thing is if i change my monitor_on and monitor_off sh files to

    vcgencmd display_power 0
    vcgencmd display_power 1

    the pir works fine and shuts off / turns on my monitor.

    these are my scrips

    #!/usr/bin/env python

    import sys
    import time
    import RPi.GPIO as io
    import subprocess

    io.setmode(io.BCM)
    SHUTOFF_DELAY = 30 # in seconds, how long the monitor will be on until next button press or PIR detection
    PIR_PIN = 22 # 15 on the board (this needn’t to be a PIR. Can be a button also)
    LED_PIN = 16 # optional, don’t use as Relay-PIN. It just shows detection time of the PIR without delay time

    def main():
    io.setup(PIR_PIN, io.IN)
    io.setup(LED_PIN, io.OUT)
    turned_off = False
    last_motion_time = time.time()

    while True:
        if io.input(PIR_PIN):
            last_motion_time = time.time()
            io.output(LED_PIN, io.LOW)
            print ".",
            sys.stdout.flush()
            if turned_off:
                turned_off = False
                turn_on()
        else:
            if not turned_off and time.time() > (last_motion_time + 
                                                 SHUTOFF_DELAY):
                turned_off = True
                turn_off()
            if not turned_off and time.time() > (last_motion_time + 1):
                io.output(LED_PIN, io.HIGH)
        time.sleep(.1)
    

    def turn_on():
    subprocess.call(“sh /home/pi/monitor_on.sh”, shell=True)

    def turn_off():
    subprocess.call(“sh /home/pi/monitor_off.sh”, shell=True)

    if name == ‘main’:
    try:
    main()
    except KeyboardInterrupt:
    io.cleanup()

    monitor on script

    DISPLAY=:0 xscreensaver-command -deactivate

    monitor off script

    DISPLAY=:0 xscreensaver-command -activate