Raspberry Pi friert ein

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
TheLüddy
User
Beiträge: 20
Registriert: Freitag 27. April 2018, 10:17

Hallo Leute,

ich habe letztens einen Code abgeschrieben von Franzis Lernpaket. Dieses lässt jedoch meinen Raspberry pi (Model B+) einfrieren. Ich kann nichts mehr tun ausser das Netzteil aus- und wieder einzustecken. Daraufhin habe ich mich gefragt, ob dies wohl durch einen Fehler im Code ausgelöst wird. Könnt Ihr mir helfen?

Der Code:

Code: Alles auswählen

import time, random
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)

rzahl = 10; farbe = []
for i in range(rzahl):
    farbe.append(random.randrange(4))

LED = [23,34,25,8]
for i in LED:
    GPIO.setup(i, GPIO.OUT, initial=False)

TAST = [4,17,21,22]
for i in TAST:
    GPIO.setup(i, GPIO.IN)

def LEDein(n, z):
    GPIO.output(LED[n], True); time.sleep(z)
    GPIO.output(LED[n], False);time.sleep(0.15)

def Druecken():
    while True:
        if(GPIO.input(TAST[0])):
            return 0
        if(GPIO.input(TAST[1])):
            return 1
        if(GPIO.input(TAST[2])):
            return 2
        if(GPIO.input(TAST[3])):
            return 3

ok = True

try:
    for runde in range(1, rzahl +1):
        print("Runde: " + runde)
        for i in range(runde):
            LEDein(farbe[i], 1)
        for i in range(runde):
            taste = Druecken()
            LEDein(taste, 0.2)
            if(taste != farbe[i]):
                print("Verloren!")
                print("Du hast es bis Runde " + runde-1 + " geschafft")
                for j in range(4):
                    GPIO.output(LED[j], True)
                for j in range(4):
                    time.sleep(0.5)
                    GPIO.output(LED[j], False)
                ok = False
                break
        if(ok == False):
            break
        time.sleep(0.5)
    
    if(ok == True):
        print("Super gemacht!")
        for i in range(5):
            for j in range(4):
                GPIO.output(LED[j], True)
            time.sleep(0.05)
            for j in range(4):
                GPIO.output(LED[j], False)
            time.sleep(0.05)

except KeyboardInterrupt:
    GPIO.cleanup()
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Deine Tastenabfrage ist ein spinloop. Der braucht dringend ein Time.sleep damit er nicht 100% rechenzeit schluckt.
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

@TheLüddy: der Code ist mal wieder von der gewohnt schlechten Qualität, die man oft im Raspi-Umfeld findet. ; benutzt man nicht, sondern schreibt jede Anweisung in eine eigene Zeile. if braucht keine Klammern. for-Schleifen über den Index und Code-Kopiererei. Und zum Schluß noch fehlerhaftes Aufräumen.

Code: Alles auswählen

import time
import random
import RPi.GPIO as gpio

LEDS = [23,34,25,8]
BUTTONS = [4,17,21,22]
NUMBER_OF_COLORS = 10

def initalize():
    gpio.setmode(gpio.BCM)
    gpio.setup(LEDS, gpio.OUT, initial=False)
    gpio.setup(BUTTONS, gpio.IN)

def blink(n, z):
    gpio.output(LEDS[n], True)
    time.sleep(z)
    gpio.output(LEDS[n], False)
    time.sleep(0.15)

def blink_loose():
    gpio.output(LEDS, True)
    for led in LEDS:
        time.sleep(0.5)
        gpio.output(led, False)

def blink_win():
    for i in range(5):
        gpio.output(LEDS, True)
        time.sleep(0.05)
        gpio.output(LEDS, False)
        time.sleep(0.05)

def detect_button():
    while True:
        for nr, button in enumerate(BUTTONS):
            if gpio.input(buton):
                return nr
        time.sleep(0.01)

def play_round(farben):
    for farbe in farben:
        blink(farbe, 1)
    for farbe in farben:
        taste = detect_button()
        blink(taste, 0.2)
        if taste != farbe:
            return False
    return True

def play(farben):
    for runde in range(1, len(farben) + 1):
        print("Runde: {}".format(runde))
        if not play_round(farben[:runde]):
            print("Verloren!")
            print("Du hast es bis Runde {} geschafft".format(runde - 1))
            blink_loose()
            return
        time.sleep(0.5)
    
    print("Super gemacht!")
    blink_win()

def main():
    farben = [random.randrange(4) for _ in range(NUMBER_OF_COLORS)]
    try:
        initalize()
        play(farben)
    except KeyboardInterrupt:
        pass
    finally:
        gpio.cleanup()

if __name__ == '__main__':
    main()
Wahrscheinlich stimmt etwas an Deiner Verkabelung nicht.
Antworten