.. note:: Ciao, benvenuto nella Community di SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts su Facebook! Approfondisci il mondo di Raspberry Pi, Arduino ed ESP32 insieme ad altri appassionati. **Perché unirti a noi?** - **Supporto Tecnico Esperto**: Risolvi i problemi post-vendita e le sfide tecniche con l'aiuto della nostra comunità e del nostro team. - **Impara e Condividi**: Scambia consigli e tutorial per migliorare le tue competenze. - **Anteprime Esclusive**: Ottieni accesso anticipato agli annunci di nuovi prodotti e alle anteprime. - **Sconti Speciali**: Approfitta di sconti esclusivi sui nostri prodotti più recenti. - **Promozioni Festive e Giveaway**: Partecipa a giveaway e promozioni durante le festività. 👉 Sei pronto a esplorare e creare con noi? Clicca [|link_sf_facebook|] e unisciti oggi stesso! .. _2.1.8_py_pi5: 2.1.8 Tastiera ================= Introduzione --------------- Una tastiera è una matrice rettangolare di pulsanti. In questo progetto, la useremo per inserire caratteri. Componenti Necessari -------------------------------- Per questo progetto, avremo bisogno dei seguenti componenti. .. image:: ../python_pi5/img/2.1.8_keypad_list.png È decisamente conveniente acquistare un kit completo, ecco il link: .. list-table:: :widths: 20 20 20 :header-rows: 1 * - Nome - COMPONENTI NEL KIT - LINK * - Raphael Kit - 337 - |link_Raphael_kit| Puoi anche acquistarli separatamente dai link sottostanti. .. list-table:: :widths: 30 20 :header-rows: 1 * - INTRODUZIONE AI COMPONENTI - LINK D'ACQUISTO * - :ref:`cpn_gpio_extension_board` - |link_gpio_board_buy| * - :ref:`cpn_breadboard` - |link_breadboard_buy| * - :ref:`cpn_wires` - |link_wires_buy| * - :ref:`cpn_resistor` - |link_resistor_buy| * - :ref:`cpn_keypad` - \- Schema Elettrico -------------------- .. image:: ../python_pi5/img/2.1.8_keypad_chematic_1.png .. image:: ../python_pi5/img/2.1.8_keypad_chematic_2.png Procedure Sperimentali --------------------------- **Passo 1:** Costruisci il circuito. .. image:: ../python_pi5/img/2.1.8_keypad_circuit.png **Passo 2:** Apri il file del codice. .. raw:: html .. code-block:: cd ~/raphael-kit/python-pi5 **Passo 3:** Esegui. .. raw:: html .. code-block:: sudo python3 2.1.8_Keypad_zero.py Dopo l'esecuzione del codice, i valori dei tasti premuti sulla tastiera (valore del tasto) verranno visualizzati sullo schermo. .. warning:: Se viene visualizzato l'errore ``RuntimeError: Cannot determine SOC peripheral base address``, fare riferimento a :ref:`faq_soc`. **Code** .. note:: Puoi **Modificare/Resettare/Copiare/Eseguire/Fermare** il codice qui sotto. Ma prima, devi accedere alla directory del codice come ``raphael-kit/python-pi5``. Dopo aver modificato il codice, puoi eseguirlo direttamente per vedere l'effetto. .. 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): """ Initialize the Keypad with specified row and column pins and keypad layout. :param rows_pins: List of GPIO pins for the rows. :param cols_pins: List of GPIO pins for the columns. :param keys: List of keys in the keypad layout. """ # Initialize row pins as DigitalOutputDevice self.rows = [DigitalOutputDevice(pin) for pin in rows_pins] # Initialize column pins as Buttons self.cols = [Button(pin, pull_up=False) for pin in cols_pins] self.keys = keys # Set the keypad layout def read(self): """ Read the currently pressed keys on the keypad. :return: A list of pressed keys. """ pressed_keys = [] # Scansiona ogni riga e colonna per identificare i tasti premuti for i, row in enumerate(self.rows): row.on() # Abilita la riga corrente for j, col in enumerate(self.cols): if col.is_pressed: # Verifica se il pulsante della colonna è premuto # Calcola l'indice del tasto in base a riga e colonna index = i * len(self.cols) + j pressed_keys.append(self.keys[index]) row.off() # Disabilita la riga corrente return pressed_keys try: # Configura righe, colonne e layout della tastiera 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"] # Crea un'istanza della classe Keypad keypad = Keypad(rows_pins, cols_pins, keys) last_key_pressed = [] # Leggi continuamente la tastiera e stampa i nuovi tasti premuti while True: pressed_keys = keypad.read() if pressed_keys and pressed_keys != last_key_pressed: print(pressed_keys) # Stampa l'elenco dei tasti premuti last_key_pressed = pressed_keys sleep(0.1) # Breve pausa per ridurre il carico della CPU except KeyboardInterrupt: # Gestisce un'interruzione da tastiera (Ctrl+C) per una corretta uscita pass **Spiegazione del Codice** #. Importa le classi ``DigitalOutputDevice`` e ``Button`` dalla libreria ``gpiozero``, e la funzione ``sleep`` per i ritardi. .. code-block:: python #!/usr/bin/env python3 from gpiozero import DigitalOutputDevice, Button from time import sleep #. Definisce la classe ``Keypad``. Il metodo ``__init__`` inizializza la tastiera con i pin di riga e colonna e i tasti specificati. Il metodo ``read`` scansiona la tastiera e restituisce un elenco di tasti premuti. .. code-block:: python class Keypad: def __init__(self, rows_pins, cols_pins, keys): """ Initialize the Keypad with specified row and column pins and keypad layout. :param rows_pins: List of GPIO pins for the rows. :param cols_pins: List of GPIO pins for the columns. :param keys: List of keys in the keypad layout. """ # Initialize row pins as DigitalOutputDevice self.rows = [DigitalOutputDevice(pin) for pin in rows_pins] # Initialize column pins as Buttons self.cols = [Button(pin, pull_up=False) for pin in cols_pins] self.keys = keys # Set the keypad layout def read(self): """ Read the currently pressed keys on the keypad. :return: A list of pressed keys. """ pressed_keys = [] # Scansiona ogni riga e colonna per identificare i tasti premuti for i, row in enumerate(self.rows): row.on() # Abilita la riga corrente for j, col in enumerate(self.cols): if col.is_pressed: # Verifica se il pulsante della colonna è premuto # Calcola l'indice del tasto in base a riga e colonna index = i * len(self.cols) + j pressed_keys.append(self.keys[index]) row.off() # Disabilita la riga corrente return pressed_keys #. Configura i pin GPIO per righe e colonne e definisce il layout della tastiera. .. code-block:: python try: # Configura righe, colonne e layout della tastiera 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"] #. Crea un'istanza della classe ``Keypad`` con la configurazione specificata. .. code-block:: python try: ... # Crea un'istanza della classe Keypad keypad = Keypad(rows_pins, cols_pins, keys) last_key_pressed = [] #. Legge continuamente la tastiera per i tasti premuti, stampa eventuali variazioni di stato dei tasti e introduce una breve pausa per ridurre il carico della CPU. Gestisce un'interruzione da tastiera (Ctrl+C) per consentire un'uscita pulita dallo script. .. code-block:: python try: ... # Leggi continuamente la tastiera e stampa i nuovi tasti premuti while True: pressed_keys = keypad.read() if pressed_keys and pressed_keys != last_key_pressed: print(pressed_keys) # Stampa l'elenco dei tasti premuti last_key_pressed = pressed_keys sleep(0.1) # Breve pausa per ridurre il carico della CPU except KeyboardInterrupt: # Gestisce un'interruzione da tastiera (Ctrl+C) per una corretta uscita pass