KeyPad LCD Shield ( blue ) https://www.dfrobot.com/wiki/index.php/arduino_lcd_keypad_shield_(sku:_dfr0009) LCD alfanumerico 16 2 (16 caratteri per due righe) e una piccola tastiera composta da 5 pulsanti, siglati UP / DOWN / LEFT / RIGHT e SELECT. E possibile pilotare il display LCD utilizzando la libreria LiquidCrystal prestando attenzione ad indicare i corretti collegamenti: #include <LiquidCrystal.h> LiquidCrystal lcd(8, 9, 4, 5, 6, 7); Per evitare di utilizzare troppi PIN, tutti i pulsanti sono collegati ad un unico PIN di input analogico di Arduino, secondo il seguente schema: Leggendo il valore di tensione presente sul PIN AD0 è quindi possibile capire quale pulsante è stato premuto: int read_buttons() { int adc_key_in = analogread(0); if (adc_key_in > 1000) return btnnone; if (adc_key_in < 50) return btnright; if (adc_key_in < 195) return btnup; if (adc_key_in < 380) return btndown; if (adc_key_in < 555) return btnleft; if (adc_key_in < 790) return btnselect; Esempio 1 : #include <LiquidCrystal.h> LiquidCrystal lcd(8, 9, 4, 5, 6, 7); #defne btnright 0 #defne btnup 1 #defne btndown 2 #defne btnleft 3 #defne btnselect 4 #defne btnnone 5 int read_buttons() { int adc_key_in = analogread(0); if (adc_key_in > 1000) return btnnone; if (adc_key_in < 50) return btnright; if (adc_key_in < 195) return btnup; if (adc_key_in < 380) return btndown; if (adc_key_in < 555) return btnleft;
if (adc_key_in < 790) return btnselect; void setup() { lcd.begin(16, 2); lcd.setcursor(0,0); lcd.print("keypad demo"); void loop() { lcd.setcursor(0,1); lcd.print("pressed:"); int buttons = read_buttons(); lcd.setcursor(9, 1); if(buttons == btnright) lcd.print("right "); else if(buttons == btnleft) lcd.print("left "); else if(buttons == btnup) lcd.print("up "); else if(buttons == btndown) lcd.print("down "); else if(buttons == btnselect) lcd.print("select"); else if(buttons == btnnone) lcd.print("none "); E' inoltre presente l estensione dei pin A1-A5 con afancati per ciascuno due pin: uno connesso al polo positivo ed uno connesso al polo negativo: La piedinatura aggiuntiva permette di collegare un sensore che necessiti di alimentazione, ad esempio un potenziometro da 10K che necessita 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, così con un solo pin analogico (A0) si può riconoscere la pressione di uno dei 5 pulsanti dal valore letto su tale pin dal DAC a 10Bit di arduino. I valori letti saranno 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 riportati sono più abbondanti del valore reale letto, ciò è dovuto alla diferente costruzione degli shield e dalle olleranze delle resistenze. Scrivere uno sketch che valuti il valore letto sul pin A0 e lo trasformi nella pressione di un pulsante. LCD della Keypad il display montato sulla keypad LCD è un 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 Nella keypad LCD ciascun pin di segnale Data ( Dx ) è collegato al pin di uguale numero di Arduino.
A cosa serve conoscere questi dati? Semplice a inizializzare la classeliquidcrystal con la seguente linea: LiquidCrystal lcd(8,9,4,5,6,7); Esempio2 #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; include della LiquidCrystal.h (libreria che 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 permette di regolare l intensità della retro illuminazione del display LCD consentendoti di spegnere l LCD. 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. Se i valori letti sulla tua keypad LCD per ciascun pulsante sono diferenti,modificare i valori di min e max corrispondenti. 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; Keypad LCD version 1.0 vs 1.1 Le due KeyPad LCD sono apparentemente uguali, e nel caso queste diferenze comportano il malfunzionamento, sono diferenti in : il modello dei pulsanti la disposizione dei contatti del connettore A1-A5 i valori di resistenza letti da arduino quando premi i pulsanti Il modello dei pulsanti della keypad LCD versione 1.0 e 1.1 La versione 1.0 presenta tutti i 6 pulsanti delle medesime dimensioni, mentre la versione 1.1 ha il tasto reset di colore diferente e altezza inferiore: La disposizione dei contatti della keypad LCD La keypad lcd versione 1.0 e versione 1.1 è la presenza di una fila di contatti in prossimità degli ingressi analogici Arduino in cui per ciascun pin A1A5 trovi i contatti Gnd e +5v abbinati, se vuoi collegare ad esempio sensori a 3 fili ( potenziometri, sensori ottici, pulsanti, ecc ) Tra le due verioni della keypad lcd diferisce la disposizione dei pin +5v e Gnd. In figura la versione 1.0 ( sinistra ) presenta il terminale Gnd centrale ed il positivo in alto, mentre la vesione 1.1 ( destra ) presenta il polo +5v al centro ed il Gnd in alto. Il pin di segnale ( bleu ) è sempre nella medesima posizione. I valori di resistenza letti da arduino Tra le diferenze principali delle due versioni è il cambio dei valori letti da arduino alla pressione di ciascun pulsante. Se lato arduino ti aspetti che la pressione del pulsante SELECT ti restituisca valore 816 ( versione 1.0 ) il tuo sketch non funzionerà se la keypad lcd è la versione 1.1 in quanto il valore restituito dal pulsante SELECT è 506. Per comprendere i valori prima di inserirli nel to progetto usare lo sketch fornito con l IDE arduino AnalogReadSerial che scrive sul monitor seriale il valore letto sul pin A0 a cui sono collegati tutti i pulsanti della keypad lcd versione 1.0
Sketch di test dei valori /* ecco lo sketch di esempio AnalogReadSerial Reads an analog input on pin 0, prints the result to the serial monitor. Attach the center pin of a potentiometer to pin A0, and the outside pins to +5V and ground. This example code is in the public domain. */ // the setup routine runs once when you press reset: void setup() { // initialize serial communication at 9600 bits per second: Serial.begin(9600); // the loop routine runs over and over again forever: void loop() { // read the input on analog pin 0: int sensorvalue = analogread(a0); // print out the value you read: Serial.println(sensorValue); delay(100); // delay in between reads for stability l esempio non fa altro che stabilire un canale di comunicazione seriale alla linea 12 e scriverci su il risultato del valore letto alla linea 18 sul pin A0 con il comando analogread(a0)
/* Esempio 3 LCD Keypad Shield */ #include <LiquidCrystal.h> // LIBRERIA PER UTILIZZO LCD
#define BACKLIGHT 10 // PIN DIGITALE PER CONTROLLO RETROILLUMINAZIONE int BUTTON; // VARIABILE DI GESTIONE DEI PULSANTI int CLICK; // VARIABILE DI GESTIONE DEI PULSANTI unsigned long STARTINGTIMELCD; // GESTIONE TIMEOUT LCD const unsigned long TIMEOUTLCD = 2000; // GESTIONE TIMEOUT LCD (2000Ms = 2 Sec) // INIZIALIZZO LA LIBRERIA CON I RELATIVI PIN LiquidCrystal lcd(8, 9, 4, 5, 6, 7); void setup() { // IMPOSTAZIONI DI STARTUP DEL KEYPAD LCD pinmode(backlight, OUTPUT); // SET DEL PIN DELLA RETRIULLUMINAZIONE digitalwrite(backlight, LOW); // SPENGO RETROILLUMINAZIONE lcd.begin(16, 2); // INIZIALIZZO LCD, 16 (DA 0 A 15) CARATTERI PER 2 RIGHE (0 e 1) lcd.setcursor(0, 0); // MI POSIZIONE SUL DISPLAY lcd.print("dom.spicciola.it"); // SCRIVO UN MESSAGGIO lcd.nodisplay(); // SPENGO LCD void loop() { // GESTIONE TIMEOUT: DOPO 2 SECONDI DALL' ACCENSIONE SPENGO LCD if ((millis() - STARTINGTIMELCD) > TIMEOUTLCD) { digitalwrite(backlight, LOW); // SPENGO LA RETROILLUMINAZIONE lcd.nodisplay(); // SPENGO LCD // GESTIONE AZIONI A SEGUITO PRESSIONE DEI PULSANTI BUTTON = ctrlbutton(click); // ASSEGNO ALLA VARIABILE BUTTON IL VALORE PASSATO DALLA ROUTINE lcd.setcursor(0, 1); // INDICO DI INIZIARE A SCRIVERE AL CARATTERE 0 DELLA RIGA 1 if (BUTTON!= 0) {// VERIFICO SE E' STATO PREMUTO UN PULSANTE STARTINGTIMELCD = millis(); // IMPOSTO IL CLOCK PER IL TIMEOUT switch (BUTTON) { case 1: lcd.print("hai PREMUTO Dx "); // SCRIVO SU LCD case 2: lcd.print("hai PREMUTO Su "); // SCRIVO SU LCD case 3: lcd.print("hai PREMUTO Giu' "); // SCRIVO SU LCD case 4: lcd.print("hai PREMUTO Sx "); // SCRIVO SU LCD case 5: lcd.print("hai PREMUTO Slct"); // SCRIVO SU LCD // SE E' STATO PREMUTO UN PULSANTE ACCENDO RETROILLUMINZIONE E LCD if (BUTTON!= 0) { // VERIFICO SE E' STATO PREMUTO UN PULSANTE digitalwrite(backlight, HIGH); // ACCENDO LA RETROILLUMINAZIONE lcd.display(); // ACCENDO LCD STARTINGTIMELCD = millis(); // INIZIO TIMEOUT PER RETROILLUMINAZIONE // ROUTINE DI CONTROLLO PRESSIONE PULSANTI int ctrlbutton(int CLICK) { int x; x = analogread (0); // leggo il valore del pin analogico 0 if (x < 60) { return 1; else if (x < 200) { return 2; else if (x < 400) { return 3; else if (x < 600) { return 4; else if (x < 800) { return 5; return 0; https://diyhacking.com/arduino-keyless-door-lock-system-keypad-lcd/ http://www.hackshed.co.uk/arduino-lcd-keypad-shield-basic-menu-system/ https://www.hackster.io/vandenbrande/arduino-lcd-1602a-keypad-lcd-shield-relay-control-d636a1