Desbloquear puerta mediante teclado

Hola a todos de nuevo,

Estoy intentando implementar un teclado (es de papel, de 8 dígitos, del 1 al 8) en mi caja fuerte de pega, este teclado en concreto Txapuzas electrónicas: PaperTeclado: Un teclado con una hoja impresa de papel

Estoy intentando hacer que al pulsar, por ejemplo, 8435, se ejecute un código (abrir y cerrar la puerta) el cual ya lo tengo. Lo que me falta es eso, como hacer que al introducir la clave funcione.

Muchas gracias

Hola de nuevo,

He abandonado el anterior teclado y lo he sustituido por un teclado viejo de ordenador. Tiene 4 cables, que ya los tengo correctamente colocados. Al pulsar los números del teclado numérico me devuelve esto:

1- iði
2- rðr
3- zðz
4- kðk
5- sðs
6- tðt
7- lðl
8- uðu
9- }ð}
0- pðp
supr(uso el del .)- qðq
intro(uso el - como intro)- {ð{

El código que uso es este:

#include <ps2.h>
#include <Password.h>
PS2 kbd(6, 12);
Password password = Password( "4321" );

byte currentLength = 0;
int enablePin = 2;
int motor11Pin = 3;
int motor12Pin = 4;
int motor21Pin = 5;
int motor22Pin = 7;
int rojo = 8;
int verde = 9;
int led = 11;
int speakerPin = 13; 
const int analogPin = 0;
const int analog1Pin = 1;
const int threshold = 970;
#define c 261
#
#define d 294
#
#define e 329
#
#define f 349
#
#define g 391
#
#define gS 415
#
#define a 440
#
#define aS 455
#
#define b 466
#
#define cH 523
#
#define csH 554
#
#define dH 587
#
#define dsH 622
#
#define eH 659
#
#define fH 698
#
#define fsH 740
#
#define gH 784
#
#define gsH 830
#
#define aH 880
void kbd_init()
{
  char ack;

  kbd.write(0xff);  // send reset code
  ack = kbd.read();  // byte, kbd does self test
  ack = kbd.read();  // another ack when self test is done
}
void setup(){
  Serial.begin(9600);
  Serial.println("Try to guess the password!");
  Serial.println("Reset with 'Supr' evaluate with 'Intro (-)'");
  Serial.print("Enter password: ");
  pinMode(enablePin, OUTPUT);
  pinMode(motor11Pin, OUTPUT);
  pinMode(motor12Pin, OUTPUT);
  pinMode(motor21Pin, OUTPUT);
  pinMode(motor22Pin, OUTPUT);
  pinMode(rojo, OUTPUT);
  pinMode(verde, OUTPUT);
  kbd_init();
}
void beep (unsigned char speakerPin, int frequencyInHertz, long timeInMilliseconds)
{
    int x;      
    long delayAmount = (long)(1000000/frequencyInHertz);
    long loopTime = (long)((timeInMilliseconds*1000)/(delayAmount*2));
    for (x=0;x<loopTime;x++)    
    {    
        digitalWrite(speakerPin,HIGH);
        delayMicroseconds(delayAmount);
        digitalWrite(speakerPin,LOW);
        delayMicroseconds(delayAmount);
    }    
  }
void loop(){
  
  char input = kbd.read();
if (kbd.read() == 'pðp'){
    input = '0';}
    else if(kbd.read() == 'iði'){
    input = '1';} 
    else if(kbd.read() == 'rðr'){
    input = '2';}
    else if(kbd.read() == 'zðz'){
    input = '3';}
    else if(kbd.read() == 'kðk'){
    input = '4';}
    else if(kbd.read() == 'sðs'){
    input = '5';}
    else if(kbd.read() == 'tðt'){
    input = '6';}
    else if(kbd.read() == 'lðl'){
    input = '7';}
else if(kbd.read() == 'uðu'){
    input = '8';} 
 else if(kbd.read() == '}ð}'){
    input = '9';}
    
  digitalWrite(enablePin, HIGH);
  
      switch (input){
      case 'qðq': //reset password
        password.reset();
        currentLength = 0;
        Serial.println("\tPassword is reset!");
      break;
      case '{ð{': //evaluate password
        if (password.evaluate()){
          Serial.println("\tYou guessed the correct password!");
          guessPassword();
        }else{
          Serial.println("\tYou did not guess the correct password!");
        }
      break;
      default: //append any keypress that is not a 'Supr' nor a 'Intro (-)' to the currently guessed password.
        password << input;
        currentLength++;
        
        //Print some feedback.
        Serial.print("Enter password: ");
        for (byte i=0; i<currentLength; i++){
          Serial.print('*');
        }
        Serial.println();
     
  }

incorrect();
}
 void guessPassword(){
    digitalWrite(verde, HIGH);
           beep(speakerPin, aH, 500);
           delay(100);           
           digitalWrite(motor11Pin, HIGH);
           digitalWrite(motor12Pin, LOW);
           delay(2700);
           digitalWrite(motor11Pin, LOW);
           digitalWrite(motor12Pin, LOW);
           delay(1000);
           digitalWrite(motor21Pin, HIGH);
           digitalWrite(motor22Pin, LOW);
           delay(4000);
           digitalWrite(motor21Pin, LOW);
           digitalWrite(motor22Pin, LOW);
           
           delay(17000);
           beep(speakerPin, aH, 200);
           beep(speakerPin, fsH, 200);
           digitalWrite(verde, LOW);
           
           beep(speakerPin, aH, 200);
           beep(speakerPin, fsH, 200);
           digitalWrite(verde, HIGH);
           
           beep(speakerPin, aH, 200);
           beep(speakerPin, fsH, 200);
           digitalWrite(verde, LOW);
           
           beep(speakerPin, aH, 200);
           beep(speakerPin, fsH, 200);
           digitalWrite(verde, HIGH);
           
           beep(speakerPin, aH, 200);
           beep(speakerPin, fsH, 200);
           digitalWrite(verde, LOW);
           
           beep(speakerPin, aH, 200);
           beep(speakerPin, fsH, 200);
           digitalWrite(verde, HIGH);
           beep(speakerPin, aH, 200);
           beep(speakerPin, fsH, 200);
           digitalWrite(verde, LOW);
           
           beep(speakerPin, aH, 200);
           beep(speakerPin, fsH, 200);
           digitalWrite(verde, HIGH);
           delay(500);
           digitalWrite(motor21Pin, LOW);
           digitalWrite(motor22Pin, HIGH);
           delay(4000);
           digitalWrite(motor21Pin, LOW);
           digitalWrite(motor22Pin, LOW);
           delay(500);
           digitalWrite(motor11Pin, LOW);
           digitalWrite(motor12Pin, HIGH);
           delay(2700);
           digitalWrite(motor11Pin, LOW);
           digitalWrite(motor12Pin, LOW);
           delay(2000);
           digitalWrite(verde, LOW);
           delay(500);     
    }
void incorrect(){
    digitalWrite(motor11Pin, LOW);
        digitalWrite(motor12Pin, LOW);
        digitalWrite(rojo, HIGH);
        delay(1000);
        digitalWrite(rojo, LOW);
        delay(1000);
    }

Al pulsar intro o supr, me sigue añadiendo caracteres, en vez de resetear o comprobar la clave.

Gracias

Buenos días,

Lo primero, espero que nunca te dediques profesionalmente a la fabricacion de cajas fuertes… porque la tuya la veo, no se como decirte, parece algo débil!!! :wink:

Lo segundo… con ese codigo te puedes volver un poco loco… te comento un poco,

En un teclado Ps2 puede hacer varias cosas, hay teclas que al pulsarlas devuelven un codigo, hay otras que devuelven dos codigos de tecla distintos (seguidos) y otras hasta tres y cuatro codigos distintos.

Aparte de esto, el teclado, por si mismo (sin pulsar ninguna tecla) de vez en cuando dice “Auto-Chequeo Correcto”, “Echo”, “Error”… etc…

Te recomiendo que veas este enlace (Ingles)

http://www.beyondlogic.org/keyboard/keybrd.htm

Yo tengo un código funcionando con un teclado completo… pero veo más interesante el entender primero el funcionamiento del teclado… :wink:

Muchas gracias,

Lo sé, en el futuro no me dedicaré a fabricar cajas fuertes de plástico, a lo mejor de acero y hormigón armado ;D , pero lo que estoy haciendo, es , por llamarlo de alguna manera, una maqueta del funcionamiento de una caja fuerte real.

Lo del código la verdad es que si, marea bastante. He encontrado una librería, que no me devuelve unos códigos, si no directamente la tecla que he pulsado. Si pulso el 1, me devuelve un 1. Al pulsar Esc me devuelve tambien Esc, pero no hace la función que le tengo asignada al Esc.

Bueno, ya he pedido un teclado matricial de 3x4, así me quito de problemas. Un teclado completo parece demasiado para la función que quiero, a parte de que poner un teclado en el lateral de la caja como que no ;D . Además, me he pedido también una Arduino Mega, para no tener que estar preocupado por los pines disponibles ;D ;D

Saludos