Вы находитесь на странице: 1из 8

Teclado + LCD

Ha llegado otro accesorio, el LCD Shield. En un principio pens en comprar un LCD


simplemente, soldar las patillas y usarlo as. Pero encontr ste en Ebay por 1 ms, y me dio
el ataque de vaguera. Total, ste es pinchar y funcionar. Adems, trae 5 botones
completamente funcionales (ms el sexto que es para resetear). Problema: si usas un Arduino
UNO
te
quedas
sin
pines
para
nada
ms.
Pero como por suerte, ya me lleg en su da el Arduino MEGA, puedo usar el LCD en conjunto
con otras cosas, como el Keypad del que hablamos en la anterior entrada (Teclado matricial 16
teclas o
Keypad).
ste shield LCD, que como digo es pinchar y listo, tiene un potenciometro (en la foto, arriba a
la izquierda, de azul) para ajustar el contraste (fondo azul, letras blancas, en mi caso). Y sirve
perfectamente el cdigo de la biblioteca de Arduino LiquidCrystal. La nica modificacin, es
cambiar
los
pines
a
los
que
va
conectado
//extracto del cdigo original de la web de Arduino, con los pines ya
modificados
#include
<LiquidCrystal.h>
LiquidCrystal
const int analogInPin = A0; //entrada
int
sensorValue

de

lcd(8,9,4,5,6,7);
los botones del keypad
=
0;

Bueno, hoy voy a mezclar sto con el keypad, para montar una simulacin de alarma con
Arduino. Aprovechando que el LCD tiene un botn que reinicia el conjunto, el estado inicial al
encender la alarma ser activada, y al introducir una clave, si es correcta, se desactivar.

El cdigo de hoy ya va ganando complejidad, puesto que hoy introducimos las funciones, que
son algo as como pequeos programas dentro del programa "global", que cumple una
determinada misin, y que se puede llamar cuantas veces se quiera.

#include
#include
#include
const
const
//definimos
char

<Keypad.h>
<Password.h>
<LiquidCrystal.h>
byte
byte

FILAS=4;
COLS=4;
el

//cuatro
//cuatro

filas
columnas
keymap
keys[FILAS][COLS]={
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}

};
//conectar los pines FILA0,FILA1,FILA2,FILA3 a estos pins de arduino MEGA
byte
rowPins[FILAS]={39,41,43,45};
//conectar los pines COL0, COL1, COL2, COL3 a estos pins de arduino
byte
colPins[COLS]={47,49,51,53};
//crear
el
keypad
Keypad keypad = Keypad(makeKeymap(keys),rowPins,colPins, FILAS, COLS);
#define
#define

ledpinVerde
ledpinRojo

31
33

//crear
el
password
para
la
alarma
Password
password=Password("1234");
LiquidCrystal
lcd(8,9,4,5,6,7);
const int analogInPin = A0; //entrada de los botones del keypad
int
sensorValue
=
0;
int
activada=0;
void

setup(){

Serial.begin(9600);
lcd.begin(16,2);
lcd.print("ALARMA
ACTIVADA");
activada=1;
lcd.setCursor(0,2);
lcd.print("Intro
codigo");
keypad.addEventListener(keypadEvent); //aadimos un evento de escucha
para
este
keypad
}
void

loop(){
keypad.getKey();
//funcion que este leyendo de la entrada analogica de la ldr y si
salta
estando
activada,
mete
un
delay
de
30seg
y
suena
}
//FUNCION
void

PARA

COMPROBAR
SI
SE
keypadEvent(KeypadEvent

case
case

'A':
'B':
default:

PULSA

EL

KEYPAD
eKey){
switch(keypad.getState()){
case
PRESSED:
limpiarlinea();
lcd.setCursor(0,2);
lcd.print("Codigo:");
lcd.print(eKey);
delay(10);
switch(eKey){
checkPassword();
delay(1);
break;
password.reset();
delay(1);
break;
password.append(eKey);
delay(1);
}
}

}
//FUNCION
void

DE

//si

//AQUI

el

HAY

COMPROBACION

LA

CONTRASEA
checkPassword(){

if(password.evaluate()){
activa
la
alarma
limpiarlinea();
lcd.setCursor(0,2);
lcd.print("Correcto");
PONER LO QUE ACTIVE O DESACTIVE LA ALARMA
password.reset();
limpiartodo();
lcd.setCursor(0,0);
lcd.print("ALARMA
INACTIVA");
activada=0;
delay(10);
}

password

QUE

DE

es

correcto,

else
{
limpiarlinea();
lcd.setCursor(0,2);
lcd.print("INCORRECTO");

password.reset();
delay(10);
}

}
//FUNCION
void

PARA

LIMPIAR

LA

PRIMERA

for(int
lcd.print("

LINEA

DEL
LCD
limpiarlinea(){
lcd.setCursor(0,2);
i=0;i<16;i++){
");
}

}
//FUNCION
void

PARA

LIMPIAR

TODO

for(int
lcd.print("
for(int

lcd.print("

EL
LCD
limpiartodo(){
lcd.setCursor(0,1);
i=0;i<16;i++){
");}
lcd.setCursor(0,2);
i=0;i<16;i++){
");}

Teclado matricial de 16 teclas (O keypad)

Nueva adquisicin: teclado matricial de 16 caracteres , gestionado por 8 pines (4 filas x 4


columnas). Y sto para qu? Pues para muchas cosas, montar una alarma, manejar un
sistema domtico (dcese de un sistema para manejar los aparatos domsticos de forma
centralizada o incluso programada o a distancia), introducir valores de prueba a un circuito...

Bueno, y sto como se maneja? Pues en Arduino, la forma ms sencilla, es conectar cada
patilla a un pin de entrada, usando un total de 8, y mediante la librera Keypad, y un sencillo
cdigo, que el Arduino detecte qu tecla se ha pulsado. Como veremos a continuacin, la
distribucin de las teclas se introduce en una matriz en el cdigo, los pines donde se han
conectado las filas y columnas se introducen en un array (una variable de programacin que
es algo as como un listado ordenado) y luego la librera Keypad se encarga de interpretar las
pulsaciones.
#include <Keypad.h>
const byte FILAS=4; //cuatro filas
const byte COLS=4; //cuatro columnas
//definimos el keymap
char keys[FILAS][COLS]={
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
//conectar los pines FILA0,FILA1,FILA2,FILA3 a estos pins de arduino MEGA
byte rowPins[FILAS]={39,41,43,45};
//conectar los pines COL0, COL1, COL2, COL3 a estos pins de arduino
byte colPins[COLS]={47,49,51,53};
//crear el keypad
Keypad keypad = Keypad(makeKeymap(keys),rowPins,colPins, FILAS, COLS);
void loop(){
keypad.getKey();
//funcin que este leyendo de la entrada analogica de la ldr y si
salta estando activada, mete un delay de 30seg y suena
}

Los pines usados se corresponden a un Arduino MEGA (mi ltima adquisicin), con 54 pines
E/S digitales.
PROBLEMAS INICIALES:
Cuando conectas todas las patillas del keypad seguidas, te encuentras con el primer
problema: cual es cual?
En mi caso, la solucin ha sido aadir un Serial.print(Keypad); en el loop e ir pulsando
cada tecla, de modo que iba viendo cual era cual y poniendolo en una tabla. Al final me di

cuenta de que lo estaba conectando al revs, y solo tuve que cambiar el orden de los pines en
los arrays COLS y FILAS.
Y si no tienes pines suficientes en el Arduino?
Si no usas un MEGA, lo ms probable es que no tengas pines suficientes, y entonces te viene
el problema de cmo ahorrar pines. Bien, pues puedes usar 1 slo pin analgico para leer
todos los valores del keypad. Cmo? Pues tras husmear por la red, encontr varias pginas,
la mayora en ingls, sobre cmo usar un divisor de tensin para indicar qu tecla se est
pulsando.
sto se basa en colocar una determinada resistencia en cada patilla, de modo que la entrada
analgica lea un valor de voltaje distinto en funcin de la tecla que hayamos pulsado.
En sta entrada, el autor, FjRamirez (desde aqu muchas gracias) explica los fundamentos
fsicos de ste efecto, y las frmulas en las cuales se basa.
Luego, el pin de entrada se conecta a una entrada analgica, y mediante programacin, se
averigua cual es la tecla que se ha pulsado:

stas son las resistencia que he usado yo (salen valores justitos porque he usado las que he
encontrado por casa, sin comprar ninguna ms)
R1
R2
R3
R4
R5
R6
R7
R8
R9

0 Ohm
330 Ohm
380 Ohm
30 Ohm
80 Ohm
100 Ohm
330 Ohm
1000 Ohm
1000 Ohm

Tenis ms informacin en la web de Ponteduino, con los esquemas grficos que he seguido
para el clculo de resistencias.

Para implementar sta solucin, he reescrito ste cdigo (de nuevo basado en el del
grupo Ponteduino de Pontevedra)
char teclado;
void setup() {
Serial.begin(9600);
}
void loop() {
char codigo[4];
for (int i=0;i<4;i++)
{
char codigo[i]=lectora();
delay(30);
Serial.println(codigo);
delay(100);
}
void lectora(){
int entradateclado = analogRead(A0);
if (entradateclado>=936 && entradateclado<=939)
teclado=1;
if (entradateclado>=920 && entradateclado<=923)
teclado=2;
if (entradateclado>=761 && entradateclado<=765)
teclado=3;
if (entradateclado>=504 && entradateclado<=510)
teclado='A';
if (entradateclado>=719 && entradateclado<=725)
teclado=4;
if (entradateclado>=708 && entradateclado<=715)
teclado=5;
if (entradateclado>=609 && entradateclado<=616)
teclado=6;
if (entradateclado>=430 && entradateclado<=440)
teclado='B';
if (entradateclado>=691 && entradateclado<=700)
teclado=7;
if (entradateclado>=685 && entradateclado<=689)
teclado=8;
if (entradateclado>=590 && entradateclado<=600)

teclado=9;
if (entradateclado>=424
teclado='C';
if (entradateclado>=916
teclado='*';
if (entradateclado>=902
teclado=0;
if (entradateclado>=750
teclado='#';
if (entradateclado>=499
teclado='D';

&& entradateclado<=428)
&& entradateclado<=919)
&& entradateclado<=906)
&& entradateclado<=753)
&& entradateclado<=503)

//Serial.println(entradateclado);
// Serial.println(teclado);
//
}

delay(100);