Bin jetzt schon eine Weile dran ein Programm zu schreiben, dass eine Schiessampel nach der World Archery durchführen kann.
Leider habe ich im Moment einige Probleme damit:
Die GPIO. Eingänge, die ich über Taster mit 10K Pullup Widerständen angeschlossen habe, kann ich zwar mit folgendem Skript abrufen, jedoch klappt der Startbefehl im eigentlichen Programm nicht.
Code: Alles auswählen
#!/usr/bin/python3
from RPi import GPIO
from os import system, name
import time
import sys
GPIO.setmode(GPIO.BCM) #Art der Pin-Nummerierung
GPIO.setup(20, GPIO.IN) #NOT
GPIO.setup(16, GPIO.IN) #LICHT
GPIO.setup(12, GPIO.IN) #TREFFER
GPIO.setup(25, GPIO.IN) #FERTIG
GPIO.setup(24, GPIO.IN) #STECHEN
GPIO.setup(23, GPIO.IN) #MANN
GPIO.setup(18, GPIO.IN) #4MIN
GPIO.setup(26, GPIO.IN) #2MIN
try:
while True: # Endlosschleife, mit Strg-C beenden
input1 = GPIO.input(20)
print("NOT: " + str(input1)) #Ausgabe auf Bildschirm
time.sleep (0.1) #kurze Pause
input2 = GPIO.input(16)
print("LICHT: " + str(input2)) #Ausgabe auf Bildschirm
time.sleep (0.1) #kurze Pause
input3 = GPIO.input(12)
print("TREFFER: " + str(input3)) #Ausgabe auf Bildschirm
time.sleep (0.1) #kurze Pause
input4 = GPIO.input(25)
print("FERTIG: " + str(input4)) #Ausgabe auf Bildschirm
time.sleep (0.1) #kurze Pause
input5 = GPIO.input(24)
print("STECHEN: " + str(input5)) #Ausgabe auf Bildschirm
time.sleep (0.1) #kurze Pause
input6 = GPIO.input(23)
print("MANN: " + str(input6)) #Ausgabe auf Bildschirm
time.sleep (0.1) #kurze Pause
input7 = GPIO.input(18)
print("4MIN: " + str(input7)) #Ausgabe auf Bildschirm
time.sleep (0.1) #kurze Pause
input8 = GPIO.input(26)
print("2MIN: " + str(input8)) #Ausgabe auf Bildschirm
time.sleep (2.0) #kurze Pause
system('clear')
except KeyboardInterrupt:
GPIO.cleanup()
Ich würde gern haben, dass wenn während der grün Phase s gedrückt wird, die Ampel auf rot geht, andernfalls die gelb Phase ausgeführt wird und auch hier mit dem Tastendruck dies abgrebrochen werden kann.
Sowohl die Augangsrelais als auch die Taster habe ich Low aktiv.
Anbei der Code. Bin um jede Hilfe und jeden Link dankbar.
Code: Alles auswählen
#!/usr/bin/python3.7
from RPi import GPIO
from os import system, name
import time
import sys
import termios
import tty
ROT = 17
GELB = 27
GRUEN = 22
HUPE = 13
AB = 5
CD = 6
LED = 21
RES = 19
STARTA = 26
STARTB = 18
MANN = 23
STECHEN = 24
FERTIG = 25
TREFFER = 12
LICHT = 16
NOT = 20
flag = False
def inkey(timeout=None):
fd=sys.stdin.fileno()
remember_attributes=termios.tcgetattr(fd)
tty.setraw(sys.stdin.fileno())
attributes = termios.tcgetattr(fd)
if timeout is not None:
attributes[-1][termios.VMIN] = 0
attributes[-1][termios.VTIME] = timeout
termios.tcsetattr(fd,termios.TCSADRAIN, attributes)
character=sys.stdin.read(1)
termios.tcsetattr(fd,termios.TCSADRAIN, remember_attributes)
return character
def initialize():
GPIO.setmode(GPIO.BCM)
GPIO.setup(ROT, GPIO.OUT) #rot
GPIO.setup(GELB, GPIO.OUT) #gelb
GPIO.setup(GRUEN, GPIO.OUT) #gruen
GPIO.setup(HUPE, GPIO.OUT) #HUPE
GPIO.setup(AB, GPIO.OUT) #AB
GPIO.setup(CD, GPIO.OUT) #CD
GPIO.setup(LED, GPIO.OUT) #LED-Strahler
GPIO.setup(RES, GPIO.OUT) #Reserve
GPIO.setup(STARTA, GPIO.IN) #Start 2 Min.
GPIO.setup(STARTB, GPIO.IN) #Start 4 Min.
GPIO.setup(MANN, GPIO.IN) #Mannschaft
GPIO.setup(STECHEN, GPIO.IN) #Stechen
GPIO.setup(FERTIG, GPIO.IN) #Schuetzen fertig
GPIO.setup(TREFFER, GPIO.IN) #Trefferaufnahme
GPIO.setup(LICHT, GPIO.IN) #Lichtschalter
GPIO.setup(NOT, GPIO.IN) #notfall
GPIO.output(ROT, True)
GPIO.output(GELB, True)
GPIO.output(GRUEN, True)
GPIO.output(HUPE, True)
GPIO.output(AB, True)
GPIO.output(CD, True)
GPIO.output(LED, True)
GPIO.output(RES, True)
def rot_hupe(three=False, two=False):
GPIO.output(ROT, False)
GPIO.output(GELB, True)
GPIO.output(GRUEN, True)
GPIO.output(HUPE, False)
time.sleep(0.5)
GPIO.output(HUPE, True)
if three:
time.sleep(0.5)
GPIO.output(HUPE, False)
time.sleep(0.5)
GPIO.output(HUPE, True)
time.sleep(0.5)
GPIO.output(HUPE, False)
time.sleep(0.5)
GPIO.output(HUPE, True)
elif two:
time.sleep(0.5)
GPIO.output(HUPE, False)
time.sleep(0.5)
GPIO.output(HUPE, True)
def gelb():
GPIO.output(GRUEN, True)
GPIO.output(GELB, False)
GPIO.output(ROT, True)
def gruen_hupe():
GPIO.output(ROT, True)
GPIO.output(GELB, True)
GPIO.output(GRUEN, False)
GPIO.output(HUPE, False)
time.sleep(0.5)
GPIO.output(HUPE, True)
def notfall():
rot_hupe(three=True)
GPIO.output(AB, True)
GPIO.output(CD, True)
time.sleep(10)
GPIO.output(ROT, True)
GPIO.output(GELB, True)
GPIO.output(GRUEN, True)
GPIO.output(AB, True)
GPIO.output(CD, True)
GPIO.output(HUPE, True)
main()
def trefferaufnahme(flag):
while inkey() == 't' or GPIO.input(TREFFER) == False:
break
def wait_for_stop(timeout, flag):
stop_time = time.monotonic() + timeout
while stop_time >= time.monotonic():
key = inkey(timeout=1)
if key == 's' and flag == False or GPIO.input(FERTIG) == False and flag == False:
flag = True
return flag
elif key == 'e':
notfall()
main()
def umschalten(timeout, flag):
flag = False
GPIO.output(AB, False)
rot_hupe(two=True)
time.sleep(10)
gruen_hupe()
wait_for_stop(timeout, flag)
if flag == False:
gelb()
wait_for_stop(30, flag)
rot_hupe(two=True)
GPIO.output(AB, True)
GPIO.output(CD, False)
time.sleep(20)
flag = False
gruen_hupe()
wait_for_stop(timeout, flag)
if flag == False:
gelb()
wait_for_stop(30, flag)
rot_hupe(three=True)
flag = False
trefferaufnahme(flag)
rot_hupe(two=True)
time.sleep(10)
gruen_hupe()
wait_for_stop(timeout, flag)
if flag == False:
gelb()
wait_for_stop(30, flag)
rot_hupe(two=True)
GPIO.output(CD, True)
GPIO.output(AB, False)
flag = False
time.sleep(20)
gruen_hupe()
wait_for_stop(timeout, flag)
if flag == False:
gelb()
wait_for_stop(30, flag)
rot_hupe(three=True)
def start(timeout):
for d in range(6):
umschalten(timeout, flag)
trefferaufnahme(flag)
aus()
main()
def aus():
GPIO.output(ROT, True)
GPIO.output(GELB, True)
GPIO.output(GRUEN, True)
GPIO.output(AB, True)
GPIO.output(CD, True)
GPIO.output(HUPE, True)
def stechen():
rot_hupe(two=True)
time.sleep(10)
gruen_hupe()
wait_for_stop(10, flag)
gelb()
wait_for_stop(30, flag)
rot_hupe(three=True)
trefferaufnahme()
GPIO.output(ROT, True)
GPIO.output(GELB, True)
GPIO.output(GRUEN, True)
GPIO.output(AB, True)
GPIO.output(CD, True)
GPIO.output(HUPE, True)
GPIO.cleanup()
main()
def main():
try:
initialize()
system('clear')
print("2 = 2 Minuten \n")
print("4 = 4 Minuten \n")
print("m = Mannschaft \n")
print("x = Stechpfeil \n")
print("e = Sofort Ende \n")
print("s = Schuetzen fertig \n")
print("t = Trefferaufnahme fertig \n")
print("l = Lichtschalter \n")
licht_an = True
while True:
time.sleep(0.1)
sys.stdin.flush()
key = inkey()
if key == '2' or GPIO.input(STARTA) == False:
start(90)
elif key == '4' or GPIO.input(STARTB) == False:
start(210)
elif key == 'm' or GPIO.input(MANN) == False:
start(50)
elif key == 'e' or GPIO.input(NOT) == False:
notfall()
elif key == 'x' or GPIO.input(STECHEN) == False:
stechen()
elif key == 'l' or GPIO.input(LICHT) == False:
licht_an = not licht_an
GPIO.output(LED, licht_an)
except KeyboardInterrupt:
GPIO.cleanup()
finally:
print(" Neustart erforderlich.")
if __name__ == '__main__':
main()