Zahlenfeld (Vergleich funktioniert nicht)

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
Santiago
User
Beiträge: 1
Registriert: Dienstag 21. April 2020, 21:18

Hi,
ich bin neu hier im Forum. Ich habe ein Zahlenfeld angeschlossen und den folgenden Code.
[code][import RPi.GPIO as gpio
import time

gpio.setmode(gpio.BCM)

matrix = [["1","2","3", "A"],
["4","5","6", "B"],
["7","8","9", "C"],
["*", "0", "#", "D"]]

spalte = [12, 16, 20, 21]
zeile = [18, 23, 24, 25]
nummer=""
for j in range(4):
gpio.setup(spalte[j], gpio.OUT)
gpio.output(spalte[j], 1)
gpio.setup(zeile[j],gpio.IN,
pull_up_down=gpio.PUD_UP)

def keypad():
while True:
for j in range(4):
gpio.output(spalte[j], 0)
for i in range(4):
if gpio.input(zeile[i]) == 0:
benutzerEingabe = matrix[i][j]
while gpio.input(zeile[i]) == 0:
pass
return benutzerEingabe
gpio.output(spalte[j], 1)
return False
def eingabe(nummer):
Nummer = ""

for i in range(6):
nummer = str (nummer+keypad())
#print (z)
time.sleep (0.2)
print(nummer)


Oliver = ("236889")
John = ("561984")
a = ("Oliver")
b = ("John")
Versuche = 1
VersFrei = 0

print("Sir please enter your verification number: ")
nummer = eingabe(str (nummer))
while nummer != Oliver or nummer != John:
if nummer == Oliver:
print ("Access granted "+ a)
break
elif nummer == John:
print ("Access granted "+ b)
break
else:
print ("Access not granted")
Versuche += 1
if Versuche == 6:
break
VersFrei = 6 - Versuche
if VersFrei > 1:
print ("Only "+str(VersFrei) + " tries left!")
else:
print ("Only "+str(VersFrei) + " try left!")
print("Sir please enter your verification number: ")
eingabe(str (nummer))/code]
Bei egal welcher Eingabe wird immer angezeigt das dies die falsche Nummer ist auch wenn die Zahlen stimmen.
Was hab ich falsch gemacht?

LG Santiago
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

Dein Kollege Max2Plays scheint ähnliche Probleme mit einem Tastenfeld zu haben.

Eingerückt wird immer mit 4 Leerzeichen pro Ebene, nicht mal 2 und mal 4.
Über einen Index iteriert man in Python nicht, weil man direkt die Elemente einer Liste mit einer for-Schleife durchgehen kann.
Das `return False` in `read_keypad` wird nie erreicht, weil es eine Endlosschleife gibt.
In `eingabe` übergibst Du eine `nummer` an die dann die Eingaben angehängt werden? Das ist überraschend bis falsch. Die Funktion sollte dann nummer als Rückgabewert haben, weil sonst im Hauptprogramm bei Aufruf von eingabe nur None an nummer gebunden wird.
Da Du eh die ganze Zeit mit Strings arbeitest, sind die vielen str-Aufrufe allesamt überflüssig.
Die Bedingung in der while-Schleife sind falsch. Wenn nummer gleich Oliver ist dann ist garantier nummer ungleich John und umgekehrt, Du hast also effektiv eine Endlosschleife.
Bei Oliver und John ist die Datenstruktur falsch, das sollte besser ein Wörterbuch sein.

Variablennamen werden komplett klein, Konstanten KOMPLETT_GROSS geschrieben. Benutze keine Abkürzungen. Bei jeder Fehleingabe muß ich einen Vers frei aufsagen?

Code: Alles auswählen

import RPi.GPIO as gpio
import time

TASTEN_MATRIX = ["123A", "456B", "789C", "*0#D"]

SPALTEN_PINS = [12, 16, 20, 21]
ZEILEN_PINS = [18, 23, 24, 25]

NUTZER = {
    "236889": "Oliver",
    "561984": "John",
}

def read_keypad():
    while True:
        for spalten_index, spalten_pin in enumerate(SPALTEN_PINS):
            gpio.output(spalten_pin, gpio.LOW)
            for zeilen_pin, tasten_zeile in zip(ZEILEN_PINS, TASTEN_MATRIX):
                if not gpio.input(zeilen_pin):
                    while not gpio.input(zeilen_pin):
                        pass
                    return tasten_zeile[spalten_index]
            gpio.output(spalten_pin, gpio.HIGH)


def setup():
    gpio.setmode(gpio.BCM)
    gpio.setup(SPALTEN_PINS, gpio.OUT, initial=gpio.HIGH)
    gpio.setup(ZEILEN_PINS, gpio.IN, pull_up_down=gpio.PUD_UP)
    
def eingabe(anzahl_ziffern):
    nummer = ""
    for _ in range(anzahl_ziffern):
        nummer += read_keypad()
        time.sleep(0.2)
    return nummer

def main():
    try:
        setup()
        while True:
            print("Sir please enter your verification number: ")
            nummer = eingabe(6)
            if nummer in NUTZER:
                break
        print(f"Access granted {NUTZER[nummer]}")
    finally:
        gpio.cleanup()

if __name__ == '__main__':
    main()
Antworten