Script gegen Bezahlung

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Netdeus
User
Beiträge: 25
Registriert: Sonntag 19. Juli 2020, 12:18

Hi;

findet sich hier jemand, der mir ein Script gegen Bezahlung schreiben würde? Könnte um die 100 Euro bieten und sollte für einen fähigen Programmierer in ca. 1 Stunde geschrieben sein.

Es gibt auch bereits eine mehr oder weniger funktionierende Version, die aber einfach zu langsam ist da sie wirklich sehr umständlich geschrieben ist.

Gegeben:
Fünf schalter und sechs Lichtschranken sind am Pi angeschlossen. Immer zwei Lichtschranken für ein Target.

Ziel und Ablauf:

An vier Schaltern soll ausgewählt werden, wer am Spiel teilnimmt. (es gibt die Farben grün, rot, blau und gelb) Wird ein Schalter gedrückt, so leuchtet er auf. Wird er nochmals gedrückt, so erlischt das Licht dort wieder. Der fünfte Schalter dient als Bestätigung und geht zur nächsten Stufe.
DIESER TEIL IST BEREITS FERTIG UND FUNKTIONIERT.

Am nächsten Schritt soll die Spielzeit eingegeben werden:
blau = 2 Minuten
rot = 5 Minuten
gelb = 7 Minuten
grün = 10 Minuten
Auch dieser Schritt soll mit dem fünften Schalter bestätigt werden
DIESER TEIL IST BEREITS FERTIG UND FUNKTIONIERT

Nun wird das eigentliche Spiel gestartet:
Zuerst müssen alle sechs Lichtschranken auf den aktuellen Status geprüft werden. Leider kommt es immer wieder vor, dass sich zu unterschiedlichen Zeitpunkten das Licht mal mehr und mal weniger auf die Lichtschranken auswirkt. Aus diesem Grund soll hier eine Art Statusaufnahme gemacht werden.
Dann ist der Timer zu starten. Gleichzeitig muss für jedes Target ein Spieler per Zufall definiert werden (unter den in Schritt 1 eingegebenen). Neben den Spielern kann auch ein Target deaktiviert werden. Eine Ausgabe soll dann zum Beispiel so aussehen:
Target 1: rot / Target 2: grün / Target 3: deaktiviert
Alle 15 Sekunden soll sich dieser Zustand ändern. (DIES IST PROGRAMMIERT, LÄUFT ABER NUR BEDINGT)
Wird ein Target aktiviert (Lichtschranke durchbrochen), so soll dem Punktekonto der Farbe auf die das Target gerade gestellt ist, 10 Punkte geschrieben werden.
30 Sekunden vor Ende des vorher gestellten Timers beginnt das Finale:
Per Zufall soll sich das Licht des fünften Schalters einschalten , d.h. Per Zufall ist sowohl zu fragen, OB es sich einschaltet und für welche Farbe es sich einschaltet. Nach 5 Sekunden ist dieser Zustand erneut zu prüfen. Hier kann sich also das Licht des Schalters entweder ausschalten, oder die Farbe für die der Schalter dann gilt, sich ändern.
Wird der Schalter gedrückt, während er leuchet, so sollen der Farbe weitere 150 Punkte gut geschrieben werden. Dies ist auch gleichzeitig das Ende des Spiels.

Als letzter Schritt soll die Anzeige ausgegeben werden, welche Farbe wieviele Punkte hat, bzw. wer der Sieger des Spiels ist.

Ich selbst habe nun lange versucht, das Script selbst zu schreiben und stoße immer wieder an Grenzen. Nun möchte ich aber nach inzwischen mehreren JAHREN zu einem Abschluss kommen. Gerade die Lichtschranken sind mein größtes Problem. Das Auslösen ist nur ein kurzer Moment, in der ein Ball durch die Lichtschranke geworfen wird. Mein geschriebenes Script aber ist zu langsam, als dass es diese Änderung schnell genug erkennt.

Gerne kann ich Zugriff auf den Pi gewähren und stelle natürlich auch falls gewünscht das schon geschriebene Script zur Verfügung.

Ich hoffe sehr, dass sich hier jemand findet, der sich dem ganzen annehmen könnte und mir damit aus der Klemme hilft.

viele Grüße
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Eine Stunde ist schnell vorbei, vor allem wenn es darum geht, irgendetwas mit Hardware hinzubekommen. Wenn Du den Code hier postest, sieht man viel besser, was denn wirklich schon funktioniert und was noch zu tun wäre.
Netdeus
User
Beiträge: 25
Registriert: Sonntag 19. Juli 2020, 12:18

Kann ich natürlich machen...bitteschön:

Code: Alles auswählen

from __future__ import print_function
from termcolor import cprint as print
import RPi.GPIO as GPIO
import spidev
import time
import random
import sys
import os

GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)

LASER_TOR1_A=26
LASER_TOR1_B=19
LASER_TOR2_A=13
LASER_TOR2_B=21
LASER_TOR3_A=20
LASER_TOR3_B=16
LICHT_schnatz = 2
LICHT_gelb = 3
LICHT_gruen = 4
LICHT_blau = 17
LICHT_rot = 27
TASTER_gruen = 14
TASTER_blau = 15
TASTER_rot = 18
TASTER_schnatz = 23
TASTER_gelb = 24 
GPIO.setup(LICHT_schnatz, GPIO.OUT)
GPIO.setup(LICHT_gelb, GPIO.OUT)
GPIO.setup(LICHT_gruen, GPIO.OUT)
GPIO.setup(LICHT_blau, GPIO.OUT)
GPIO.setup(LICHT_rot, GPIO.OUT)
GPIO.setup(TASTER_gruen, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(TASTER_blau, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(TASTER_rot, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(TASTER_schnatz, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(TASTER_gelb, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(LASER_TOR1_A, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(LASER_TOR1_B, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(LASER_TOR2_A, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(LASER_TOR2_B, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(LASER_TOR3_A, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(LASER_TOR3_B, GPIO.IN, pull_up_down=GPIO.PUD_UP)
team_huf = 0
team_gry = 0
team_rav = 0
team_sly = 0
team_all = 0



def licht_aus(x):
	GPIO.setup(x, GPIO.HIGH)

def licht_an(x):
	GPIO.setup(x, GPIO.LOW)

def alles_licht_aus():
	licht_aus(LICHT_schnatz)
	licht_aus(LICHT_blau)
	licht_aus(LICHT_rot)
	licht_aus(LICHT_gelb)
	licht_aus(LICHT_gruen)

def select_sly(sly):
	if (sly == 0):
		sly = 1
	elif (sly == 1):
		sly = 0
	return sly

def select_huf(huf):
	if (huf == 0):
		huf = 1
	elif (huf == 1):
		huf = 0
	return huf

def select_gry(gry):
	if (gry == 0):
		gry = 1
	elif (gry == 1):
		gry = 0
	return gry

def select_rav(rav):
	if (rav == 0):
		rav = 1
	elif (rav == 1):
		rav = 0
	return rav
    
def team_all(rav, gry, huf, sly):
	team_all = rav + gry + huf + sly
	return team_all	
	
def change_gate1(teamliste):
	teamcount = len(teamliste)
	r = random.randint(0,teamcount)
	if (r==0):
		gate1 = "dead"
	else:
		gate1 = teamliste[r-1]
	return gate1

def change_gate2(teamliste):
	teamcount = len(teamliste)
	r = random.randint(0,teamcount)
	if (r==0):
		gate2 = "dead"
	else:
		gate2 = teamliste[r-1]
	return gate2

def change_gate3(teamliste):
	teamcount = len(teamliste)
	r = random.randint(0,teamcount)
	if (r==0):
		gate3 = "dead"
	else:
		gate3 = teamliste[r-1]
	return gate3

def tor(gate):
	if (gate == "rav"):
		print("Ravenclaw", color="blue", end=" ")
		tor="r"
	elif (gate == "gry"):
		print("Gryffindor", color="red", end=" ")
		tor="g"
	elif (gate == "huf"):
		print("Hufflepuff", color="yellow", end=" ")
		tor="h"
	elif (gate == "sly"):
		print("Slytherin", color="green", end=" ")
		tor="s"
	elif (gate =="dead"):
		print("DEFEKT", color="grey", end=" ")
		tor="d"
	return tor

def tore(g1, g2, g3):
	print("Tore", end=" ")
	print("Tor 1 ", end=" ")
	t1=tor(g1)
	print("Tor 2 ", end=" ")
	t2=tor(g2)
	print("Tor 3 ", end=" ")
	t3=tor(g3)
	torliste = []
	torliste.append(t1)
	torliste.append(t2)
	torliste.append(t3)
	return torliste
	
	
def lichtauswahl(team_rav, team_gry, team_huf, team_sly):
	if (team_sly == 1):
		licht_an(LICHT_gruen)
	if (team_sly == 0):
		licht_aus(LICHT_gruen)
	if (team_gry == 1):
		licht_an(LICHT_rot)
	if (team_gry == 0):
		licht_aus(LICHT_rot)
	if (team_huf == 1):
		licht_an(LICHT_gelb)
	if (team_huf == 0):
		licht_aus(LICHT_gelb)
	if (team_rav == 1):
		licht_an(LICHT_blau)
	if (team_rav == 0):
		licht_aus(LICHT_blau)
        
def checkstart():
    ring1a = GPIO.input(LASER_TOR1_A)
    ring1b = GPIO.input(LASER_TOR1_B)
    ring2a = GPIO.input(LASER_TOR2_A)
    ring2b = GPIO.input(LASER_TOR2_B)
    ring3a = GPIO.input(LASER_TOR3_A)
    ring3b = GPIO.input(LASER_TOR3_B)
    ring1 = 0
    ring2 = 0
    ring3 = 0
    if (ring1a == False):
        ring1=ring1+1
    if (ring1b == False):
        ring1=ring1+1
    if (ring2a == False):
        ring2=ring2+1
    if (ring2b == False):
        ring2=ring2+1
    if (ring3a == False):
        ring3=ring3+1
    if (ring3b == False):
        ring3=ring3+1

    print ("Status Ring 1:")
    if (ring1 == 2):
        print("100%")
    elif (ring1 == 1):
        print("50%")
    else:
        print("0%")
    print ("Status Ring 2:")
    if (ring2 == 2):
        print("100%")
    elif (ring2 == 1):
        print("50%")
    else:
        print("0%")
    print ("Status Ring 3:")
    if (ring3 == 2):
        print ("100%")
    elif (ring3 == 1):
        print ("50%")
    else: 
        print("0%")

def schnatz_active(team_s):
    team_c = len(team_s)
    team_c = team_c+1
    s = random.randint(0,team_c)
    if (s==0):
        licht_aus(LICHT_schnatz)
        status_schnatz="inactive"
    else:
        licht_an(LICHT_schnatz)
        status_schnatz=team_s[s-1]
        print("Der Schnatz wurde gesichtet! Er kann von folgendem Team gefangen werden:")
        if (status_schnatz == "rav"):
            print("Ravenclaw", color="blue", end=" ")
        elif (status_schnatz == "gry"):
            print("Gryffindor", color="red", end=" ")
        elif (status_schnatz == "huf"):
            print("Hufflepuff", color="yellow", end=" ")
        elif (status_schnatz == "sly"):
            print("Slytherin", color="green", end=" ") 
    return status_schnatz
    

def checkgates():
	ring1a = GPIO.input(LASER_TOR1_A)
	ring1b = GPIO.input(LASER_TOR1_B)
	ring2a = GPIO.input(LASER_TOR2_A)
	ring2b = GPIO.input(LASER_TOR2_B)
	ring3a = GPIO.input(LASER_TOR3_A)
	ring3b = GPIO.input(LASER_TOR3_B)
	ring = 3
	if (ring1a == True):
		ring = 0
	if (ring1b == True):
		ring = 0
	if (ring2a == False):
		ring = 1
	if (ring2b == True):
		ring = 1
	if (ring3b == True):
		ring = 2
	if (ring != 3):
		print("PUNKTE")
		print(str(ring))
        time.sleep(1)
	return ring

def showpoint(show_team):
	if (show_team == "rav"):
		print("Ravenclaw", color="blue")
		print(points_rav)
	if (show_team == "gry"):
		print("Gryffindor", color="red")
		print(points_gry)
	if (show_team == "huf"):
		print("Hufflepuff", color="yellow")
		print(points_huf)
	if (show_team == "sly"):
		print("Slytherin", color="green")
		print(points_sly)
	return 0

phase = 1
while True:
	alles_licht_aus()
	print("Bitte waehlen Sie mit den Farben die mitspielenden Teams aus. Bestaetigen Sie ihre Auswahl mit dem Schnatz")
	while phase == 1:
		gruen = GPIO.input(TASTER_gruen)
		blau = GPIO.input(TASTER_blau)
		rot = GPIO.input(TASTER_rot)
		schnatz = GPIO.input(TASTER_schnatz)
		gelb = GPIO.input(TASTER_gelb)
		if (gruen == False):
			team_sly = select_sly(team_sly)
			lichtauswahl(team_rav, team_gry, team_huf, team_sly)
			time.sleep(0.5)
		if (blau == False):
			team_rav = select_rav(team_rav)
			lichtauswahl(team_rav, team_gry, team_huf, team_sly)
			time.sleep(0.5)
		if (rot == False):
			team_gry = select_gry(team_gry)
			lichtauswahl(team_rav, team_gry, team_huf, team_sly)
			time.sleep(0.5)
		if (gelb == False):
			team_huf = select_huf(team_huf)
			lichtauswahl(team_rav, team_gry, team_huf, team_sly)
			time.sleep(0.5)
		if (schnatz == False):
			team_all = team_all(team_rav, team_gry, team_huf, team_sly)
			if (team_all == 0):
				lichtauswahl(1, 1, 1, 1)
				time.sleep(0.2)
				lichtauswahl(0, 0, 0, 0)
				time.sleep(0.2)
				lichtauswahl(1, 1, 1, 1)
				time.sleep(0.2)
				lichtauswahl(0, 0, 0, 0)
				time.sleep(0.2)
				lichtauswahl(1, 1, 1, 1)
				time.sleep(0.2)
				lichtauswahl(0, 0, 0, 0)
				time.sleep(0.2)
			else:
				phase = 2
			time.sleep(0.5)
	alles_licht_aus()
	print ("Bitte waehlen Sie die Dauer des Spiels aus:")
	print ("blau = 2 Minuten", color="blue")
	print ("rot = 5 Minuten", color="red")
	print ("gelb = 10 Minuten", color="yellow")
	print ("gruen = 15 Minuten", color="green")
	print ("Das Spiel wird mit dem Schnatz gestartet")
	dauer = 0
	while phase == 2:
		blau = GPIO.input(TASTER_blau)
		rot = GPIO.input(TASTER_rot)
		gelb = GPIO.input(TASTER_gelb)
		gruen = GPIO.input(TASTER_gruen)
		schnatz = GPIO.input(TASTER_schnatz)
		if (blau == False):
			dauer = 2
			licht_an(LICHT_blau)
			licht_aus(LICHT_rot)
			licht_aus(LICHT_gelb)
			licht_aus(LICHT_gruen)
			time.sleep(0.5)
		if (rot == False):
			dauer = 5
			licht_an(LICHT_rot)
			licht_aus(LICHT_blau)
			licht_aus(LICHT_gelb)
			licht_aus(LICHT_gruen)
			time.sleep(0.5)
		if (gelb == False):
			dauer = 10
			licht_an(LICHT_gelb)
			licht_aus(LICHT_blau)
			licht_aus(LICHT_rot)
			licht_aus(LICHT_gruen)
			time.sleep(0.5)
		if (gruen == False):
			dauer = 15
			licht_an(LICHT_gruen)
			licht_aus(LICHT_blau)
			licht_aus(LICHT_rot)
			licht_aus(LICHT_gelb)
			time.sleep(0.5)
		if (schnatz == False):
			if (dauer == 0):
				licht_an(LICHT_blau)
				time.sleep(0.2)
				licht_aus(LICHT_blau)
				licht_an(LICHT_rot)
				time.sleep(0.2)
				licht_aus(LICHT_rot)
				licht_an(LICHT_gelb)
				time.sleep(0.2)
				licht_aus(LICHT_gelb)
				licht_an(LICHT_gruen)
				time.sleep(0.2)
				licht_aus(LICHT_gruen)
				time.sleep(0.2)
				lichtauswahl(1, 1, 1, 1)
				time.sleep(0.2)
				lichtauswahl(0, 0, 0, 0)
				time.sleep(0.2)
				lichtauswahl(1, 1, 1, 1)
				time.sleep(0.2)
				lichtauswahl(0, 0, 0, 0)
				time.sleep(0.2)
				lichtauswahl(1, 1, 1, 1)
				time.sleep(0.2)
				lichtauswahl(0, 0, 0, 0)
			else:
                                checkstart()
				phase = 3
			time.sleep(0.5)
    	
	print ("Am Spiel nehmen die folgenden Mannschaften teil:")
	teamliste = []
	if (team_rav == 1):
		print ("Ravenclaw", color="blue")
		teamliste.append('rav')
	if (team_gry == 1):
		print ("Gryffindor", color="red")
		teamliste.append('gry')
	if (team_huf == 1):
		print ("Hufflepuff", color="yellow")
		teamliste.append('huf')
	if (team_sly == 1):
		print ("Slytherin", color="green")
		teamliste.append('sly')
	start = time.time()
	gate_time = time.time()+10
	dauer = dauer *60
        ende = dauer+start
	schnatz_time = start + dauer - 10
	schnatz_status = "inactive"
        schnatz_timer = time.time()
	gate1 = change_gate1(teamliste)
	gate2 = change_gate2(teamliste)
	gate3 = change_gate3(teamliste)
	points_rav = 0
	points_gry = 0
	points_huf = 0
	points_sly = 0
	change = 0
        endrunde = 0
	gateliste=tore(gate1, gate2, gate3)
        while phase == 3:
            akt_zeit=time.time()
            if ((akt_zeit > ende) and (akt_zeit > schnatz_timer)):
                endrunde = 1
            if (endrunde==1):
                schnatz_status = schatz_active(teamliste)
                schnatz_timer = random.randint(1,10)
                schnatz_timer = time.time()+schnatz_timer
                endrunde==0
            if (akt_zeit > ende and akt_zeit < schnatz_timer and schnatz == FALSE):
                print ("Spielende")
                if (schnatz_status=="gry"):
                    points_gry=points_gry+150
                elif (schnatz_status=="sly"):
                    points_sly=points_sly+150
                elif (schnatz_status=="rav"):
                    points_rav=points_rav+150
                elif (schnatz_status=="huf"):
                    points_huf=points_huf+150
                phase=4
            check_ring=checkgates()
            if (check_ring!=3):
                goal=gateliste[check_ring]
                if (goal=="rav"):
                    points_rav = points_rav+10
                    showpoint(goal)
                elif (goal=="sly"):
                    points_sly = points_sly+10
                    showpoint(goal)
                elif (goal=="huf"):
                    points_huf = points_huf+10
                    showpoint(goal)
                elif (goal=="gry"):
                    points_gry=points_gry+10
                    showpoint(goal)
                check_ring=3
            if (akt_zeit>gate_time):
                gate1 = change_gate1(teamliste)
                gate2 = change_gate2(teamliste)
                gate3 = change_gate3(teamliste)
                gateliste=tore(gate1, gate2, gate3)
                gate_time=time.time()+10
        if (phase == 4):   
            print("Das Spiel ist zu Ende! Eine herausragende Leistung von allen Teilnehmern!")
            print ("ERGEBNIS:")
            final_count=len(teamliste)
            final_points = []
            if ("rav" in teamliste):
                final_points.append(points_rav)
            if ("sly" in teamliste):
                final_points.append(points_sly)
            if ("gry" in teamliste):
                final_points.append(points_gry)
            if ("huf" in teamliste):
                finale_points.append(points_huf)
            final_points=sorted(final_points)
            if (final_points[0]==points_rav and points_rav!=0):
                showpoint(rav)
            elif (final_points[0]==points_gry and points_gry!=0):
                showpoint(gry)
            elif (final_points[0]==points_sly and points_sly!=0):
                showpoint(sly)
            elif (final_points[0]==points_huf and points_huf!=0):
                showpoint(huf)
            if (final_points[1]==points_rav and points_rav!=0 and final_count>0):
                showpoint(rav)
            elif (final_points[1]==points_gry and points_gry!=0 and final_count>0):
                showpoint(gry)
            elif (final_points[1]==points_sly and points_sly!=0 and final_count>0):
                showpoint(sly)
            elif (final_points[1]==points_huf and points_huf!=0 and final_count>0):
                showpoint(huf)
            if (final_points[2]==points_rav and points_rav!=0 and final_count>1):
                showpoint(rav)
            elif (final_points[2]==points_gry and points_gry!=0 and final_count>1):
                showpoint(gry)
            elif (final_points[2]==points_sly and points_sly!=0 and final_count>1):
                showpoint(sly)
            elif (final_points[2]==points_huf and points_huf!=0 and final_count>1):
                showpoint(huf)
            if (final_points[3]==points_rav and points_rav!=0 and final_count>2):
                showpoint(rav)
            elif (final_points[3]==points_gry and points_gry!=0 and final_count>2):
                showpoint(gry)
            elif (final_points[3]==points_sly and points_sly!=0 and final_count>2):
                showpoint(sly)
            elif (final_points[3]==points_huf and points_huf!=0 and final_count>2):
                showpoint(huf)
	    licht_an(LICHT_schnatz)
	    time.sleep(1)
	    licht_an(LICHT_gelb)
	    time.sleep(1)
	    licht_an(LICHT_gruen)
	    time.sleep(1)
	    licht_an(LICHT_blau)
	    time.sleep(1)
	    licht_an(LICHT_rot)
	    print('AN')
	    time.sleep(5)
	    licht_aus(LICHT_schnatz)
	    time.sleep(1)
	    licht_aus(LICHT_gelb)
	    time.sleep(1)
	    licht_aus(LICHT_gruen)
	    time.sleep(1)
	    licht_aus(LICHT_blau)
	    time.sleep(1)
	    licht_aus(LICHT_rot)
	    print('AUS')
	    time.sleep(1)

Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

500 Zeilen Code, wo alles 5mal kopiert ist, ist kaum eine sinnvolle Grundlage für einen Programmierauftrag. Das bedeutet, dass man erstmal aufräumen muß.
Die Einrückungen sind kaputt, die Variablenschreibweise uneinheitlich, Klammern und Leerzeichensetzung.

`schnatz` wird in Phase 3 gar nicht gesetzt, und checkgates sieht auch falsch aus.
Ein erster Schritt wäre (natürlich für Python3.6+):

Code: Alles auswählen

from RPi import GPIO
from queue import Queue, Empty
from termcolor import cprint
import spidev
import time
import random
import sys
import os

GREEN = 4
YELLOW = 3
RED = 27
BLUE = 17
SNATCH = 2

TEAM_LIGHTS = [BLUE, RED, YELLOW, GREEN]
ALL_LIGHTS = [SNATCH] + LIGHTS

BUTTONS = {
    14: GREEN,
    24: YELLOW,
    18: RED,
    15: BLUE:,
    23: SNATCH,
}

TEAMS = {
    GREEN: ("Slytherin", "green"),
    YELLOW: ("Hufflepuff", "yellow"),
    RED: ("Gryffindor", "red"),
    BLUE: ("Ravenclaw", "blue"),
}

DURATIONS = {
    BLUE: (2, "blau", "blue"),
    RED: (5, "rot", "red"),
    YELLOW: (10, "gelb", "yellow"),
    GREEN: (15, "gruen", "green"),
}

LASER_GATES = [
    (26, 19), (13, 21), (20, 16)
]

class Team:
    def __init__(self, team_name, color):
        self.team_name = team_name
        self.color = color
        self.taster = taster
        self.points = 0

    def show_points(self):
        cprint(f"{self.team_name}: {self.points}", color=self.color)

def light_off(pin):
    GPIO.setup(pin, GPIO.HIGH)

def light_on(pin):
    GPIO.setup(pin, GPIO.LOW)

def play_lights1():
    for i in range(3):
        light_on(LIGHTS)
        time.sleep(0.2)
        light_off(LIGHTS)
        time.sleep(0.2)

def play_lights2():
    for led_pin in TEAM_LIGHTS:
        light_on(led_pin)
        time.sleep(0.2)
        light_off(led_pin)
        time.sleep(0.2)
    for i in range(3):
        light_on(TEAM_LIGHTS)
        time.sleep(0.2)
        light_off(TEAM_LIGHTS)
        time.sleep(0.2)

def play_lights3():
    for pin in ALL_LIGHTS:
        light_on(pin)
        time.sleep(1)
    time.sleep(4)
    for pin in ALL_LIGHTS:
        light_off(pin)
        time.sleep(1)

def checkstart():
    rings = []
    for gate_a, gate_b in LASER_GATES:
        rings.append(GPIO.input(gate_a) + GPIO.input(gate_b))
    for nr, ring in enumerate(rings, 1):
        p = [100, 50, 0][ring]
        cprint(f"Status Ring {nr}: {p}%s")

def check_gates():
    # TODO: keine Ahnung was das soll
    rings = []
    for gate_a, gate_b in LASER_GATES:
        rings.append((GPIO.input(gate_a), GPIO.input(gate_b)))
    if rings[2][1]:
        ring = 2
    elif rings[1][1] or not rings[1][0]:
        ring = 1
    elif rings[0][0] or rings[0][1]:
        ring = 0
    else:
        ring = 3
    if ring != 3:
        cprint("PUNKTE")
        cprint(str(ring))
        time.sleep(1)
    return ring

def clear_queue(queue):
    try:
        while True:
            queue.get_nowait()
    except Empty:
        pass

def select_teams(queue):
    light_off(ALL_LIGHTS)
    cprint("Bitte waehlen Sie mit den Farben die mitspielenden Teams aus. Bestaetigen Sie ihre Auswahl mit dem Schnatz")
    selected = {}
    clear_queue(queue)
    while True:
        color = BUTTONS[queue.get()]
        if color == SNATCH:
            if selected:
                break
            # blink lights if no team is selected
            play_lights1()
        else:
            if color in selected:
                selected.remove(color)
                light_off(color)
            else:
                selected.add(color)
                light_on(color)
    light_off(ALL_LIGHTS)
    return [
        Team(color, *TEAMS[color])
    ]

def select_duration():
    cprint("Bitte waehlen Sie die Dauer des Spiels aus:")
    for duration, name, color in sorted(DURATIONS.values()):
        cprint(f"{name} = {duration} Minuten", color=color)
    cprint ("Das Spiel wird mit dem Schnatz gestartet")
    selected_duration = 0
    clear_queue(queue)
    while True:
        color = BUTTONS[queue.get()]
        if color == SNATCH:
            if selected_duration != 0:
                break
            play_lights2()
        else:
            selected_duration = DURATIONS[color][0]
            light_off(TEAM_LIGHTS)
            light_on(color)
    return select_duration

def display_gates(gates):
    cprint("Tore", end=" ")
    for nr, gate in enumerate(gates, 1):
        cprint(f"Tor {nr} ", end=" ")
        if gate is None:
            cprint("DEFEKT", color="grey", end=" ")
        else:
            cprint(gate.team_name, color=gate.color, end=" ")

def schnatz_active(teams):
    selected = random.choice([None] + teams)
    if selected is None:
        licht_aus(LICHT_schnatz)
    else:
        licht_an(LICHT_schnatz)
        cprint("Der Schnatz wurde gesichtet! Er kann von folgendem Team gefangen werden:")
        cprint(selected.team_name, color=selected.color, end=" ")
    return selected

def display_results(teams):
    cprint("Das Spiel ist zu Ende! Eine herausragende Leistung von allen Teilnehmern!")
    cprint("ERGEBNIS:")
    teams = sort(teams, key=lambda t: t.points, reverse=True)
    for team in teams[:3]:
        team.show_points()
    play_lights3()

def run_game(teams, duration):
    schnatz_timer = None
    gate_time = 0
    start = time.time()
    ende = start + duration
    while True:
        akt_zeit = time.time()
        if akt_zeit > gate_time:
            gates = [
                random.choice([None] + teams)
                for _ in range(3)
            ]
            display_gates(gates)
            gate_time = akt_time + 10

        if akt_zeit > ende:
            if schnatz_timer is None:
                schnatz_status = schatz_active(teams)
                schnatz_timer = akt_zeit + random.randint(1,10)
            elif akt_zeit < schnatz_timer: #TODO: and schnatz == FALSE:
                break
        check_ring = check_gates()
        if check_ring != 3:
            team = gates[check_ring]
            if team is not None:
                team.points += 10
                team.show_points()
    cprint("Spielende")
    if schnatz_status is not None:
        schnatz_status.points += 150

def initialize(buttons):
    queue = Queue()
    GPIO.setmode(GPIO.BCM)
    for button, led in buttons.values():
        GPIO.setup(led, GPIO.OUT)
        GPIO.setup(button, GPIO.IN, pull_up_down=GPIO.PUD_UP)
        GPIO.add_event_detect(button, GPIO.FALLING, queue.put)
    for gates in LASER_GATES:
        GPIO.setup(gates, GPIO.IN, pull_up_down=GPIO.PUD_UP)
    return queue

def main():
    try:
        queue = initialize(BUTTONS)
        while True:
            teams = select_teams(queue)
            duration = select_duration() * 60
            checkstart()
            cprint("Am Spiel nehmen die folgenden Mannschaften teil:")
            for team in teams:
                cprint(team.team_name, color=team.color)
            run_game(teams, duration)
            display_results(teams)
    finally:
        GPIO.cleanup()

if __name__ == "__main__":
    main()
Netdeus
User
Beiträge: 25
Registriert: Sonntag 19. Juli 2020, 12:18

Hi;

erst einmal vielen Dank.

Ich habe das Script jetzt mal 1:1 kopiert und laufen gelassen. Die ersten Fehlermeldungen habe ich noch korrigieren können - das waren nur Tippfehler und einfach zu beseitigen. Aber schon in Zeile 53 kann ich es leider nicht:
sudo python3 HP.py
File "HP.py", line 53
cprint(f"{self.team_name}: {self.points}", color=self.color)

SyntaxError: invalid syntax
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

@Netdeus: Deshalb schrieb Sirius "Für Python 3.6+". Du scheinst eine ältere Version als Python 3.6 einzusetzen.
Netdeus
User
Beiträge: 25
Registriert: Sonntag 19. Juli 2020, 12:18

Habe nun extra Python 3.7 installiert und nun kommt schon eine Fehlermeldung gleich für Zeile ein, die besagt
No module name 'RPi'
Beim Befehl es zu installieren
sudo apt-get install rpi.gpio
kommt unter anderem die Zeile
...
python3-rpi.gpio ist schon die neueste Version
...
Versionscheck habe ich auch gemacht
python3 --version
Python 3.7.0

Ich denke, ich werde mir einfach nochmal ein neues Image für den Pi laden und es damit versuchen, wird aber wohl erst morgen werden.
Benutzeravatar
pintman
User
Beiträge: 39
Registriert: Freitag 2. Dezember 2005, 20:43
Kontaktdaten:

Wurde Python über den Paketmanager installiert?

Ansonsten sind die Pi-Images nicht für den Dauerbetrieb geeignet und eine Neuinstallation ist leider häufiger nötig als man es sich wünscht. Es schadet also nicht. :)
Netdeus
User
Beiträge: 25
Registriert: Sonntag 19. Juli 2020, 12:18

Hi;

ich habe nun den ganzen Pi neu aufgesetzt (hat deutlich länger gedauert, als ich erwartet habe) und das Script ist drauf. Leider läuft es aber noch nicht.
Zum einen kann er termcolor nicht finden - habe ich einfach "auskommentiert", dann eben erstmal ohne dachte ich.

Zudem habe ich "def checkgates" komplett rausgenommen. Du hast ja kommentiert, dass du eh nicht weißt was es macht...

Dann kommt aber folgende Fehlermeldung:
RuntimeWarning: No channels have been set up yet - nothing to clean up! Try cleaning up at the end of your program instead!
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Das ist keine Fehlermeldung sondern eine Warnung. Welchen Code hast du denn ausgeführt und an welcher Stelle kommt diese Warnung? Was passiert danach?
Netdeus
User
Beiträge: 25
Registriert: Sonntag 19. Juli 2020, 12:18

Hi;

ich habe eigentlich nur deinen Code komplett abgeschrieben und dann aufgerufen:
sudo python3 quidditch.py
Dann kommt die Fehlermeldung und er bricht ab.

In der Fehlermeldung stehen natürlich noch einige andere Dinge, hier der komplette Auszug:
quidditch.py:229: RuntimeWarnung: No channels have been set up yet - nothing to clean up! Try cleaning up at the end of your program instead!<br>
GPIO.cleanup()
Traceback (most recent cll last):
File "quidditch.py", line 232, in <module> main()
File "quidditch.py", line 208, in initialize for button, led in buttons.values():
TypeError: cannot unpack non-iterable int object
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Code: Alles auswählen

from RPi import GPIO
from queue import Queue, Empty
from termcolor import cprint
import spidev
import time
import random
import sys
import os

GREEN = 4
YELLOW = 3
RED = 27
BLUE = 17
SNATCH = 2

TEAM_LIGHTS = [BLUE, RED, YELLOW, GREEN]
ALL_LIGHTS = [SNATCH] + LIGHTS

BUTTONS = {
    14: GREEN,
    24: YELLOW,
    18: RED,
    15: BLUE,
    23: SNATCH,
}

TEAMS = {
    GREEN: ("Slytherin", "green"),
    YELLOW: ("Hufflepuff", "yellow"),
    RED: ("Gryffindor", "red"),
    BLUE: ("Ravenclaw", "blue"),
}

DURATIONS = {
    BLUE: (2, "blau", "blue"),
    RED: (5, "rot", "red"),
    YELLOW: (10, "gelb", "yellow"),
    GREEN: (15, "gruen", "green"),
}

LASER_GATES = [
    (26, 19), (13, 21), (20, 16)
]

class Team:
    def __init__(self, team_name, color):
        self.team_name = team_name
        self.color = color
        self.taster = taster
        self.points = 0

    def show_points(self):
        cprint(f"{self.team_name}: {self.points}", color=self.color)

def light_off(pin):
    GPIO.setup(pin, GPIO.HIGH)

def light_on(pin):
    GPIO.setup(pin, GPIO.LOW)

def play_lights1():
    for i in range(3):
        light_on(LIGHTS)
        time.sleep(0.2)
        light_off(LIGHTS)
        time.sleep(0.2)

def play_lights2():
    for led_pin in TEAM_LIGHTS:
        light_on(led_pin)
        time.sleep(0.2)
        light_off(led_pin)
        time.sleep(0.2)
    for i in range(3):
        light_on(TEAM_LIGHTS)
        time.sleep(0.2)
        light_off(TEAM_LIGHTS)
        time.sleep(0.2)

def play_lights3():
    for pin in ALL_LIGHTS:
        light_on(pin)
        time.sleep(1)
    time.sleep(4)
    for pin in ALL_LIGHTS:
        light_off(pin)
        time.sleep(1)

def checkstart():
    rings = []
    for gate_a, gate_b in LASER_GATES:
        rings.append(GPIO.input(gate_a) + GPIO.input(gate_b))
    for nr, ring in enumerate(rings, 1):
        p = [100, 50, 0][ring]
        cprint(f"Status Ring {nr}: {p}%s")

def check_gates():
    # TODO: keine Ahnung was das soll
    rings = []
    for gate_a, gate_b in LASER_GATES:
        rings.append((GPIO.input(gate_a), GPIO.input(gate_b)))
    if rings[2][1]:
        ring = 2
    elif rings[1][1] or not rings[1][0]:
        ring = 1
    elif rings[0][0] or rings[0][1]:
        ring = 0
    else:
        ring = 3
    if ring != 3:
        cprint("PUNKTE")
        cprint(str(ring))
        time.sleep(1)
    return ring

def clear_queue(queue):
    try:
        while True:
            queue.get_nowait()
    except Empty:
        pass

def select_teams(queue):
    light_off(ALL_LIGHTS)
    cprint("Bitte waehlen Sie mit den Farben die mitspielenden Teams aus. Bestaetigen Sie ihre Auswahl mit dem Schnatz")
    selected = {}
    clear_queue(queue)
    while True:
        color = BUTTONS[queue.get()]
        if color == SNATCH:
            if selected:
                break
            # blink lights if no team is selected
            play_lights1()
        else:
            if color in selected:
                selected.remove(color)
                light_off(color)
            else:
                selected.add(color)
                light_on(color)
    light_off(ALL_LIGHTS)
    return [
        Team(color, *TEAMS[color])
    ]

def select_duration():
    cprint("Bitte waehlen Sie die Dauer des Spiels aus:")
    for duration, name, color in sorted(DURATIONS.values()):
        cprint(f"{name} = {duration} Minuten", color=color)
    cprint ("Das Spiel wird mit dem Schnatz gestartet")
    selected_duration = 0
    clear_queue(queue)
    while True:
        color = BUTTONS[queue.get()]
        if color == SNATCH:
            if selected_duration != 0:
                break
            play_lights2()
        else:
            selected_duration = DURATIONS[color][0]
            light_off(TEAM_LIGHTS)
            light_on(color)
    return select_duration

def display_gates(gates):
    cprint("Tore", end=" ")
    for nr, gate in enumerate(gates, 1):
        cprint(f"Tor {nr} ", end=" ")
        if gate is None:
            cprint("DEFEKT", color="grey", end=" ")
        else:
            cprint(gate.team_name, color=gate.color, end=" ")

def schnatz_active(teams):
    selected = random.choice([None] + teams)
    if selected is None:
        licht_aus(LICHT_schnatz)
    else:
        licht_an(LICHT_schnatz)
        cprint("Der Schnatz wurde gesichtet! Er kann von folgendem Team gefangen werden:")
        cprint(selected.team_name, color=selected.color, end=" ")
    return selected

def display_results(teams):
    cprint("Das Spiel ist zu Ende! Eine herausragende Leistung von allen Teilnehmern!")
    cprint("ERGEBNIS:")
    teams = sort(teams, key=lambda t: t.points, reverse=True)
    for team in teams[:3]:
        team.show_points()
    play_lights3()

def run_game(teams, duration):
    schnatz_timer = None
    gate_time = 0
    start = time.time()
    ende = start + duration
    while True:
        akt_zeit = time.time()
        if akt_zeit > gate_time:
            gates = [
                random.choice([None] + teams)
                for _ in range(3)
            ]
            display_gates(gates)
            gate_time = akt_time + 10

        if akt_zeit > ende:
            if schnatz_timer is None:
                schnatz_status = schatz_active(teams)
                schnatz_timer = akt_zeit + random.randint(1,10)
            elif akt_zeit < schnatz_timer: #TODO: and schnatz == FALSE:
                break
        check_ring = check_gates()
        if check_ring != 3:
            team = gates[check_ring]
            if team is not None:
                team.points += 10
                team.show_points()
    cprint("Spielende")
    if schnatz_status is not None:
        schnatz_status.points += 150

def initialize(buttons):
    queue = Queue()
    GPIO.setmode(GPIO.BCM)
    for button, led in buttons.items():
        GPIO.setup(led, GPIO.OUT)
        GPIO.setup(button, GPIO.IN, pull_up_down=GPIO.PUD_UP)
        GPIO.add_event_detect(button, GPIO.FALLING, queue.put)
    for gates in LASER_GATES:
        GPIO.setup(gates, GPIO.IN, pull_up_down=GPIO.PUD_UP)
    return queue

def main():
    try:
        queue = initialize(BUTTONS)
        while True:
            teams = select_teams(queue)
            duration = select_duration() * 60
            checkstart()
            cprint("Am Spiel nehmen die folgenden Mannschaften teil:")
            for team in teams:
                cprint(team.team_name, color=team.color)
            run_game(teams, duration)
            display_results(teams)
    finally:
        GPIO.cleanup()

if __name__ == "__main__":
    main()
buttons.items() statt buttons.values() und in der Definition von BUTTONS einmal einen ":" entfernt.

Und so eine Fehlermeldung ist schon wichtig, denn die sagt ja _was_ da schief läuft.
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Ah, jetzt hast du die Fehlermeldung auch mitgeschickt. Ein Flüchtigkeitsfehler. Die Zeile muss so heißen:

Code: Alles auswählen

    for button, led in buttons.items():
Netdeus
User
Beiträge: 25
Registriert: Sonntag 19. Juli 2020, 12:18

Ok, Fehlermeldung ist weg - nun muss ich nur Termcolor wieder aktivieren.

Kannst du mir sagen, wie ich das modul installiere?
Es sind mehrere Versionen von Python drauf und wenn ich nur
sudo apt-get install python-pip
sudo pip install termcolor
eingebe, dann installiert er es für die alte Python- Version, nicht aber die Python3
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Pip ist bei Python3 schon dabei, das muss man nicht extra installieren.
Pip sollte immer über den Interpreter aufgerufen werden, dann stimmt auch die Version:

Code: Alles auswählen

sudo pyrhon3 -m pip install termcolor
Netdeus
User
Beiträge: 25
Registriert: Sonntag 19. Juli 2020, 12:18

Ok, Programm startet - YEAH

Es kommt die Teamauswahl, drücke ich den blauen Button, kommt die folgende Fehlermeldung:
Traceback (most recent call last):
File "quidditch.py", line 232, in <module> main()
File "quidditch.py", line 220, in main teams = select_teams(queue)
File "quidditch.py", line 121, in select_teams selected.add(color)
AttributeError: 'dict' object has no attribute 'add'
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Code: Alles auswählen

from RPi import GPIO
from queue import Queue, Empty
from termcolor import cprint
import spidev
import time
import random
import sys
import os

GREEN = 4
YELLOW = 3
RED = 27
BLUE = 17
SNATCH = 2

TEAM_LIGHTS = [BLUE, RED, YELLOW, GREEN]
ALL_LIGHTS = [SNATCH] + LIGHTS

BUTTONS = {
    14: GREEN,
    24: YELLOW,
    18: RED,
    15: BLUE,
    23: SNATCH,
}

TEAMS = {
    GREEN: ("Slytherin", "green"),
    YELLOW: ("Hufflepuff", "yellow"),
    RED: ("Gryffindor", "red"),
    BLUE: ("Ravenclaw", "blue"),
}

DURATIONS = {
    BLUE: (2, "blau", "blue"),
    RED: (5, "rot", "red"),
    YELLOW: (10, "gelb", "yellow"),
    GREEN: (15, "gruen", "green"),
}

LASER_GATES = [
    (26, 19), (13, 21), (20, 16)
]

class Team:
    def __init__(self, team_name, color):
        self.team_name = team_name
        self.color = color
        self.taster = taster
        self.points = 0

    def show_points(self):
        cprint(f"{self.team_name}: {self.points}", color=self.color)

def light_off(pin):
    GPIO.setup(pin, GPIO.HIGH)

def light_on(pin):
    GPIO.setup(pin, GPIO.LOW)

def play_lights1():
    for i in range(3):
        light_on(LIGHTS)
        time.sleep(0.2)
        light_off(LIGHTS)
        time.sleep(0.2)

def play_lights2():
    for led_pin in TEAM_LIGHTS:
        light_on(led_pin)
        time.sleep(0.2)
        light_off(led_pin)
        time.sleep(0.2)
    for i in range(3):
        light_on(TEAM_LIGHTS)
        time.sleep(0.2)
        light_off(TEAM_LIGHTS)
        time.sleep(0.2)

def play_lights3():
    for pin in ALL_LIGHTS:
        light_on(pin)
        time.sleep(1)
    time.sleep(4)
    for pin in ALL_LIGHTS:
        light_off(pin)
        time.sleep(1)

def checkstart():
    rings = []
    for gate_a, gate_b in LASER_GATES:
        rings.append(GPIO.input(gate_a) + GPIO.input(gate_b))
    for nr, ring in enumerate(rings, 1):
        p = [100, 50, 0][ring]
        cprint(f"Status Ring {nr}: {p}%s")

def check_gates():
    # TODO: keine Ahnung was das soll
    rings = []
    for gate_a, gate_b in LASER_GATES:
        rings.append((GPIO.input(gate_a), GPIO.input(gate_b)))
    if rings[2][1]:
        ring = 2
    elif rings[1][1] or not rings[1][0]:
        ring = 1
    elif rings[0][0] or rings[0][1]:
        ring = 0
    else:
        ring = 3
    if ring != 3:
        cprint("PUNKTE")
        cprint(str(ring))
        time.sleep(1)
    return ring

def clear_queue(queue):
    try:
        while True:
            queue.get_nowait()
    except Empty:
        pass

def select_teams(queue):
    light_off(ALL_LIGHTS)
    cprint("Bitte waehlen Sie mit den Farben die mitspielenden Teams aus. Bestaetigen Sie ihre Auswahl mit dem Schnatz")
    selected = []
    clear_queue(queue)
    while True:
        color = BUTTONS[queue.get()]
        if color == SNATCH:
            if selected:
                break
            # blink lights if no team is selected
            play_lights1()
        else:
            if color in selected:
                selected.remove(color)
                light_off(color)
            else:
                selected.add(color)
                light_on(color)
    light_off(ALL_LIGHTS)
    return [
        Team(color, *TEAMS[color])
    ]

def select_duration():
    cprint("Bitte waehlen Sie die Dauer des Spiels aus:")
    for duration, name, color in sorted(DURATIONS.values()):
        cprint(f"{name} = {duration} Minuten", color=color)
    cprint ("Das Spiel wird mit dem Schnatz gestartet")
    selected_duration = 0
    clear_queue(queue)
    while True:
        color = BUTTONS[queue.get()]
        if color == SNATCH:
            if selected_duration != 0:
                break
            play_lights2()
        else:
            selected_duration = DURATIONS[color][0]
            light_off(TEAM_LIGHTS)
            light_on(color)
    return select_duration

def display_gates(gates):
    cprint("Tore", end=" ")
    for nr, gate in enumerate(gates, 1):
        cprint(f"Tor {nr} ", end=" ")
        if gate is None:
            cprint("DEFEKT", color="grey", end=" ")
        else:
            cprint(gate.team_name, color=gate.color, end=" ")

def schnatz_active(teams):
    selected = random.choice([None] + teams)
    if selected is None:
        licht_aus(LICHT_schnatz)
    else:
        licht_an(LICHT_schnatz)
        cprint("Der Schnatz wurde gesichtet! Er kann von folgendem Team gefangen werden:")
        cprint(selected.team_name, color=selected.color, end=" ")
    return selected

def display_results(teams):
    cprint("Das Spiel ist zu Ende! Eine herausragende Leistung von allen Teilnehmern!")
    cprint("ERGEBNIS:")
    teams = sort(teams, key=lambda t: t.points, reverse=True)
    for team in teams[:3]:
        team.show_points()
    play_lights3()

def run_game(teams, duration):
    schnatz_timer = None
    gate_time = 0
    start = time.time()
    ende = start + duration
    while True:
        akt_zeit = time.time()
        if akt_zeit > gate_time:
            gates = [
                random.choice([None] + teams)
                for _ in range(3)
            ]
            display_gates(gates)
            gate_time = akt_time + 10

        if akt_zeit > ende:
            if schnatz_timer is None:
                schnatz_status = schatz_active(teams)
                schnatz_timer = akt_zeit + random.randint(1,10)
            elif akt_zeit < schnatz_timer: #TODO: and schnatz == FALSE:
                break
        check_ring = check_gates()
        if check_ring != 3:
            team = gates[check_ring]
            if team is not None:
                team.points += 10
                team.show_points()
    cprint("Spielende")
    if schnatz_status is not None:
        schnatz_status.points += 150

def initialize(buttons):
    queue = Queue()
    GPIO.setmode(GPIO.BCM)
    for button, led in buttons.items():
        GPIO.setup(led, GPIO.OUT)
        GPIO.setup(button, GPIO.IN, pull_up_down=GPIO.PUD_UP)
        GPIO.add_event_detect(button, GPIO.FALLING, queue.put)
    for gates in LASER_GATES:
        GPIO.setup(gates, GPIO.IN, pull_up_down=GPIO.PUD_UP)
    return queue

def main():
    try:
        queue = initialize(BUTTONS)
        while True:
            teams = select_teams(queue)
            duration = select_duration() * 60
            checkstart()
            cprint("Am Spiel nehmen die folgenden Mannschaften teil:")
            for team in teams:
                cprint(team.team_name, color=team.color)
            run_game(teams, duration)
            display_results(teams)
    finally:
        GPIO.cleanup()

if __name__ == "__main__":
    main()


selected = {} zu selected = []
Liste statt dict.
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Keine Ahnung, was ich mir dabei gedacht hatte:

Code: Alles auswählen

def select_teams(queue):
    light_off(ALL_LIGHTS)
    cprint("Bitte waehlen Sie mit den Farben die mitspielenden Teams aus. Bestaetigen Sie ihre Auswahl mit dem Schnatz")
    selected = set()
    clear_queue(queue)
    while True:
        color = BUTTONS[queue.get()]
        if color == SNATCH:
            if selected:
                break
            # blink lights if no team is selected
            play_lights1()
        else:
            if color in selected:
                selected.remove(color)
                light_off(color)
            else:
                selected.add(color)
                light_on(color)
    light_off(ALL_LIGHTS)
    return [
        Team(color, *TEAMS[color])
        for color in selected
    ]
Netdeus
User
Beiträge: 25
Registriert: Sonntag 19. Juli 2020, 12:18

habe ich geändert - bleibt aber bei der gleichen Fehlermeldung:

...
...
AttributeError: 'list' object has no attribute 'add'
Netdeus
User
Beiträge: 25
Registriert: Sonntag 19. Juli 2020, 12:18

Übrigens - habe jetzt auch mal Teamviewer auf dem Pi installiert - vielleicht ist es einfacher, wenn man sich mal zusammen drauf verbindet?
Antworten