Está en la página 1de 5

Tecnocampus de Verano Guadatech 2014 Carlos Hernández Cáceres

CAJA “FUERTE” CON CONTRASEÑA

Propósito de la práctica:

Con intención de simular una “caja fuerte” crearemos una caja con un cerrojo controlado por
unos pulsadores externos y una contraseña.

Montaje:

Utilizando la herramienta Fritzing:

Julio 2014
1/5
Tecnocampus de Verano Guadatech 2014 Carlos Hernández Cáceres

Código fuente:

const int numRows = 4;


const int numCols = 4;

const int tiempoRebote = 300;

char clave []= "9abc"; // Clave para abrir la caja


int posicion=0;

// Valores representados al pulsar el key pad


const char keymap[numRows][numCols] ={
{
'1', '2', '3', '4' }
,
{
'5', '6', '7', '8' }
,
{
'9', 'a', 'b', 'c' }
,
{
'd', 'e', 'f', 'g' }
};

const int rowPins[numRows] = {


6,7,8,9 };
const int colPins[numCols] = {
5,4,3,2 };
const int ledPinRed = 13; // Led ROJO de FALLO
const int ledPinGreen = 12; // Led VERDE de ACIERTO

int speakerPin=10; // Zumbador


int numTones=26;
int song[] = {261, 349, 392, 440, 392, 330, -10, 261, 349, 392, 440, 392, -10, -10, 261, 349, 392, 440, 392, 330, -10,
330, 349, 330, 261, 261}; // Melodia para cuando se abra la caja

#include <Servo.h>

Servo servo1; // Crea un Objeto servo


int posicionServo; // Variable de la posicion del servo

void setup()
{
servo1.attach(11); // Seleccionamos el pin 11 como el pin de control para el servo

Serial.begin(9600);

pinMode(ledPinRed, OUTPUT);
pinMode(ledPinGreen, OUTPUT);

for (int row = 0; row < numRows; row++)


{
pinMode(rowPins[row], INPUT);
digitalWrite(rowPins[row], HIGH);
}
for (int column = 0; column < numCols; column++)
{

Julio 2014
2/5
Tecnocampus de Verano Guadatech 2014 Carlos Hernández Cáceres

pinMode(colPins[column], OUTPUT);
digitalWrite(colPins[column], HIGH);
}

Serial.println("Si desea abrir la caja introduzca la clave correcta.");


}

void loop()
{
char key=getkey();
if (key != 0)
{
if (key =='g');
{
posicionServo = 700;
posicionServo = map(posicionServo, 0, 1023, 0, 179);
servo1.write(posicionServo);
delay(150);
}
posicion = compruebaClave(key, posicion);
Serial.println(key);

if (posicion==4)
{
Serial.print("Abierto!");
tone(speakerPin,1000);
blink(ledPinGreen,300);
posicionServo = 100; // Establecemos el valor de la posicion a 0º
posicionServo = map(posicionServo, 0, 1023, 0, 179); // Establecemos la relacion entre los grados de giro y el
PWM
/* Con el mapa de valores anterior establecemos una relacin proporcional */
/* entre el pulso minimo 0 con el grado minimo, 0 tambien y el pulso maximo*/
/* 1023 con el grado maximo, 179*/
servo1.write(posicionServo); // Escribimos la posicion con el mapa de valores al servo
delay(150); // Y le damos un tiempo para que sea capaz de moverse

for (int i=0; i<numTones;i++)


{
tone(speakerPin,song[i]);
delay(500);
}
noTone(speakerPin);
}
}
}

// Devuelve un char con la tecla que se ha pulsado, o cero en caso que nada se haya presionado
char getkey()
{
char key = 0;

for(int column = 0; column < numCols; column++)


{
digitalWrite(colPins[column], LOW); // Activa la columna actual

for (int row = 0; row < numRows; row++) // Escanea todas las filas para ver las teclas pulsadas
{
if ( digitalRead(rowPins[row]) == LOW)
{

Julio 2014
3/5
Tecnocampus de Verano Guadatech 2014 Carlos Hernández Cáceres

delay(tiempoRebote); // Espera a que la tecla sea liberada


key = keymap[row][column];
}
}
digitalWrite(colPins[column], HIGH); // Desactiva la columna actual
}

return key;
}

void blink(int color, int rate)


{
digitalWrite(color,HIGH);
delay(rate);
digitalWrite(color,LOW);
delay(rate);
}

int compruebaClave (int numero, int posicion) // FUNCION COMPROBAR CLAVE


{
if (clave [posicion]==numero) // SI ACIERTO
{
++posicion; // Pasa a la posicion siguiente
blink(ledPinGreen,200);
tone(speakerPin,600);
delay(200);
noTone(speakerPin);
}
else // SI FALLO
{
posicion=0; // Vuelve a la posicion inicial
blink(ledPinRed,100);
tone(speakerPin,2);
delay(200);
noTone(speakerPin);
}
return posicion;
}

Julio 2014
4/5
Tecnocampus de Verano Guadatech 2014 Carlos Hernández Cáceres

Explicación:

Se ha introducido en una caja de cartón el Arduino Uno, la protoboard con los leds y el
buzzer, el servo y todo el cableado, dejando fuera solo el KeyPad. Se ha realizado una ranura en la
caja de cartón que servirá como cierre al introducirse la patilla del servo y se han perforado dos
agujeros para ver los leds rojo y verde.

Funcionamiento:

La caja se cierra pulsado la tecla 'g' en la posición [4,4] del KeyPad (esquina inferior
derecha).
Ahora la “caja fuerte” se encuentra armada, y para desactivarla se debe introducir una clave
de 4 dígitos mediante el KeyPad externo.
Al pulsar uno de los Button se iluminará el led verde si se ha acertado y el led rojo si se ha
fallado.
La contraseña correcta deberá pulsarse bien seguida, cada vez que se falle se debe volver a
comenzar.
Cuando se haya introducido la contraseña correcta se activará el Servo y se abrirá el cerrojo,
pudiendo abrir entonces la caja.
Para volver a cerrar el cerrojo desde fuera se volverá a pulsar la tecla 'g'.

Julio 2014
5/5

También podría gustarte