GPIO Ausgänge nach inaktivität auf low setzen

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
Marouh
User
Beiträge: 2
Registriert: Freitag 2. Februar 2018, 16:03

Freitag 2. Februar 2018, 16:56

Hallo
ich bin neu hier im Forum und hab mir hier früher immer wieder kleine Anregungen für meine kleinen Spielerein mit der Pi holen könne.
Dafür erst mal danke sehr.
Nun habe ich ein Problem, ich habe mir ein Skript in Python herrunter geladen und für mein Projekt angepasst.
Projekt:
Über Sensorfelder die an einem Fenster befestigt sind, werden beim Touch die entsprechenden GPIO Ausgänge geschaltet. Soweit alles gut.
Ich möchte aber dass nach einer Zeit (x) der Inaktivität alle Ausgänge wieder den Zustand "aus" also Low einnehmen.
Hintergrund ist, dass man von außen über eine Scheibe alles einschaltet und es sonst an bleibt. Das skript sollte dann die Abschaltfunktion übernehmen und wieder in Start Ausgang gehen.

Nachfolgend hab ich das Skript beigefügt.
Danke schon mal für Tips und Hinweise.

#!/usr/bin/python
# -*- coding: utf-8 -*-

from __future__ import print_function
import os
import sys
import pygame
import time
from pygame.locals import *
from RPi import GPIO

#------------------------------------------------------------------------

red = 17
green = 22
white = 27
yellow = 5
orange = 6
grey = 13
brown = 23
black = 24



GPIO.setmode(GPIO.BCM)


#------------------------------------------------------------------------

GPIO.setwarnings(False)
GPIO.setup(red, GPIO.OUT)
GPIO.setup(green, GPIO.OUT)
GPIO.setup(white, GPIO.OUT)
GPIO.setup(yellow, GPIO.OUT)
GPIO.setup(orange, GPIO.OUT)
GPIO.setup(grey, GPIO.OUT)
GPIO.setup(brown, GPIO.OUT)
GPIO.setup(black, GPIO.OUT)

os.environ["SDL_FBDEV"] = "/dev/fb1"
width = 320
height = 240
size = (width, height)
pygame.display.init()
screen = pygame.display.set_mode(size)

def schalten(pin):
current_state = GPIO.input(pin)
GPIO.output(pin, not current_state)
print('switched GPIOpin {} from {} to {}' . format(pin, current_state, (not current_state)))


try:
running=True
clock = pygame.time.Clock()

while running:
clock.tick(10)
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.KEYDOWN:

if event.key == K_a:
print('Key "a" is pressed')
schalten(red)
elif event.key == K_b:
print('Key "b" is pressed')
schalten(green)
elif event.key == K_c:
print('Key "c" is pressed')
schalten(white)
elif event.key == K_d:
print('Key "d" is pressed')
schalten(yellow)
elif event.key == K_e:
print('Key "e" is pressed')
schalten(orange)
elif event.key == K_f:
print('Key "f" is pressed')
schalten(grey)
elif event.key == K_g:
print('Key "g" is pressed')
schalten(brown)
elif event.key == K_h:
print('Key "h" is pressed')
schalten(black)
else:
print('Unknown Key: "{}"'.format(str(pygame.key.name(event.key))))

except pygame.error, perr:
print('pygame Error: ' + str(perr))
except (KeyboardInterrupt, SystemExit):
running = False
GPIO.cleanup()
print('\nQuit\n')


Danke nochmals für eure Hilfe.
__deets__
User
Beiträge: 2671
Registriert: Mittwoch 14. Oktober 2015, 14:29

Freitag 2. Februar 2018, 17:12

Bitte code-tags verwenden beim posten, sonst ist dein Code nicht verstaendlich.

Und was dein Problem angeht: du benutzt doch pygame. Da kannst du dir ticks holen, https://www.pygame.org/docs/ref/time.html - und damit dann einfach einen Zeitstempel anlegen, wenn es aktivitaet gegeben hat, und vergleichen, ob dieser Zeitstempel schon weit genug in der Vergangenheit liegt, um eben deine Aktivitaet zu beenden.
Sirius3
User
Beiträge: 7586
Registriert: Sonntag 21. Oktober 2012, 17:20

Samstag 3. Februar 2018, 17:12

@Marouh: ein paar Anmerkungen zum Code. GPIO-Warnungen sollte man beheben und nicht ignorieren. Code strukturiert man duch gute Funktionsnamen, nicht durch Kommentar-Linien. Statt der Langen if-else-Kette solltest Du ein Wörterbuch benutzen. Die Variable `running` ist unnötig. Statt sys.exit solltest Du besser return nehmen, um eine main-Funktion zu verlassen. ›str‹ ist bei ›format‹ unnötig. Du benutzt try-except falsch. Alles was zum Aufräum-Code gehört, muß in einen finally-Block.

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: utf-8 -*-

from __future__ import print_function
import os
import pygame
from pygame.locals import *
import RPi.GPIO as gpio

KEY_TO_PIN = {
    K_a: 17, # red
    K_b: 22, # green
    K_c: 27, # white
    K_d: 5,  # yellow
    K_e: 6,  # orange
    K_f: 13, # grey
    K_g: 23, # brown
    K_h: 24, # black
}
SIZE = (320, 240)

def initialize():
    gpio.setmode(gpio.BCM)
    gpio.setup(KEY_TO_PIN.values(), gpio.OUT)
    os.environ["SDL_FBDEV"] = "/dev/fb1"
    pygame.display.init()
    screen = pygame.display.set_mode(SIZE)
    return screen

def schalten(pin):
    current_state = gpio.input(pin)
    gpio.output(pin, not current_state)
    print('switched GPIOpin {} from {} to {}' . format(pin, current_state, (not current_state)))
    
def main():
    try:
        screen = initialize()
        clock = pygame.time.Clock()
        while True:
            clock.tick(10)
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    return
                elif event.type == pygame.KEYDOWN:
                    if event.key in KEY_TO_PIN:
                        print('Key "{}" is pressed'.format(pygame.key.name(event.key)))
                        schalten(KEY_TO_PIN[event.key])
                    else:
                        print('Unknown Key: "{}"'.format(pygame.key.name(event.key)))
    except KeyboardInterrupt:
        pass
    finally:
        gpio.cleanup()
        pygame.quit()
        print('\nQuit\n')

if __name__ == '__main__':
    main()
Marouh
User
Beiträge: 2
Registriert: Freitag 2. Februar 2018, 16:03

Montag 5. Februar 2018, 19:57

Vielen lieben dank für eure Hilfe.
Ich werde versuchen alles zu beherzigen worauf Ihr mich hingewiesen habt. Ich habe von Python leider keine Ahnung. Ich hab (wie oben erwähnt) das Skript aus dem Netz geladen und nur angepasst auf meine 8 Tasteingänge und es hat super funktioniert. Ich komme aus dem Bereich der Alarmanlagentechnik und baue ein Modelhaus, In diesem werden verschiedene Zenarien angesteuert. Licht, Alarm, ein Rollladen usw.

Deshalb bitte ich um Verständnis wenn mein Skript alles andere als optimal ist. Ich bin dabei mich in Python einzulesen aber mehr als anpassen hab ich noch nicht erreicht. Auch in anderen Projekten bin ich in der Lage Skripte anzupassen aber leidern nicht selbst zu Programmieren :( . Es ist wie ein Liebesbrief wo Mann keinen Anfang findet... aber eigentlich genau weis was man möchte.

Viele lieben dank für eure Hilfe und ich werde versuchen die Tage was daraus zu machen, wenn man mich auf Arbeit in Ruhe lässt.
Danke sehr.
Antworten