2.1.5 Tastenfeld

Einführung

Ein Tastenfeld ist ein rechteckiges Array von Tasten. In diesem Projekt werden wir es verwenden, um Zeichen einzugeben.

Benötigte Komponenten

Für dieses Projekt benötigen wir die folgenden Komponenten.

../_images/2.1.5_keypad_list.png

Schaltplan

../_images/2.1.5_keypad_chematic_1.png ../_images/2.1.5_keypad_chematic_2.png

Experimentelle Verfahren

Schritt 1: Bauen Sie den Schaltkreis auf.

../_images/2.1.5_keypad_circuit.png

Schritt 2: Öffnen Sie die Code-Datei.

cd ~/davinci-kit-for-raspberry-pi/python-pi5

Schritt 3: Ausführen.

sudo python3 2.1.5_Keypad_zero.py

Nachdem der Code ausgeführt wurde, werden die Werte der gedrückten Tasten auf dem Tastenfeld (Tastenwert) auf dem Bildschirm angezeigt.

Code

Bemerkung

Sie können den unten stehenden Code Modifizieren/Zurücksetzen/Kopieren/Ausführen/Stoppen. Aber bevor Sie das tun, müssen Sie zum Quellcode-Pfad wie davinci-kit-for-raspberry-pi/python-pi5 gehen. Nachdem Sie den Code geändert haben, können Sie ihn direkt ausführen, um die Auswirkungen zu sehen.

#!/usr/bin/env python3
from gpiozero import DigitalOutputDevice, Button
from time import sleep

class Keypad:
    def __init__(self, rows_pins, cols_pins, keys):
        """
        Initialisieren Sie das Tastenfeld mit den angegebenen Reihen- und Spaltenpins sowie dem Tastenfeldlayout.
        :param rows_pins: Liste der GPIO-Pins für die Reihen.
        :param cols_pins: Liste der GPIO-Pins für die Spalten.
        :param keys: Liste der Tasten im Tastenfeldlayout.
        """
        # Initialisieren der Reihenpins als DigitalOutputDevice
        self.rows = [DigitalOutputDevice(pin) for pin in rows_pins]
        # Initialisieren der Spaltenpins als Buttons
        self.cols = [Button(pin, pull_up=False) for pin in cols_pins]
        self.keys = keys  # Setzen des Tastenfeldlayouts

    def read(self):
        """
        Lesen Sie die derzeit gedrückten Tasten auf dem Tastenfeld.
        :return: Eine Liste der gedrückten Tasten.
        """
        pressed_keys = []
        # Scannen Sie jede Reihe und Spalte, um gedrückte Tasten zu identifizieren
        for i, row in enumerate(self.rows):
            row.on()  # Aktivieren Sie die aktuelle Reihe
            for j, col in enumerate(self.cols):
                if col.is_pressed:  # Überprüfen Sie, ob die Spaltentaste gedrückt ist
                    # Berechnen Sie den Tastenindex basierend auf Reihe und Spalte
                    index = i * len(self.cols) + j
                    pressed_keys.append(self.keys[index])
            row.off()  # Deaktivieren Sie die aktuelle Reihe
        return pressed_keys

try:
    # Konfigurieren Sie Reihen, Spalten und Tastenfeldlayout
    rows_pins = [18, 23, 24, 25]
    cols_pins = [10, 22, 27, 17]
    keys = ["1", "2", "3", "A",
            "4", "5", "6", "B",
            "7", "8", "9", "C",
            "*", "0", "#", "D"]

    # Erstellen Sie eine Instanz der Keypad-Klasse
    keypad = Keypad(rows_pins, cols_pins, keys)
    last_key_pressed = []

    # Lesen Sie kontinuierlich das Tastenfeld und drucken Sie neu gedrückte Tasten
    while True:
        pressed_keys = keypad.read()
        if pressed_keys and pressed_keys != last_key_pressed:
            print(pressed_keys)  # Drucken Sie die Liste der gedrückten Tasten
            last_key_pressed = pressed_keys
        sleep(0.1)  # Kurze Verzögerung zur Reduzierung der CPU-Auslastung

except KeyboardInterrupt:
    # Behandeln Sie eine Tastaturunterbrechung (Ctrl+C) für einen sauberen Ausstieg
    pass

Code-Erklärung

  1. Importiert die Klassen DigitalOutputDevice und Button aus der Bibliothek gpiozero und die Funktion sleep für Verzögerungen.

    #!/usr/bin/env python3
    from gpiozero import DigitalOutputDevice, Button
    from time import sleep
    
  2. Definiert die Klasse Keypad. Die Methode __init__ initialisiert das Tastenfeld mit den gegebenen Reihen- und Spaltenpins und Tasten. Die Methode read scannt das Tastenfeld und gibt eine Liste der gedrückten Tasten zurück.

    class Keypad:
        def __init__(self, rows_pins, cols_pins, keys):
            """
            Initialisieren Sie das Tastenfeld mit den angegebenen Reihen- und Spaltenpins sowie dem Tastenfeldlayout.
            :param rows_pins: Liste der GPIO-Pins für die Reihen.
            :param cols_pins: Liste der GPIO-Pins für die Spalten.
            :param keys: Liste der Tasten im Tastenfeldlayout.
            """
            # Initialisieren der Reihenpins als DigitalOutputDevice
            self.rows = [DigitalOutputDevice(pin) for pin in rows_pins]
            # Initialisieren der Spaltenpins als Buttons
            self.cols = [Button(pin, pull_up=False) for pin in cols_pins]
            self.keys = keys  # Setzen des Tastenfeldlayouts
    
        def read(self):
            """
            Lesen Sie die derzeit gedrückten Tasten auf dem Tastenfeld.
            :return: Eine Liste der gedrückten Tasten.
            """
            pressed_keys = []
            # Scannen Sie jede Reihe und Spalte, um gedrückte Tasten zu identifizieren
            for i, row in enumerate(self.rows):
                row.on()  # Aktivieren Sie die aktuelle Reihe
                for j, col in enumerate(self.cols):
                    if col.is_pressed:  # Überprüfen Sie, ob die Spaltentaste gedrückt ist
                    # Berechnen Sie den Tastenindex basierend auf Reihe und Spalte
                    index = i * len(self.cols) + j
                    pressed_keys.append(self.keys[index])
                row.off()  # Deaktivieren Sie die aktuelle Reihe
            return pressed_keys
    
  3. Richtet die GPIO-Pins für Reihen und Spalten ein und definiert das Tastenfeldlayout.

    try:
        # Konfigurieren Sie Reihen, Spalten und Tastenfeldlayout
        rows_pins = [18, 23, 24, 25]
        cols_pins = [10, 22, 27, 17]
        keys = ["1", "2", "3", "A",
                "4", "5", "6", "B",
                "7", "8", "9", "C",
                "*", "0", "#", "D"]
    
  4. Erstellt eine Instanz der Keypad-Klasse mit der spezifizierten Konfiguration.

    try:
        ...
    
        # Erstellen Sie eine Instanz der Keypad-Klasse
        keypad = Keypad(rows_pins, cols_pins, keys)
        last_key_pressed = []
    
  5. Liest kontinuierlich das Tastenfeld auf gedrückte Tasten, druckt Änderungen im Tastenzustand und führt eine kurze Verzögerung ein, um die CPU-Auslastung zu verringern. Fängt eine KeyboardInterrupt (wie Ctrl+C) ab, um einen eleganten Ausstieg aus dem Skript zu ermöglichen.

    try:
        ...
    
        # Lesen Sie kontinuierlich das Tastenfeld und drucken Sie neu gedrückte Tasten
        while True:
            pressed_keys = keypad.read()
            if pressed_keys and pressed_keys != last_key_pressed:
                print(pressed_keys)  # Drucken Sie die Liste der gedrückten Tasten
                last_key_pressed = pressed_keys
            sleep(0.1)  # Kurze Verzögerung zur Reduzierung der CPU-Auslastung
    
    except KeyboardInterrupt:
        # Behandeln Sie eine Tastaturunterbrechung (Ctrl+C) für einen sauberen Ausstieg
        pass