.. note:: Hallo und willkommen in der SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasten-Gemeinschaft auf Facebook! Tauchen Sie tiefer ein in die Welt von Raspberry Pi, Arduino und ESP32 mit anderen Enthusiasten. **Warum beitreten?** - **Expertenunterstützung**: Lösen Sie Nachverkaufsprobleme und technische Herausforderungen mit Hilfe unserer Gemeinschaft und unseres Teams. - **Lernen & Teilen**: Tauschen Sie Tipps und Anleitungen aus, um Ihre Fähigkeiten zu verbessern. - **Exklusive Vorschauen**: Erhalten Sie frühzeitigen Zugang zu neuen Produktankündigungen und exklusiven Einblicken. - **Spezialrabatte**: Genießen Sie exklusive Rabatte auf unsere neuesten Produkte. - **Festliche Aktionen und Gewinnspiele**: Nehmen Sie an Gewinnspielen und Feiertagsaktionen teil. 👉 Sind Sie bereit, mit uns zu erkunden und zu erschaffen? Klicken Sie auf [|link_sf_facebook|] und treten Sie heute bei! .. _2.1.5_py_pi5: 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. .. image:: ../python_pi5/img/2.1.5_keypad_list.png Schaltplan ----------------- .. image:: ../python_pi5/img/2.1.5_keypad_chematic_1.png .. image:: ../python_pi5/img/2.1.5_keypad_chematic_2.png Experimentelle Verfahren --------------------------------------- **Schritt 1:** Bauen Sie den Schaltkreis auf. .. image:: ../python_pi5/img/2.1.5_keypad_circuit.png **Schritt 2:** Öffnen Sie die Code-Datei. .. raw:: html .. code-block:: cd ~/davinci-kit-for-raspberry-pi/python-pi5 **Schritt 3:** Ausführen. .. raw:: html .. code-block:: 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. .. warning:: Wenn die Fehlermeldung ``RuntimeError: Cannot determine SOC peripheral base address`` angezeigt wird, lesen Sie bitte :ref:`faq_soc` **Code** .. note:: 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. .. raw:: html .. code-block:: python #!/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** #. Importiert die Klassen ``DigitalOutputDevice`` und ``Button`` aus der Bibliothek ``gpiozero`` und die Funktion ``sleep`` für Verzögerungen. .. code-block:: python #!/usr/bin/env python3 from gpiozero import DigitalOutputDevice, Button from time import sleep #. 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. .. code-block:: python 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 #. Richtet die GPIO-Pins für Reihen und Spalten ein und definiert das Tastenfeldlayout. .. code-block:: python 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"] #. Erstellt eine Instanz der ``Keypad``-Klasse mit der spezifizierten Konfiguration. .. code-block:: python try: ... # Erstellen Sie eine Instanz der Keypad-Klasse keypad = Keypad(rows_pins, cols_pins, keys) last_key_pressed = [] #. 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. .. code-block:: python 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