Ieri l’amico Luca Dentella ha pubblicato un articolo sulla shield Keypad LCD una shield molto interessante non solo per il display LCD ma sopratutto per la presenza dei pulsanti pre-cablati.
La Keypad LCD è disponibile su tanti siti, come lo stesso Luca riporta, io ne ho ordinata una subito dopo aver letto l’articolo.
Componenti della Keypad LCD
La shield è composta da un display LCD 16×2 alfanumerico e 5 pulsanti, ti invito a leggere l’articolo ben scritto da Luca sui componenti della shield:
Il modello che ho ordinato è prodotto dalla DFRobot e oltre ai connettori soliti presenta l’estensione dei pin A1-A5 con affiancati per ciascuno due pin uno connesso al polo positivo ed uno connesso al polo negativo:
la piedinatura aggiuntiva è molto interessante perché ti permette di collegare direttamente un sensore che necessiti di alimentazione, ad esempio un potenziometro da 10K che ha bisogno di +5v,Gnd e Segnale o i sensori infrarossi.
I pulsanti della KeypadLCD
Ciascun pulsante della Keypad LCD è collegato ad una resistenza in serie con quella del pulsante precedente, troverai questa scelta geniale perché in questo modo con un solo pin analogico (A0) puoi riconoscere la pressione di uno dei 5 pulsanti semplicemente leggendo il valore letto su tale pin dal DAC ( convertitore analogico digitale ) a 10Bit di arduino.
I valori che leggi sono compresi nei range seguenti:
- SELECT: tra 720 e 760
- LEFT: tra 480 e 520
- RIGHT: tra 0 e 20
- UP: tra 120 e 160
- DOWN: tra 300 e 350
I valori che ti ho riportato sono più larghi del valore reale letto, considera di lasciarti un po’ di margine dovuto alla differente costruzione della tua shield dovuta alle diverse tolleranze delle resistenze, del circuito e del costruttore, essendo tutte le keypad simili ma non identiche.
Conoscendo i valori di ciascun pulsante troverai semplice scrivere uno sketch che valuti il valore letto sul pin A0 e lo trasformi nella pressione di un pulsante, lo vediamo a breve.
L’LCD della Keypad
il display montato sulla keypad LCD è un comune 16×2 ( 16 colonne x 2 righe ) pre-cablato sui pin digitali corrispondenti ai pin arduino:
- RS sul pin 8
- EN sul pin 9
- D4 sul pin 4
- D5 sul pin 5
- D6 sul pin 6
- D7 sul pin 7
LiquidCrystal lcd(8,9,4,5,6,7);
Lo sketch di esempio o demo
Luca ha pubblicato uno sketch demo e ti consiglio di provarlo perché davvero interessante.
Io ho realizzato il mio personale sketch che testerò all’arrivo della keypad LCD shield:
#include <LiquidCrystal.h>
#define BUTTON A0
#define BACKLIGHT 10
int SELECT[] = {720,760};
int LEFT[] = {480,520};
int RIGTH[] = {0,20};
int UP[] = {120,160};
int DOWN[] = {300,350};
boolean blacklightStatus = false;
LiquidCrystal lcd(8,9,4,5,6,7);
void setup() {
Serial.begin( 9600 );
Serial.println("Avvio");
pinMode( BACKLIGHT,OUTPUT );
digitalWrite( BACKLIGHT,LOW );
lcd.begin(16, 2);
digitalWrite( BACKLIGHT,HIGH );
lcd.setCursor(0,0);
lcd.print("Keypad LCD test");
lcd.setCursor(0,1);
lcd.print("mauroalfieri.it");
}
void loop() {
lcd.setCursor(0,0);
lcd.print("Hai premuto:");
lcd.setCursor(0,1);
lcd.print( ctrlButton( analogRead( BUTTON ) ) );
}
int ctrlButton( int button ) {
if ( SELECT[0] <= button && button <= SELECT[1] ) { return 1; }
if ( LEFT[0] <= button && button <= LEFT[1] ) { return 2; }
if ( RIGTH[0] <= button && button <= RIGTH[1] ) { return 3; }
if ( UP[0] <= button && button <= UP[1] ) { return 4; }
if ( DOWN[0] <= button && button <= DOWN[1] ) { return 5; }
return 0;
}
non ho ancora avuto modo di provare questo sketch sulla keypad LCD ma lo farò presto, appena mi arriva.
Leggendo lo sketch incontri l’include della LiquidCrystal.h alla linea 1, libreria che ti servirà per gestire l’LCD;
linee 03-04: definisci due costanti l prima per indicare allo sketch che i pulsanti sono collegati al pin A0 e la seconda che indica allo sketch che l’LCD può essere oscurato inviando al pin 10 un valore PWM da 0 a 255;
il pin 10 è la prima volta, in questo articolo, che lo incontri ed è molto interessante perché ti permette di regolare l’intensità della retro illuminazione del display LCD consentendo al tuo progetto di spegnere l’LCD per risparmiare energia.
Linee 06-10: definisci 6 array di interi, ciascuno di due valori in cui la posizione 0 è il valore minimo del range che puoi leggere sul pin A0 per quel pulsante e la posizione 1 dell’array rappresenta il valore massimo, all’interno di ciascun range letto vuol dire che hai premuto il pulsante corrispondente.
Linee 12-13: definisci una variabile di stato per la retroilluminazione, non la userai in questo sketch, e inizializza la libreria LiquidCrystal con i pin a cui è collegato il display LCD;
linee 17-18: inizializza le comunicazioni con la porta seriale dell’IDE arduino;
linea 20: imposta il pin 10 come pin di tipo OUTPUT, è quello su cui invii il segnale digitale o PWM per regolare la retroilluminazione del display;
linea 22: imposta a LOW il valore del pin BLCKLIGHT, spegni il display;
linea 24: indica alla libreria LiquidCrystal che utilizzi un display 16 x 2;
linea 26: invia un segnale HIGH al pin BACKLIGHT e accendi il display per visualizzare il messaggio definito alle linee seguenti;
linee 27-30: imposta una stringa sulla linea 0 ed una sulla linea 1;
linee 36-37: scrivi sul display alla linea 0 partendo dalla posizione 0 il messaggio “Hai premuto:”;
linee 39-40: scrivi sul display alla linea 1 partendo dalla posizione 0 il valore del pulsante che hai premuto;
linea 44: è la funzione che discrimina il tasto che hai premuto e ti restituisce un valore da 1 a 5 alla pressione di un tasto, ogni valore corrisponde ad un tasto specifico, e restituisce 0 se non premi alcun tasto;
linea 46: valuta la pressione dei pulsanti, se il valore letto sul pin analogico A0 è compreso tra il min e max della variabile SELECT definita alla linea 06, dove min è il valore dell’array alla posizione 0 e max è il valore alla posizione 1. Se il valore letto è compreso in questo range, estremi inclusi, restituisce 1 che vuol dire: hai premuto: 1 sul display;
linee 47-50: eseguono il medesimo controllo della linea 46 per gli altri range attesi;
linea 52: se nessun pulsante viene premuto restituisce il valore 0;
Buon divertimento con la tua Keypad LCD.









3 comments
1 ping
IDRIS CESA
20 aprile 2013 a 15:39 (UTC 2) Link to this comment
Ciao Mauro, ho provato a creare i caratteri e stamparli su lcd . Fin qua tutto bene ,non riesco pero’ ad associare la variazione del potenziometro con le barre del grafico..
Sul libro “Arduino progetti e soluzioni ” ho trovato a pag.349 questo sketch.
#include
LiquidCrystal lcd(8, 9 ,4 ,5 ,6 , 7);
const int numRows = 2;
const int numCols = 16;
byte glyphs[8][8] = {
{B00000,B00000,B00000,B00000,B00000,B00000,B00000,B11111}, //0
{B00000,B00000,B00000,B00000,B00000,B00000,B11111,B11111}, //1
{B00000,B00000,B00000,B00000,B00000,B11111,B11111,B11111}, //2
{B00000,B00000,B00000,B00000,B11111,B11111,B11111,B11111}, //3
{B00000,B00000,B00000,B11111,B11111,B11111,B11111,B11111}, //4
{B00000,B00000,B11111,B11111,B11111,B11111,B11111,B11111}, //5
{B00000,B11111,B11111,B11111,B11111,B11111,B11111,B11111}, //6
{B11111,B11111,B11111,B11111,B11111,B11111,B11111,B11111}}; //7
void setup (){
lcd.begin(numCols, numRows);
lcd.setCursor(1,0);
for(int i=0; i < 8; i++)
lcd.createChar(i, glyphs[i]);
lcd.clear();
}
void loop(){
for ( byte i=0 ; i < 8; i++)
lcd.print(i);
delay(2000);
lcd.clear();
}
Potresti darci un'occhuata perche' il grafico non compare, al suo posto visualizzo una sequenza di numeri:
012345678
GRAZIE
Mauro Alfieri
21 aprile 2013 a 10:03 (UTC 2) Link to this comment
Ciao Idris,
non ho provato questo sketch ma ad occhio mi sembra che sia sbagliato il comando lcd.print(i) nella loop() prova a sostituirlo con lcd.write(i) come puoi leggere nei miei tutorial.
Mauro
IDRIS CESA
2 maggio 2013 a 22:03 (UTC 2) Link to this comment
Scusa se rispondo sol ora ! Provero’ senz ‘ altro ,grazie..
Keypad LCD versione 1.0 vs 1.1 - Mauro Alfieri Elettronica Robotica
10 giugno 2013 a 09:04 (UTC 2) Link to this comment
[...] già conosci la KeyPad LCD versione 1.0 da alcuni articoli che ho scritto sia di presentazione della shield sia per il progetto [...]