Nota
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 [Qui] e unisciti oggi stesso!
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.
È decisamente conveniente acquistare un kit completo, ecco il link:
Nome |
COMPONENTI NEL KIT |
LINK |
|---|---|---|
Raphael Kit |
337 |
Puoi anche acquistarli separatamente dai link sottostanti.
INTRODUZIONE AI COMPONENTI |
LINK D’ACQUISTO |
|---|---|
- |
Schema Elettrico
Procedure Sperimentali
Passo 1: Costruisci il circuito.
Passo 2: Apri il file del codice.
cd ~/raphael-kit/python-pi5
Passo 3: Esegui.
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.
Avvertimento
Se viene visualizzato l’errore RuntimeError: Cannot determine SOC peripheral base address, fare riferimento a If gpiozero doesn’t work..
Code
Nota
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.
#!/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
DigitalOutputDeviceeButtondalla libreriagpiozero, e la funzionesleepper i ritardi.#!/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 metodoreadscansiona la tastiera e restituisce un elenco di tasti premuti.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.
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
Keypadcon la configurazione specificata.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.
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