Protetor de tela ativado e desativado no Raspberry Pi - script em Python


0

Eu sou um noob em programação em python. Como faço para criar um script que desperte o monitor e o coloque em suspensão em uma condição?

import RPi.GPIO as GPIO

PIR = 23


GPIO.setmode(GPIO.BCM)
GPIO.setup(PIR, GPIO.IN)

while True:
    if GPIO.input(PIR):
        """ There should be the "awake monitor" function """"
    else:
        """" There should be something that makes my script run over and over but after for example 2 minutes after there is no signal on PIR.

Como você pode ver, eu tenho um sensor de movimento, que quero que meu monitor acorde do sono toda vez que ele perceber um movimento, mas depois que não houver mais movimento em sua área, após dois minutos, o monitor deverá ser colocado em repouso.

Você pode por favor me ajudar?

Respostas:


0

Instale o x11-xserver-utilspacote para obter o xsetcomando. Em seguida, você pode usá-lo para forçar ou desativar os sinais DPMS no monitor. Pode ser necessário definir a DISPLAYvariável no ambiente. Por exemplo:

DISPLAY=:0 xset dpms force on
sleep 10
DISPLAY=:0 xset dpms force off

Você pode fazer algo assim em python. Votação a cada segundo. Lembre-se de ter ativado ou desativado a exibição. Observe a hora do dia sempre que seu sinal estiver ativo. Quando o tempo desde a última atividade ativa for superior a 2 minutos, desligue o visor. Vagamente:

import os, subprocess, time
os.environ['DISPLAY'] = ":0"

displayison = False
maxidle = 2*60 # seconds
lastsignaled = 0
while True:
    now = time.time()
    if GPIO.input(PIR):
        if not displayison:
            subprocess.call('xset dpms force on', shell=True)
            displayison = True
        lastsignaled = now
    else:
        if now-lastsignaled > maxidle:
            if displayison:
                subprocess.call('xset dpms force off', shell=True)
                displayison = False
    time.sleep(1)

Se você está interagindo com a tela e deseja que ela permaneça ligada durante esse tempo, independentemente do seu gpio, provavelmente é melhor deixar o mecanismo ocioso padrão do X11 detectar que dois minutos ociosos se passaram e desligar a tela automaticamente. Basta usar o seu programa para forçar a tela.

Você pode definir um tempo limite inativo de 120 segundos com uma única chamada de:

xset dpms 120 120 120

e pode remover a força do python.


Comando em si xset dpms force one offfunciona perfeitamente na linha de comando. O problema é que, quando no script python, após o comando, xset dpms force offa tela pisca em preto uma vez e volta ao estado normal. O outro problema é que meu sensor de movimento está fornecendo os dados para o RPi por 3 segundos, pois mantém a tensão em um pino, então qual deve ser o loop que estou usando para interrompê-lo depois de terminar o loop uma vez?
Tarzanno 18/07

@tarzanno Você está executando algum cliente X11 no visor?
meuh 18/07/2015

Eu recebi um erro em: `se now-lastsignaled> maxidle:` `name" lastsignaled "não está definido '. Como faço para corrigir e o que faz? Obrigado pela sua ajuda!
Tarzanno

@tarzanno Você precisa inicializar a variável lastsignaledantes de usá-la. Eu editei minha resposta.
Meu 18/07/15

Você é O HOMEM! :) Funciona bem, mas apenas uma vez. Após uma tela preta e voltando ao estado sem protetor de tela, o script não está quebrando, mas também não está mais funcionando. Talvez seja porque o loop não está voltando ao início?
Tarzanno 18/07
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.