Sistema di input a 10 tasti basato su partitore resistivo, logica multi-tap stile T9, anteprima live su LCD 16×2 e comunicazione I2C tra due schede Arduino UNO.
Il progetto implementa un'interfaccia di inserimento testo completa distribuita su due schede Arduino interconnesse via bus I2C:
-
Arduino 1 (Master — Tastiera & Feedback LED):
- Legge 10 pulsanti fisici collegati a un singolo pin analogico (
A0) tramite una rete a partitore resistivo. - Riconosce la pressione, gestisce il debounce e la composizione dei caratteri in stile multi-tap T9 (con timeout di 1 secondo).
- Fornisce feedback visivo istantaneo tramite 3 LED di stato (Verde = lettere, Blu = numeri/comandi, Rosso = cancellazione).
- Invia comandi e caratteri in anteprima o definitivi all'Arduino Slave tramite protocollo testuale su bus I2C (
0x12).
- Legge 10 pulsanti fisici collegati a un singolo pin analogico (
-
Arduino 2 (Slave — Display LCD 16×2 & Feedback Sonoro):
- Riceve e decodifica i pacchetti I2C.
- Gestisce un display LCD 16×2 con buffer a scorrimento (auto-scroll) e indicatore della modalità attiva in basso a destra.
- Mostra l'anteprima live del carattere o comando prima della conferma definitiva.
- Genera feedback sonoro differenziato per ciascun tipo di azione tramite un buzzer passivo.
All'interno della cartella code/ sono disponibili due implementazioni complete del progetto, concepite per esigenze differenti:
code/
├── v1_async/ # Versione ad alte prestazioni (FSM non bloccante)
│ ├── arduino_1.ino # Master: FSM reattiva, millis(), struct Pending, LED asincroni
│ └── arduino_2.ino # Slave: Buffer LCD dinamico e buzzer a frequenze dedicate
└── v2_didattica/ # Versione didattica (lineare e commentata)
├── arduino_1.ino # Master: logica procedurale con delay(), commenti passo-passo
└── arduino_2.ino # Slave: gestione lineare semplificata dello schermo e toni
| Parametro | Versione 1 (v1_async) |
Versione 2 (v2_didattica) |
|---|---|---|
| Paradigma | Macchina a Stati Finiti (FSM) reattiva | Procedurale / Sequenziale |
| Gestione del Tempo | Completamente non bloccante (millis()) |
Bloccante con delay() mirati |
| Debounce | Digitale continuo non bloccante (DEBOUNCE_MS = 60ms) |
Ciclo di lettura con debounce a soglia temporale |
| Gestione Input | struct Pending con enumerazione PendingKind |
Variabili globali semplici (taps, curKey, mode) |
| Temporizzazione LED | Impulsi asincroni gestiti in background (pulseLed(), updateLedPulse()) |
Lampeggio sequenziale (flash() con delay(120)) |
| Feedback Sonoro | Frequenze audio differenziate (Lettere: 1600 Hz, Numeri: 1100 Hz, Speciali: 750 Hz, Delete: 320 Hz) | Tono unificato parametrico (beep(freq, dur)) |
| Leggibilità del Codice | Strutturato per progetti avanzati | Estremamente commentato, ideale per studio e didattica |
| Quando usarla? | Se devi estendere il progetto con altri sensori, task paralleli o cerchi massima reattività | Se stai imparando Arduino, per presentazioni scolastiche o laboratori |
[ Pressione Tasto ]
│
▼
Lettura ADC A0 (media su 8 campioni)
│
▼
Decodifica Tasto (confronto ±12 ADC)
│
▼
Logica Multi-Tap / Timeout / Modalità
│
├─────────────────────────────────┐
▼ ▼
LED Feedback (Master) Bus I2C (Slave 0x12)
(Verde / Blu / Rosso) (PREV|..., OUT|..., MODE|...)
│
▼
Aggiornamento LCD 16x2
+ Tono Buzzer
La comunicazione tra Master e Slave avviene inviando stringhe ASCII terminate dal carattere newline \n all'indirizzo 0x12:
| Messaggio | Descrizione |
|---|---|
MODE|abc / MODE|123 / MODE|+*- |
Imposta la modalità attiva sul display |
CAPS|1 / CAPS|0 |
Attiva o disattiva il flag maiuscola sul prossimo carattere |
PREV|CHAR|<c> |
Mostra il carattere <c> in anteprima prima del commit |
PREV|TEXT|<txt> |
Mostra un'etichetta in anteprima (es. SPC, MAI, DEL) |
PREV|NONE |
Rimuove l'anteprima corrente |
OUT|CHAR|<c> |
Conferma e scrive definitivamente il carattere <c> nel buffer LCD |
OUT|CMD|ENTER |
Esegue il comando di a capo con eventuale scorrimento riga |
OUT|CMD|BACK |
Cancella l'ultimo carattere inserito (Backspace) |
OUT|CMD|CAPS |
Segnala il cambio di stato per le maiuscole |
Il sistema supporta tre modalità di digitazione commutabili ciclicamente:
- Tasti 1–9: Digitazione multi-tap stile tastierino telefonico (T9):
1: a, b, c2: d, e, f3: g, h, i4: j, k, l5: m, n, o6: p, q, r7: s, t, u8: v, w, x9: y, z
- Tasto 10: Passa alla modalità
123.
- Tasti 1–9: Inserimento diretto delle cifre
1..9. - Tasto 10 (singolo tap): Inserisce la cifra
0. - Tasto 10 (doppio tap rapido): Passa alla modalità
+*-.
- Tasto 1: Spazio (
SPC) - Tasto 2: Punto (
.) - Tasto 3: Virgola (
,) - Tasto 4: Invio / A capo (
ENTER) - Tasto 5: Maiuscola prossimo carattere (
CAPS) - Tasto 6: Backspace / Cancella (
BACK) - Tasto 7: Punto interrogativo (
?) - Tasto 8: Punto esclamativo (
!) - Tasto 9: Trattino (
-) - Tasto 10: Torna alla modalità
abc.
| Componente | Pin Arduino Uno | Note |
|---|---|---|
| Partitore resistivo 10 tasti | A0 |
Lettura analogica |
| LED Rosso | Pin 4 |
Feedback cancellazione |
| LED Blu | Pin 5 |
Feedback numeri / modalità |
| LED Verde | Pin 6 |
Feedback lettere |
| I2C SDA | Pin A4 |
Linea dati I2C |
| I2C SCL | Pin A5 |
Linea clock I2C |
| Componente | Pin Arduino Uno | Note |
|---|---|---|
| LCD RS | Pin 7 |
Controllo LCD |
| LCD EN | Pin 6 |
Abilitazione LCD |
| LCD D4 – D7 | Pin 5, 4, 3, 2 |
Bus dati parallelo a 4 bit |
| Buzzer Passivo | Pin 8 |
Segnale acustico PWM/tono |
| I2C SDA | Pin A4 |
Connessione verso Master |
| I2C SCL | Pin A5 |
Connessione verso Master |
Important
Collega insieme i pin GND delle due schede per garantire il riferimento di massa comune sul bus I2C. Sono consigliate due resistenze di pull-up da 4.7 kΩ su SDA e SCL.
I valori attesi per il partitore resistivo a 10 tasti sono:
const int expectedValues[10] = {
990, 985, 969, 958, 945, 930, 913, 890, 867, 839
};La tolleranza configurata è di ±12 unità ADC. Se utilizzi resistenze con tolleranze differenti, puoi leggere i valori effettivi tramite analogRead(A0) visualizzandoli sul Monitor Seriale e aggiornare l'array nei rispettivi file arduino_1.ino.
- Apri l'Arduino IDE.
- Scegli la versione desiderata (
code/v1_async/ocode/v2_didattica/). - Carica prima
arduino_2.inosulla scheda Slave (Arduino 2), così il listener I2C sarà attivo e pronto all'avvio. - Carica
arduino_1.inosulla scheda Master (Arduino 1). - Verifica i collegamenti I2C (
A4conA4,A5conA5,GNDconGND) e alimenta le schede.
Wire.h(inclusa nel core Arduino per il bus I2C)LiquidCrystal.h(inclusa nel core Arduino per display LCD paralleli)
Progetto realizzato da Andreito08
🔗 GitHub Profile
Distribuito sotto licenza MIT. Consulta il file LICENSE per i dettagli.
