Tastierino 4×4 con display LCD 16×2 I2C
Creiamo una semplice interfaccia utente: premiamo un tasto sul keypad e Arduino lo visualizza direttamente sul display LCD.
🚀 Introduzione
In questo progetto utilizzeremo un display LCD 16×2 con interfaccia I2C insieme a un tastierino numerico 4×4.
Il tastierino sarà il nostro dispositivo di input: ogni volta che l’utente preme un tasto, Arduino rileva il carattere corrispondente.
Il display LCD sarà invece il dispositivo di output e mostrerà immediatamente il tasto premuto.
Questo tipo di interfaccia è alla base di moltissimi dispositivi elettronici:
🎯 Cosa imparerai
- come collegare un tastierino 4×4 ad Arduino;
- come utilizzare un display LCD 16×2 con modulo I2C;
- come utilizzare contemporaneamente due periferiche;
- come leggere un tasto tramite keypad.getKey();
- come visualizzare caratteri tramite lcd.print();
- come posizionare il cursore con lcd.setCursor();
- come creare una semplice interfaccia input/output.
🧰 Materiale necessario
🛒 Non hai ancora i componenti?
Un kit Arduino per principianti contiene spesso display, tastierini, sensori, LED, resistenze e breadboard utili per realizzare molti dei progetti presenti sul sito.
Kit Arduino consigliato → Link di affiliazione Amazon: in qualità di Affiliato Amazon ricevo un guadagno dagli acquisti idonei, senza alcun costo aggiuntivo per te.📘 Vuoi imparare Arduino passo dopo passo?
Nei miei libri trovi spiegazioni semplici, schemi chiari e numerosi progetti pratici dedicati ad Arduino.
Scopri i miei libri → Link di affiliazione Amazon: in qualità di Affiliato Amazon ricevo un guadagno dagli acquisti idonei, senza alcun costo aggiuntivo per te.🔌 Schema di collegamento
Display LCD 16×2 con modulo I2C
Grazie al modulo I2C possiamo controllare il display utilizzando soltanto quattro collegamenti.
| LCD I2C | Arduino UNO |
|---|---|
| VCC | 5V |
| GND | GND |
| SDA | A4 |
| SCL | A5 |
Tastierino 4×4
| Keypad | Arduino UNO |
|---|---|
| Pin 1 | Pin 9 |
| Pin 2 | Pin 8 |
| Pin 3 | Pin 7 |
| Pin 4 | Pin 6 |
| Pin 5 | Pin 5 |
| Pin 6 | Pin 4 |
| Pin 7 | Pin 3 |
| Pin 8 | Pin 2 |
📚 Librerie necessarie
Per compilare il programma servono due librerie principali.
Permette di leggere facilmente il tastierino 4×4.
Permette di controllare il display LCD tramite bus I2C.
Apri Arduino IDE e vai su:
Cerca quindi le librerie Keypad e LiquidCrystal_I2C, che sono le stesse previste nella pagina originale. :contentReference[oaicite:2]{index=2}
💻 Codice Arduino completo
// ============================================
// Progetto #64
// Tastierino 4x4 + Display LCD 16x2 I2C
//
// Mostra sul display il tasto premuto
// ============================================
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
// ============================================
// Configurazione display LCD
// ============================================
// Indirizzo I2C tipico: 0x27
// Display: 16 colonne, 2 righe
LiquidCrystal_I2C lcd(0x27, 16, 2);
// ============================================
// Configurazione tastierino 4x4
// ============================================
const byte ROWS = 4;
const byte COLS = 4;
const char keys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
// Pin collegati alle righe
const byte rowPins[ROWS] = {
9,
8,
7,
6
};
// Pin collegati alle colonne
const byte colPins[COLS] = {
5,
4,
3,
2
};
Keypad keypad = Keypad(
makeKeymap(keys),
rowPins,
colPins,
ROWS,
COLS
);
// ============================================
// Setup
// ============================================
void setup() {
// Inizializza LCD
lcd.init();
// Accende retroilluminazione
lcd.backlight();
// Messaggio iniziale
lcd.setCursor(0, 0);
lcd.print("Premi un tasto");
lcd.setCursor(0, 1);
lcd.print("Keypad pronto");
}
// ============================================
// Loop principale
// ============================================
void loop() {
// Legge il tastierino
char key = keypad.getKey();
// Se è stato premuto un tasto
if (key != NO_KEY) {
// Cancella il display
lcd.clear();
// Prima riga
lcd.setCursor(0, 0);
lcd.print("Tasto premuto:");
// Seconda riga
lcd.setCursor(0, 1);
lcd.print(key);
}
}
⚙️ Come funziona il programma
Il programma utilizza contemporaneamente tre librerie:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
Wire gestisce la comunicazione I2C, LiquidCrystal_I2C controlla il display e Keypad legge i tasti.
🔢 La mappa del tastierino
La disposizione fisica dei tasti viene descritta da questa matrice:
const char keys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
Ogni posizione della matrice corrisponde a un tasto reale del keypad.
⌨️ Leggere il tasto premuto
La funzione fondamentale è:
char key = keypad.getKey();
Se nessun tasto è premuto, la libreria restituisce:
NO_KEY
Per questo utilizziamo:
if (key != NO_KEY)
Il codice all’interno della condizione viene quindi eseguito solo quando l’utente preme realmente un tasto.
📟 Inizializzare il display
Nel setup() utilizziamo:
lcd.init();
lcd.backlight();
lcd.init() inizializza il display mentre lcd.backlight() accende la retroilluminazione.
📍 Posizionare il cursore
Il display LCD 16×2 possiede:
Da 0 a 15
Riga 0 e riga 1
Per scegliere dove scrivere utilizziamo:
lcd.setCursor(colonna, riga);
Per esempio:
lcd.setCursor(0, 1);
posiziona il cursore sulla prima colonna della seconda riga.
🖨️ Visualizzare il carattere
Quando viene rilevato un tasto eseguiamo:
lcd.print(key);
Se premiamo:
il display mostrerà:
Tasto premuto:
7
Questo è lo stesso principio della pagina originale, che legge il keypad tramite getKey() e stampa il carattere sul display. :contentReference[oaicite:3]{index=3}
🧹 Perché usiamo lcd.clear()
Prima di visualizzare un nuovo carattere eseguiamo:
lcd.clear();
Questo cancella il contenuto precedente e impedisce che rimangano caratteri vecchi sul display.
🔍 Se il display non mostra nulla
Uno dei problemi più frequenti con i display I2C riguarda l’indirizzo.
Nel codice utilizziamo:
LiquidCrystal_I2C lcd(0x27, 16, 2);
0x27 è molto comune, ma alcuni moduli utilizzano un indirizzo diverso, per esempio:
0x3F
🔧 Regolare il contrasto
Sul modulo I2C del display è generalmente presente un piccolo trimmer.
Se la retroilluminazione funziona ma non vedi i caratteri, prova a ruotarlo lentamente con un piccolo cacciavite.
Prima di modificare il codice, controlla il contrasto.
🔄 Visualizzare più caratteri
Nel progetto base mostriamo soltanto l’ultimo tasto premuto.
Ma possiamo modificare il programma per costruire una sequenza, per esempio:
Questa sarà la base perfetta per creare:
⭐ Usare * per cancellare
Possiamo assegnare al tasto * la funzione di cancellazione.
Per esempio:
if (key == '*') {
lcd.clear();
}
In questo modo il tastierino inizia a comportarsi come una vera interfaccia utente.
#️⃣ Usare # per confermare
Il tasto # può essere utilizzato come pulsante di conferma.
Una futura interfaccia potrebbe funzionare così:
È la stessa logica che abbiamo già utilizzato nei progetti dedicati alla password.
🅰️ Usare i tasti A, B, C e D
I quattro tasti laterali possono diventare comandi speciali.
Menu
Indietro
Conferma
Impostazioni
Questo rende il keypad molto più interessante di un semplice tastierino numerico.
📋 Creare un menu interattivo
Il display può mostrare diverse opzioni:
1. Temperatura
2. Umidita
3. Impostazioni
L’utente può scegliere una funzione premendo il numero corrispondente.
🔐 Password con display
Un’evoluzione naturale consiste nell’unire questo progetto al sistema password.
Il display potrebbe mostrare:
Inserisci PIN:
****
e successivamente:
Anche la pagina originale individua il sistema password con display come una possibile evoluzione del progetto. :contentReference[oaicite:4]{index=4}
⚠️ Problemi comuni
Controlla VCC e GND.
Controlla contrasto e indirizzo I2C.
Verifica l’ordine di righe e colonne.
Controlla i collegamenti dei pin 2–9.
Installa la libreria Keypad.
Installa una libreria compatibile LiquidCrystal_I2C.
🔄 Varianti possibili
Mostra gli asterischi del PIN direttamente sul LCD.
Usa il keypad per navigare tra diverse funzioni.
Inserisci valori e impostazioni.
Utilizza numeri e operatori.
Seleziona quale sensore visualizzare.
Controlla relè e dispositivi da un menu.
🧠 Cosa impari con questo progetto
- come utilizzare contemporaneamente keypad e display LCD;
- come gestire input e output in un unico programma;
- come utilizzare la comunicazione I2C;
- come leggere una matrice 4×4;
- come visualizzare dati dinamici;
- come organizzare una semplice interfaccia utente;
- come preparare la base per menu e sistemi di configurazione.
✅ Cosa devi ricordare
- il display LCD I2C utilizza SDA e SCL;
- su Arduino UNO SDA corrisponde ad A4;
- su Arduino UNO SCL corrisponde ad A5;
- il keypad utilizza quattro righe e quattro colonne;
- i pin utilizzati dal keypad sono 2–9;
- keypad.getKey() restituisce il tasto premuto;
- lcd.setCursor() sceglie dove scrivere;
- lcd.print() mostra il carattere;
- l’indirizzo LCD più comune è 0x27, ma può variare;
- questo progetto è la base per menu, password e pannelli di controllo.

