Proyecto 24 - Numeric Keypads
En este tutorial vamos a ver aplicaciones de teclados numéricos o keypads.
Primero vamos a ver un ejemplo sencillo de como funcionan y a continuación haremos una alarma.
Como expertos en Arduino que sois, ya sabéis que es difícil encontrar en internet un sketch que se adapte exactamente a las necesidades de nuestro proyecto. En mi caso era hacer una alarma, pero lo que veía por ahí no cumplía con las especificaciones que necesitaba. Este rollazo que os he soltado me sirve para citar las fuentes que he consultado para materializar mi proyecto, que son los tutoriales sobre keypads de tronixstuff y un control de acceso en instructables.
Proyecto 24a - Testing the keypad
En primer lugar vamos a conectar el teclado al Arduino y mediante el monitor serie comprobaremos que el teclado funciona correctamente.
Montar el circuito según el esquema, cargar el sketch y abrir el monitor serie.
Al presionar los botones veremos en el monitor serie la tecla correspondiente.
Esquema
Sketch
/* Numeric keypad
http://tronixstuff.com/tutorials > chapter 42
Uses Keypad library for Arduino
http://www.arduino.cc/playground/Code/Keypad
by Mark Stanley, Alexander Brevig */
#include "Keypad.h"
const byte ROWS = 4; // cuatro filas
const byte COLS = 3; // tres columnas
// Define the Keymap
char keys[ROWS][COLS] = {
{'1','2','3',},
{'4','5','6',},
{'7','8','9',},
{'*','0','#',}
};
byte rowPins[ROWS] = {10, 9, 8, 7}; //Filas 1,2,3,4
byte colPins[COLS] = {13, 12, 11}; //Columnas 1,2,3
// Create the Keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
void setup()
{
Serial.begin(9600);
}
void loop()
{
char key = keypad.getKey();
if (key != NO_KEY)
{
Serial.println(key);
}
}
Proyecto 24b - Alarma con teclado numérico
Vamos a añadir más complejidad al circuito.
Incluimos un display LCD gráfico, un zumbador piezoeléctrico y dos leds de status.
En el esquema podéis observar que he utilizado los pines analógicos como salidas puesto que al incluir el LCD he agotado los pines digitales. esto no supone ningún problema de funcionamiento. Los pines analógicos se pueden utilizar como E/S digitales con solo definirlo así en el setup.
Funcionamiento
Al conectar la alimentación empieza una cuenta atrás hasta que la alarma se activa.
Estando la alarma ON si introducimos el pin correctamente, ésta se desactiva permitiendo el acceso. Si lo introducimos mal, salta la alarma activando el zumbador. Si volvemos a introducir el pin correcto, la alarma se apaga.
Para volver a activar la alarma solo hay que introducir de nuevo el pin.
Esquema
Sketch
/*
Proyecto 24. Alarma
Numeric Keypad with GLCD
Using Analog pins like Digital I/O
Based on the original sketch of Razvan Iycdi
http://www.instructables.com/id/Password-Lock-with-Arduino/
Modified by Angel M. Muñoz
*/
#include <Password.h>
#include "Keypad.h"
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
#include <Wire.h>
Adafruit_PCD8544 display = Adafruit_PCD8544(2, 3, 4, 5, 6);
//Adafruit_PCD8544 dsply = Adafruit_PCD8544(CLK, DIN, DC, CS, RST);
Password password = Password( "4321" );
const byte ROWS = 4; // Four rows
const byte COLS = 3; // Three columns
// Define the Keymap
char keys[ROWS][COLS] = {
{'1','2','3',},
{'4','5','6',},
{'7','8','9',},
{'*','0','#',}
};
byte rowPins[ROWS] = {10, 9, 8, 7}; //Filas 1,2,3,4
byte colPins[COLS] = {13, 12, 11}; //Columnas 1,2,3
// Create the Keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
boolean ra=1;
void setup(){
pinMode(A0, OUTPUT); //Piezo Speaker
pinMode(A1, OUTPUT); //Green Led
pinMode(A2, OUTPUT); //Red Led
// Iniciamos comunicacion serie
Wire.begin();
// Iniciamos comunicacion con la pantalla
display.begin();
// Establecemos el contraste
display.setContrast(45);
// Mostramos la pantalla de inicio durante 2 segundos
display.display();
delay(2000);
// borramos la pantalla
display.clearDisplay();
display.setTextSize(1);
keypad.addEventListener(keypadEvent); //add an event listener for this keypad
keypad.setDebounceTime(250);
enableAlarm();
}
void enableAlarm()
{
//digitalWrite(greenled, LOW);
display.clearDisplay();
int a;
for ( a = 10; a > 0; a-- )
{
display.setCursor(0, 0);
display.print("Enabling Alarm");
display.setCursor(0, 15);
display.print("quedan ");
display.println(a);
display.print("segundos");
display.display();
digitalWrite(A2, HIGH);
digitalWrite(A0, HIGH);
delay(500);
display.clearDisplay();
digitalWrite(A2, LOW);
digitalWrite(A0, LOW);
delay(500);
}
display.setCursor(0, 0);
display.println("Alarma ON");
display.setCursor(0, 15);
display.println("PROHIBIDO");
display.println("EL PASO");
display.setCursor(0, 40);
display.print("Intro PIN:");
display.display();
digitalWrite(A1, LOW);
digitalWrite(A2, HIGH);
password.reset(); //resets password after correct entry
ra=1;
delay(600);
}
void disableAlarm()
{
digitalWrite(A1, HIGH);
digitalWrite(A2, LOW);
digitalWrite(A0, LOW);
display.clearDisplay();
display.setCursor(0, 0);
display.println("Alarma OFF");
display.setCursor(0, 15);
display.println("Bienvenido");
display.setCursor(0, 40);
display.print("Intro PIN:");
display.display();
password.reset(); //resets password after correct entry
ra=0;
delay(2000);
}
void buzzOn()
{
digitalWrite(A1, LOW);
digitalWrite(A2, HIGH);
digitalWrite(A0, HIGH);
display.clearDisplay();
display.setCursor(0, 0);
display.println("Buzzer ON");
display.setCursor(0, 40);
display.print("Intro PIN:");
display.display();
password.reset(); //resets password after INCORRECT entry
ra=1;
delay(600);
}
//take care of some special events
void keypadEvent(KeypadEvent eKey){
switch (keypad.getState()){
case PRESSED:
display.print(eKey);
display.display();
switch (eKey){
case '#': guessPassword(); break;
default:
password.append(eKey);
}
}}
void guessPassword(){
int op;
if (password.evaluate()==0 && ra==0)
{
op=1;
display.clearDisplay();
display.setCursor(0, 0);
display.println("PIN INCORRECTO");
display.println("op=1");
display.println("No Alarm");
display.println("Running");
display.display();
delay(5000);
}
if (password.evaluate()==1 && ra==0)
{
op=2;
display.clearDisplay();
display.setCursor(0, 0);
display.println("PIN CORRECTO");
display.println("op=2");
display.println("Alarma ON");
display.display();
delay(5000);
}
if (password.evaluate()==0 && ra==1)
{
op=3;
display.clearDisplay();
display.setCursor(0, 0);
display.println("PIN INCORRECTO");
display.println("op=3");
display.println("Buzzer ON");
display.display();
delay(5000);
}
if (password.evaluate()==1 && ra==1)
{
op=4;
display.clearDisplay();
display.setCursor(0, 0);
display.println("PIN CORRECTO");
display.println("op=4");
display.println("Alarm OFF");
display.display();
delay(5000);
}
switch(op)
{
case 1:
disableAlarm();
break;
case 2:
enableAlarm();
break;
case 3:
buzzOn();
break;
case 4:
disableAlarm();
break;
}
}
void loop(){
keypad.getKey();
}
Special thanks to:
Razvan Iycdi: http://www.instructables.com/id/Password-Lock-with-Arduino/
Mark Stanley, Alexander Brevig: Keypad Library for Arduino
John Boxall: Arduino Tutorials Chapter 42. Numeric Keypads