Академический Документы
Профессиональный Документы
Культура Документы
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++){
");}
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);