Proyecto 24 - Numeric Keypads

18 de julio de 2015

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();

}