+ All Categories
Home > Documents > KeyPad LCD Shield ( blue ) 20: imposta il pin 10 come pin di tipo OUTPUT, è quello su cui invii il...

KeyPad LCD Shield ( blue ) 20: imposta il pin 10 come pin di tipo OUTPUT, è quello su cui invii il...

Date post: 18-Feb-2019
Category:
Upload: vudat
View: 226 times
Download: 0 times
Share this document with a friend
7
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 &gt; 1000) return btnNONE; if (adc_key_in &lt; 50) return btnRIGHT; if (adc_key_in &lt; 195) return btnUP; if (adc_key_in &lt; 380) return btnDOWN; if (adc_key_in &lt; 555) return btnLEFT; if (adc_key_in &lt; 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;
Transcript

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 &gt; 1000) return btnNONE; if (adc_key_in &lt; 50) return btnRIGHT; if (adc_key_in &lt; 195) return btnUP; if (adc_key_in &lt; 380) return btnDOWN; if (adc_key_in &lt; 555) return btnLEFT; if (adc_key_in &lt; 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 5int 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 10int 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 adun 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 A1-A5 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 ilvalore 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 esempioAnalogReadSerial

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 PULSANTIint CLICK; // VARIABILE DI GESTIONE DEI PULSANTIunsigned long STARTINGTIMELCD; // GESTIONE TIMEOUT LCDconst 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 break; case 2: lcd.print("HAI PREMUTO Su "); // SCRIVO SU LCD break; case 3: lcd.print("HAI PREMUTO Giu' "); // SCRIVO SU LCD break; case 4: lcd.print("HAI PREMUTO Sx "); // SCRIVO SU LCD break; case 5: lcd.print("HAI PREMUTO Slct"); // SCRIVO SU LCD break; } // 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 PULSANTIint 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


Recommended