Progetto #64 • Arduino intermedio

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.

Difficoltà ★★☆☆☆ Facile
Tempo 25–30 minuti
Concetti Keypad • LCD • I2C

🚀 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:

🔐 Sistemi di accesso
🎛️ Pannelli di controllo
📋 Menu interattivi
🏠 Sistemi domotici
Obiettivo: premere un tasto sul keypad 4×4 e visualizzarlo direttamente su un display LCD 16×2.

🎯 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

1× Arduino UNO o compatibile
1× display LCD 16×2
1× modulo I2C per LCD
1× tastierino 4×4
1× breadboard
Cavi jumper

🛒 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
Schema Arduino tastierino 4x4 con display LCD 16x2 I2C
Nota: il progetto originale utilizza SDA su A4, SCL su A5 e il keypad sui pin digitali 2–9. :contentReference[oaicite:1]{index=1}

📚 Librerie necessarie

Per compilare il programma servono due librerie principali.

Keypad
Permette di leggere facilmente il tastierino 4×4.
LiquidCrystal_I2C
Permette di controllare il display LCD tramite bus I2C.

Apri Arduino IDE e vai su:

Sketch → Include Library → Manage Libraries

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 4×4 + LCD I2C
// ============================================
// 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.

Concetto importante: il keypad è una matrice composta da quattro righe e quattro colonne. Arduino individua il tasto controllando quale riga e quale colonna risultano collegate durante la pressione.

⌨️ 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:

16 colonne
Da 0 a 15
2 righe
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:

7

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.

Nota: per interfacce più avanzate conviene evitare di chiamare continuamente lcd.clear(), perché può causare un piccolo effetto di lampeggiamento. In questo progetto, però, viene eseguito solo alla pressione di un nuovo tasto ed è perfettamente adatto allo scopo.

🔍 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
Se il display si illumina ma non mostra testo, oltre a controllare i collegamenti prova a verificare l’indirizzo I2C tramite uno sketch I2C Scanner.

🔧 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.

Display acceso ma testo invisibile?
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:

1 → 12 → 123 → 1234

Questa sarà la base perfetta per creare:

🔐 Inserimento password
🔢 Inserimento numeri
📋 Menu di configurazione
🧮 Piccola calcolatrice

⭐ 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ì:

Digita valore → premi # → conferma

È 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.

A
Menu
B
Indietro
C
Conferma
D
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.

Questo progetto è quindi una vera base per creare pannelli di controllo Arduino.

🔐 Password con display

Un’evoluzione naturale consiste nell’unire questo progetto al sistema password.

Il display potrebbe mostrare:

Inserisci PIN:
****

e successivamente:

ACCESSO OK
PIN ERRATO

Anche la pagina originale individua il sistema password con display come una possibile evoluzione del progetto. :contentReference[oaicite:4]{index=4}

⚠️ Problemi comuni

LCD completamente spento
Controlla VCC e GND.
LCD acceso ma senza testo
Controlla contrasto e indirizzo I2C.
Tasti sbagliati
Verifica l’ordine di righe e colonne.
Nessun tasto rilevato
Controlla i collegamenti dei pin 2–9.
Errore Keypad.h
Installa la libreria Keypad.
Errore LiquidCrystal_I2C.h
Installa una libreria compatibile LiquidCrystal_I2C.

🔄 Varianti possibili

🔐 Password con display
Mostra gli asterischi del PIN direttamente sul LCD.
📋 Menu interattivo
Usa il keypad per navigare tra diverse funzioni.
⚙️ Configurazione parametri
Inserisci valori e impostazioni.
🧮 Calcolatrice
Utilizza numeri e operatori.
🌡️ Pannello sensori
Seleziona quale sensore visualizzare.
🏠 Domotica
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.