GPIO Ausgänge nach inaktivität auf low setzen

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

GPIO Ausgänge nach inaktivität auf low setzen

Beitragvon Marouh » 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.
Benutzeravatar
__deets__
User
Beiträge: 2154
Registriert: Mittwoch 14. Oktober 2015, 14:29

Re: GPIO Ausgänge nach inaktivität auf low setzen

Beitragvon __deets__ » 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: 7052
Registriert: Sonntag 21. Oktober 2012, 17:20

Re: GPIO Ausgänge nach inaktivität auf low setzen

Beitragvon Sirius3 » 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.

  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3.  
  4. from __future__ import print_function
  5. import os
  6. import pygame
  7. from pygame.locals import *
  8. import RPi.GPIO as gpio
  9.  
  10. KEY_TO_PIN = {
  11.     K_a: 17, # red
  12.     K_b: 22, # green
  13.     K_c: 27, # white
  14.     K_d: 5,  # yellow
  15.     K_e: 6,  # orange
  16.     K_f: 13, # grey
  17.     K_g: 23, # brown
  18.     K_h: 24, # black
  19. }
  20. SIZE = (320, 240)
  21.  
  22. def initialize():
  23.     gpio.setmode(gpio.BCM)
  24.     gpio.setup(KEY_TO_PIN.values(), gpio.OUT)
  25.     os.environ["SDL_FBDEV"] = "/dev/fb1"
  26.     pygame.display.init()
  27.     screen = pygame.display.set_mode(SIZE)
  28.     return screen
  29.  
  30. def schalten(pin):
  31.     current_state = gpio.input(pin)
  32.     gpio.output(pin, not current_state)
  33.     print('switched GPIOpin {} from {} to {}' . format(pin, current_state, (not current_state)))
  34.    
  35. def main():
  36.     try:
  37.         screen = initialize()
  38.         clock = pygame.time.Clock()
  39.         while True:
  40.             clock.tick(10)
  41.             for event in pygame.event.get():
  42.                 if event.type == pygame.QUIT:
  43.                     return
  44.                 elif event.type == pygame.KEYDOWN:
  45.                     if event.key in KEY_TO_PIN:
  46.                         print('Key "{}" is pressed'.format(pygame.key.name(event.key)))
  47.                         schalten(KEY_TO_PIN[event.key])
  48.                     else:
  49.                         print('Unknown Key: "{}"'.format(pygame.key.name(event.key)))
  50.     except KeyboardInterrupt:
  51.         pass
  52.     finally:
  53.         gpio.cleanup()
  54.         pygame.quit()
  55.         print('\nQuit\n')
  56.  
  57. if __name__ == '__main__':
  58.     main()
Marouh
User
Beiträge: 2
Registriert: Freitag 2. Februar 2018, 16:03

Re: GPIO Ausgänge nach inaktivität auf low setzen

Beitragvon Marouh » 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.

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder