Caja Fuerte

Objetivo: Hay que hace una Caja Fuerte 

  • La apertura de una Caja Fuerte se tiene que hacer por medio de un Arduino.
  • Tenemos tres pulsadores, y un cuarto para validar la contraseña de los anteriores.
  • Si se hace correctamente la pulsación, se enciende un led verde, y se abre la caja.
  • Si no se hace correctamente la pulsación, se enciende una pulsación de un led rojo
  • Si se vuelve a hacer incorrectamente la pulsación se encienden dos veces el led rojo
  • Si se vuelve a hacer mal la pulsación, se enciende el led rojo y se queda fijo.
  • Para volver al inicio habrá que resetear, pulsando el pulsador Uno y Enter

Lista de materiales:

  • Caja de madera
  • Arduino uno
  • MiniServo
  • 4 Pulsadores
  • 1 Led Rojo
  • 1 Led Verde
  • 1 zumbador
  • 1 pila de 9V
  • Cablecillos
  • Pasador y clip

Primera aproximación

Cambio a Arduino Nano

Caja Definitiva 

 

 

Conexiones

Código:

/************************************************************************
            PROGRAMA CAJA FUERTE  REAL FINAL
************************************************************************/
// Podemos iniciar nuestro código definiendo algunos argumentos
// Le damos nombre a nuestros pulsadores, y les definimos su correspondiente entrada
// Añado un servomotor para la cerradura
// también quiero hacer una pulsación especial que resetee para poder abrir la caja que se haya bloqueado. Con pulsador 4 + 7
// y una pulsacion para cerrar la caja Con pulsador 4 + 7
// añado también el sonido para cada pulsación y la cancioncilla si se ha conseguido abrir.

#include <Servo.h>  // Incluyo la librería del servo para la cerradura
Servo myservo;  // 
#define ROJO 4
#define VERDE 5
#define AZUL 6
#define BLANCO 7
//Incluimos las variables que creemos que nos harán falta para nuestro programa.
// Fijaros que he quitado el número entre los corchetes, puesto que lo determina de forma automática
bool FLAG = 0;
byte PASSWORD [] = {ROJO, VERDE, AZUL, VERDE, ROJO}; //Array con la clave correcta.
byte CLAVE [] = {0, 0, 0, 0, 0}; //Array para guardar la contraseña que se mete, al inicio a cero
byte PULSACION = 0; //Variable que me cuenta las pulsaciones
byte ERRORES = 0; // Variable que cuenta los errores
int i = 0;
void FALLO (); //Subprograma al que se llama cuando se ha pulsado mal la Contraseña
void COMPROBACION(); //Cuando se pulsa el nº 10, se entra en un subprograma que comprueba la coincidencia o no de la clave
void setup() 
{
  //Definición de los pines de los pulsadores
  pinMode(ROJO, INPUT);
  pinMode(VERDE, INPUT);
  pinMode(AZUL, INPUT);
  pinMode(BLANCO, INPUT);
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
  myservo.write(10);
//Definición de los pines de los leds
  pinMode(11, OUTPUT); //LED Rojo - NOK
  pinMode(12, OUTPUT); //LED Verde- OK
  pinMode (8,OUTPUT); // 8 Salida zumbador

  //Iniciamos el puerto serie, que nos servirá para monitorizar parámetros.
  Serial.begin(9600); 
}
void loop() {
  // Empezamos el programa según nuestro diagrama comprobando las pulsaciones
  //visualizamos en la pantalla serie la clave vacía, numero de pulsaciones y errores
  Serial.print(PULSACION); Serial.print("CLAVE"); Serial.print(CLAVE[0]);Serial.print(CLAVE[1]);Serial.print(CLAVE[2]);Serial.print(CLAVE[3]);Serial.print(CLAVE[4]);Serial.print("error");Serial.print(ERRORES);
  delay(250);
  Serial.println(); 
  if (digitalRead(ROJO)) 
  {
    delay(10);
    if (FLAG != 1) 
      {                                                            // Si no hay ningún botón pulsado
      FLAG = 1;                                                                    // Activamos la marca de pulsación de botón.
      if (PULSACION <= 4)CLAVE[PULSACION] = ROJO; // Si todavía cabe, lo guardamos
      PULSACION++;                                                           // Sumamos pulsación
      tone (8,1000,200);
      }
  }
  if (digitalRead(VERDE)) 
    {
    delay(10);
    if (FLAG != 1) 
      {                                                              // Si no hay ningún botón pulsado
      FLAG = 1;                                                                     // Activamos la marca de pulsación de botón.
      if (PULSACION <= 4)CLAVE[PULSACION] = VERDE; // Si todavía cabe, lo guardamos
      PULSACION++;                                                            // Sumamos pulsación
      tone (8,1000,200);
      }
    }
         digitalWrite (12, 1);  
   CLAVE [0] = 0;
   CLAVE [1] = 0;
   CLAVE [2] = 0;
   CLAVE [3] = 0;
   CLAVE [4] = 0;
   PULSACION = 0;
   tone (8,500,1000);
  
   do
    {  
      digitalWrite (12, 0);
      delay (100);
      digitalWrite (12, 1);
      delay (100);
      } while (digitalRead (BLANCO)== LOW);
      delay(10);
      tone (8,1000,100);
      
      for (i=100; i>=10; i--)
      {
      myservo.write(i);              // servo 9 despacio hasta 170º
      delay(10);
      }
      digitalWrite (12, 0);  
     if (!digitalRead(ROJO) && !digitalRead(VERDE) && !digitalRead(AZUL) && !digitalRead(BLANCO)) 
      {
      FLAG = 0;
      }    
  }
   else
  {
   FALLO();  // Si no se acierta la contraseña, nos  manda al subprograma FAllO
  }
}  
void FALLO() 
  {
  ERRORES = ERRORES + 1;
  Serial.print("FALLO"); Serial.print(ERRORES); 
  if (ERRORES < 3) // Si la cantidad de errores que llegan es inferior a 3 solo debe parpadear el led rojo
    { 
      for (int i = 0; i < ERRORES; i++) 
      {
      digitalWrite(11, 1);
      delay(500);
      digitalWrite(11, 0);
      delay(500);
      }
      PULSACION = 0;
      memset(CLAVE, 0, sizeof (CLAVE));
    }
  else // Sin embargo si nos llegan 3 errores debemos de hacer sonar la alarma y esperar a que se pulse el enter
    {
     delay (500);
     digitalWrite(11, 1);
     do
     {
     tone (8,1000,100);
     delay (100);
     tone (8,500,100);
     delay (100);
     } while  ((digitalRead (BLANCO)== LOW) || (digitalRead (ROJO)== LOW)) ;
     digitalWrite(11, 0);
       PULSACION = 0;
       ERRORES = 0;
    memset(CLAVE, 0, sizeof (CLAVE)); // Usamos este truco para inicializar a 0 todo el array de manera rápida http://www.utopiamechanicus.com/article/arduino-setup-arrays/
    }
    }

Leave a Comment

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *