Das Keypad
Mit dem nächsten kleinen Helferlein kann man viele tolle Projekte umsetzen. Was? Du glaubst mir nicht, dass ein einfaches Keypad das Potenzial hat, die Welt zu verändern? Na dann erzähl mir doch mal bitte, wie man sonst Telefonnummern auf einem Tastentelefon eingeben sollte!
Da wir die unverkennliche Wichtigkeit eines Keypads geklärt haben, können wir uns im Folgenden ja an die Grundlagen dessen Nutzung machen.
Die Funktionsweise eines Keypads ist sehr simpel. Jede Taste kannst du dir dabei wie einen einzelnen Button vorstellen. Wenn die Taste gedrückt wird, verbinden sich zwei Metallplättchen und es fließt Strom. Durch einen ausgeklügelten Mechanismus müssen wir nicht alle 16 Buttons einzeln auslesen, sondern werden mit dem Programm zuerst durch die vier Spalten Strom fließen lassen und dann die einzelnen Zeilen ausmessen, ob Strom fließt. Wenn das der Fall ist, wissen wir genau, welche Taste gedrückt wurde. Das kann der Pi so schnell, dass zu jedem Zeitpunkt gemessen werden kann, welche Taste gerade gedrückt wurde.
(Wie dir vielleicht auffällt sieht dein Keypad in echt etwas anders aus, aber das ist kein Problem. Die 1 im Schaltbild ist selbe Spalte wie die 1 auf dem Keypad)
Da das Keypad weder an GND noch an 3,3V/5V angeschlossen werden muss, ist es am einfachsten, es direkt an den Raspberry Pi anzuschließen.
Anschlüsse Pi | Anschlüsse am Keypad |
---|---|
GPIO 18 | 1 |
GPIO 23 | 2 |
GPIO 24 | 3 |
GPIO 25 | 4 |
GPIO 12 | 5 |
GPIO 16 | 6 |
GPIO 20 | 7 |
GPIO 21 | 8 |
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]
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
try:
while True:
print(keypad())
time.sleep(0.2)
except KeyboardInterrupt:
gpio.cleanup()
Schritt für Schritt erklärt
In den ersten 4 Zeilen importieren wir die benötigten Bibliotheken und legen die Pinnummerierung fest. In Zeile 6 erstellen wir eine mehrdimensionale Liste, welche unser Keypad abbildet. Wenn wir uns eine Liste mit einer Box vorstellen, in der wir verschiedenste Sachen speichern können, ist eine mehrdimensionale Liste eine Box mit weiteren Boxen, in der dann viele Sachen gespeichert werden können. Diese Listen in der Liste bekommen auch eine Nummerierung. Das heißt, wenn wir jetzt print(matrix[0][0])
eingeben würden, würde dort „1“ ausgegeben werden.
Es kann sein, dass nano euch anzeigt, dass es in der letzten Zeile einen Kommentar gibt. Die # wird aber von Python nicht als Kommentar verstanden, weil sich diese in einem String befindet
In Zeile 11 und 12 werden die verschiedenen Spalten und Zeilen gespeichert. Es ist wichtig, dabei zwischen Spalten und Zeilen zu unterscheiden, da diese unterschiedliche Funktionen haben. In Zeile 14 kümmern wir uns zuerst darum, dass alle Pins der Spalten auch als Output gesetzt werden. Um uns Arbeit zu ersparen, benutzen wir dafür eine for Schleife. In Zeile 16 werden die Output dann auch gleich so geschaltet, dass diese Strom abgeben. In Zeile 18 und 19 machen wir genau das Gleiche, nur mit den Zeilen und natürlich setzen wir diese als Input, denn die sollen ja Strom messen. In Zeile 20 starten wir unsere eigene Funktion und nennen sie passenderweiser keypad. In Zeile 21 fängt die while Schleife an. Diese läuft solange, wie die Funktion noch keinen Wert zurückgeben hat. Das heißt, wenn die Funktion aufgerufen wird und mit return ein Wert zurückgegeben wird, wird auch die while Schleife beendet. Wie oben schon gesagt, gehen wir zuerst alle Zeilen durch und schalten Strom an. Das Durchgehen der einzelnen Zeilen machen wir mal wieder in Zeile 22 mit der for Schleife. In Reihe 23 lassen wir dann Strom durch alle Zeilen laufen. In Zeile 24 benutzen wir die for Schleife und messen dann in Zeile 25, ob dort Strom fließt, denn wenn gpio.input(gpioPIN)
etwas misst, wissen wir, dass ein Button gedrückt wurde, denn nur dann kann dort Strom fließen.
Im nächsten Schritt speichern wir in der Variablen benutzerEingabe, welcher Button gedrückt wurde, denn die Vorarbeit haben wir schon mit der mehrdimensionalen Liste gemacht. Jetzt können wir aber nicht sofort diesen Wert zurückgeben, weil der Pi das alles so schnell misst, dass selbst wenn wir nur kurz eine Taste drücken, es trotzdem doppelt angezeigt werden könnte. Deswegen gibt es in Zeile 27 eine while Schleife, die solange läuft, wie der Button gedrückt wurde. Solange das der Fall ist, macht unser Programm nichts, denn mit pass
sagen wir dem Pi, dass er einfach machen soll. Danach geben wir einfach den Wert zurück.
In Zeile 34 rufen wir dann die Funktion einfach auf und weil es erstmal nur simpel sein soll, geben wir sie einfach aus. Wichtig ist, dass wir dann in Zeile 35 erst mal 0.2 Sekunden warten, damit es nicht zu doppelten Eingaben kommt.