Contenido del curso

Problema 3

 

¡Desbloquea la Caja Fuerte!

¡Te han asignado una importante misión! Tienes frente a ti una caja fuerte con una cerradura de combinación secreta de 3 números. Estos números están comprendidos entre 0 y 10. El objetivo es encontrar la combinación correcta para abrir la caja fuerte. Para lograrlo, disponemos de un sistema interactivo que te permitirá seleccionar y probar los números hasta dar con la combinación adecuada.

Descripción del Sistema:

  • Potenciómetro: Utilizado para seleccionar cada uno de los tres números de la combinación.

  • Botón de confirmación: Una vez seleccionado un número con el potenciómetro, pulsa este botón para confirmarlo.

Funcionamiento del Sistema:

  1. Selecciona el número con el potenciómetro.

    1. Ajusta el potenciómetro para seleccionar un número entre el 0 y el 10. El número seleccionado aparecerá en el display 7 segmentos.

  2. Confirma el número.

    1. Cuando estés seguro del número, pulsa el botón de confirmación.

    2. Si el número es correcto, se encenderá un LED correspondiente y en la pantalla LCD aparecerá el mensaje "Correcto!!!".

    3. Si el número es incorrecto, el LED parpadeará dos veces y en la pantalla LCD aparecerá el mensaje "Incorrecto!!!".

    4. Si fallas en el segundo o tercer intento, deberás volver a empezar desde el principio.

  3. Desbloqueo de la caja fuerte.

    1. Si aciertas los 3 números de la combinación, se iluminarán los tres LEDs uno después de otro, y la pantalla LCD mostrará el mensaje "Caja Fuerte Abierta!!!".

Detalles del Hardware:

  • Potenciómetro: Utilizado para seleccionar los números de la combinación, ajustando su valor entre 0 y 10.

  • Botón: Se pulsa para confirmar el número seleccionado con el potenciómetro.

  • Display 7 Segmentos: Muestra el número actual que se está seleccionando con el potenciómetro.

  • 3 LEDs: Cada LED se ilumina cuando aciertas un número de la combinación. Si fallas, el primer LED parpadea dos veces.

  • Pantalla LCD: Muestra mensajes de "Correcto!!!", "Incorrecto!!!", y "Caja Fuerte Abierta!!!" cuando se aciertan los tres números de la combinación.


 

 

Tarea:

  • Programa un sistema que permita simular la apertura de una caja fuerte, seleccionando 3 números entre 0 y 10 usando un potenciómetro.

  • Tras cada selección de número, el alumno debe pulsar un botón para confirmar si es el correcto.

  • Si el número es correcto, se encenderá el LED correspondiente y aparecerá "Correcto!!!" en la pantalla LCD.

  • Si el número es incorrecto, el primer LED parpadeará dos veces y la pantalla LCD mostrará "Incorrecto!!!". Si fallas en el segundo o tercer intento, el sistema reiniciará desde el primer número.

  • Cuando los 3 números correctos se hayan ingresado, los LEDs se encenderán uno después de otro 3 veces, y la pantalla LCD mostrará "Caja Fuerte Abierta!!!".

Utiliza variables para indicar el valor de cada contraseña:

Utiliza una variable que cambie cuando quieras comprobar una contraseña u otra:

Al utilizar el bloque de mapear, ten en cuenta que para números enteros, si ponemos que una variable
vaya del 0 al 10, para que alcance el valor máximo, el potenciómetro tiene que estar en su valor máximo,
es decir, la lectura del potenciómetro tiene que ser de 1023, por tanto, para un mejor funcionamiento,
puedes poner que el mapeo vaya de 0 a 11:


// Incluir las librerías necesarias
#include <MentorBitDisplay.h>
#include <MentorBitPantallas.h>

// Declaración de instancia de la clase
MentorBitDisplay miMentorBitDisplay;
MentorBitPantallas miMentorBitPantallas;

// Crear las variables a utilizar
int Contrasena;
int Contrasena1 = 3;
int Contrasena2 = 4;
int Contrasena3 = 5;
int NumContrasena = 1;

// Definir los pines en los que van conectados los componentes electrónicas
#define LEDAzul 7
#define LEDVerde 6
#define LEDRojo 5

// Inicialización del sketch
void setup() {

  // Inicializar Display 7 segmentos
  miMentorBitDisplay.inicializarDisplay();

  // Inicializar pantalla LCD
  miMentorBitPantallas.inicializarLCD();
  miMentorBitPantallas.lcd.backlight();
  miMentorBitPantallas.lcd.clear();

  // Indicar los pines que serían salidas
  pinMode(LEDRojo, OUTPUT);
  pinMode(LEDVerde, OUTPUT);
  pinMode(LEDAzul, OUTPUT);

  // Imprimir por Display un 0
  miMentorBitDisplay.imprimir(0);
  
}

void loop() {

  // Cambiar el valor de la variable Contrasena respecto al potenciómetro
  Contrasena = map(analogRead(A0)01023011);

  // Imprimir por Display el valor de la variable Contrasena
  miMentorBitDisplay.imprimir(Contrasena);

  // En caso de poner la primera Contraseña
  if(NumContrasena == 1){

    // Imprimir por pantalla LCD el estado del Sistema
    miMentorBitPantallas.lcd.setCursor(0,0);
    miMentorBitPantallas.lcd.print("Contrasena 1?");

    // Esperar 0.2 segundos
    delay(200);

    // Leer el pin digital 23, siendo este el botón normalmente en baja
    if(digitalRead(23) == 1){

      // Comparar los valores de Contraseña con el valor de la primera contraseña
      if(Contrasena == Contrasena1){

        // Cambiar el valor de la variable NumContrasena
        NumContrasena = 2;

        // Imprimir por pantalla LCD el estado del Sistema
        miMentorBitPantallas.lcd.setCursor(0,0);
        miMentorBitPantallas.lcd.print("Correcto!!!");

        // Encender Led Rojo
        digitalWrite(LEDRojo,1);

        // Esperar 1 segundo
        delay(1000);

        // Limpiar la pantalla LCD
        miMentorBitPantallas.lcd.clear();

      }

      // En caso de que los valores de las variables no sean iguales
      else{

        // Imprimir por pantalla LCD el estado del Sistema
        miMentorBitPantallas.lcd.setCursor(0,0);
        miMentorBitPantallas.lcd.print("Incorrecto!!!");

        // Bucle que se repite 3 veces
        for(int i = 0; i < 3; i++){

          // Encender Led Rojo
          digitalWrite(LEDRojo,1);

          // Esperar 0.3 segundos
          delay(300);

          // Apagar Led Rojo
          digitalWrite(LEDRojo,0);

          // Esperar 0.3 segundos
          delay(300);          

        }

        // Cambiar el valor de la variable NumContrasena a 1
        NumContrasena = 1;

        // Limpiar la pantalla LCD
        miMentorBitPantallas.lcd.clear();

      }
    }
  }

  // En caso de poner la segunda Contraseña
  if(NumContrasena == 2){

    // Imprimir por pantalla LCD el estado del Sistema
    miMentorBitPantallas.lcd.setCursor(0,0);
    miMentorBitPantallas.lcd.print("Contrasena 2?");

    // Leer el pin digital 23, siendo este el botón normalmente en baja
    if(digitalRead(23) == 1){

      // Comparar los valores de Contraseña con el valor de la segunda contraseña
      if(Contrasena == Contrasena2){

        // Cambiar el valor de la variable NumContrasena
        NumContrasena = 3;

        // Imprimir por pantalla LCD el estado del Sistema
        miMentorBitPantallas.lcd.setCursor(0,0);
        miMentorBitPantallas.lcd.print("Correcto!!!");

        // Encender Led Verde
        digitalWrite(LEDVerde,1);

        // Esperar 1 segundo
        delay(1000);

        // Limpiar pantalla LCD
        miMentorBitPantallas.lcd.clear();

      }

      // En caso de que los valores de las variables no sean iguales
      else{

        // Imprimir por pantalla LCD el estado del Sistema
        miMentorBitPantallas.lcd.setCursor(0,0);
        miMentorBitPantallas.lcd.print("Incorrecto!!!");

        // Bucle que se repite 3 veces
        for(int i = 0; i < 3; i++){

          // Encender Leds Rojo y Verde
          digitalWrite(LEDRojo,1);
          digitalWrite(LEDVerde,1);

          // Esperar 0.3 segundos
          delay(300);

          //Apagar LEds Rojo y Vender
          digitalWrite(LEDRojo,0);
          digitalWrite(LEDVerde,0);

          // Esperar 0.3 segundos
          delay(300);

        }

        // Cambiar el valor de la variable NumContrasena a 1
        NumContrasena = 1;

        // Limpiar pantalla LCD
        miMentorBitPantallas.lcd.clear();

      }
    }
  }

  // En caso de poner la tercera Contraseña
  if(NumContrasena == 3){

    // Cambiar el valor de la variable NumContrasena
    miMentorBitPantallas.lcd.setCursor(0,0);
    miMentorBitPantallas.lcd.print("Contrasena 3?");

    // Leer el pin digital 23, siendo este el botón normalmente en baja
    if(digitalRead(23) == 1){

      // Comparar los valores de Contraseña con el valor de la tercera contraseña
      if(Contrasena == Contrasena3){

        // Cambiar el valor de la variable NumContrasena
        NumContrasena = 4;

        // Cambiar el valor de la variable NumContrasena
        miMentorBitPantallas.lcd.setCursor(0,0);
        miMentorBitPantallas.lcd.print("Correcto!!!");

        // Encender Led Azul
        digitalWrite(LEDAzul,1);

        // Esperar 1 segundo
        delay(1000);

        // Limpiar pantalla LCD
        miMentorBitPantallas.lcd.clear();

      }

      // En caso de que los valores de las variables no sean iguales
      else{

        // Cambiar el valor de la variable NumContrasena
        miMentorBitPantallas.lcd.setCursor(0,0);
        miMentorBitPantallas.lcd.print("Incorrecto!!!");

        // Bucle que se repite 3 veces
        for(int i = 0; i < 3; i++){

          // Encender Leds Rojo, Verde y Azul
          digitalWrite(LEDRojo,1);
          digitalWrite(LEDVerde,1);
          digitalWrite(LEDAzul,1);

          // Esperar 0.3 segundos
          delay(300);

          // Apagar Leds Rojo, Verde y Azul
          digitalWrite(LEDRojo,0);
          digitalWrite(LEDVerde,0);
          digitalWrite(LEDAzul,0);

          // Esperar 0.3 segundos
          delay(300);

        }

        // Cambiar el valor de la variable a 1
        NumContrasena = 1;

        // Limpiar la pantalla LCD
        miMentorBitPantallas.lcd.clear();

      }
    }
  }

  // Este valor de la variable se alcanza cuando se han acetado las contraseñas
  if(NumContrasena == 4){

    // Imprimir por pantalla LCD el estado del Sistema
    miMentorBitPantallas.lcd.setCursor(0,0);
    miMentorBitPantallas.lcd.print("Caja Fuerte");
    miMentorBitPantallas.lcd.setCursor(0,1);
    miMentorBitPantallas.lcd.print("Abierta!!!");

    // Bucle que se repite 3 veces
    for(int i = 0; i < 3; i++){

      // Encender el Led Rojo y Apagar los Leds Verde y Azul
      digitalWrite(LEDRojo,1);
      digitalWrite(LEDVerde,0);
      digitalWrite(LEDAzul,0);

      // Esperar 0.3 segundos
      delay(300);

      // Encender el Led Verde y Apagar los Leds Rojo y Azul
      digitalWrite(LEDRojo,0);
      digitalWrite(LEDVerde,1);
      digitalWrite(LEDAzul,0);

      // Esperar 0.3 segundos
      delay(300);

      // Encender el Led Azul y Apagar los Leds Rojo y Verde
      digitalWrite(LEDRojo,0);
      digitalWrite(LEDVerde,0);
      digitalWrite(LEDAzul,1);

      // Esperar 0.3 segundos
      delay(300);

    }

    // Apagar el Led Azul
    digitalWrite(LEDAzul,0);

    // Cambiar el valor de la variable a 1
    NumContrasena = 1;

    // Limpiar la pantalla LCD
    miMentorBitPantallas.lcd.clear();

  }
}

 

 

Desafío adicional:

Agrega al sistema una funcionalidad extra para hacer la caja fuerte más desafiante. En lugar de que los tres números de la combinación sean predefinidos, haz que estos sean generados de manera aleatoria al inicio del programa. De esta forma, cada vez que se reinicie el sistema o se abra la caja fuerte, la combinación cambiará automáticamente.

  • Requisito: Al inicio del programa, los tres números de la combinación deben ser generados de forma aleatoria en el rango de 0 a 10.

  • Reinicio: Una vez que el alumno haya abierto la caja fuerte (es decir, cuando se acierten los 3 números), el sistema deberá reiniciar y generar una nueva combinación aleatoria para que el proceso pueda repetirse con una nueva clave secreta.

Para hacer que una contraseña sea un número aleatorio, puedes utilizar el bloque, número al azar:

Puedes mostrar los números aleatorios en la pantalla OLED, en el caso de que no quieras estar
realizando múltiples intentos hasta que lo adivines.






// Incluir las librerías necesarias
#include <MentorBitDisplay.h>
#include <MentorBitPantallas.h>
#include <MentorBit.h>
#include <MentorBitDataLogger.h>

// Declaración de instancia de la clase
MentorBitDisplay miMentorBitDisplay;
MentorBitPantallas miMentorBitPantallas;
MentorBit miMentorBit;
MentorBitDataLogger miDataLogger;

// Crear las variables a utilizar
int Contrasena;
int Contrasena1;
int Contrasena2;
int Contrasena3;
int NumContrasena = 1;
int Reset = 1;

// Definir los pines en los que van conectados los componentes electrónicas
#define LEDAzul 7
#define LEDVerde 6
#define LEDRojo 5

// Inicialización del sketch
void setup() {

  // Inicializar Display 7 segmentos
  miMentorBitDisplay.inicializarDisplay();

  // Inicializar pantalla LCD
  miMentorBitPantallas.inicializarLCD();
  miMentorBitPantallas.lcd.backlight();
  miMentorBitPantallas.lcd.clear();

  // Indicar los pines que serían salidas
  pinMode(LEDRojo, OUTPUT);
  pinMode(LEDVerde, OUTPUT);
  pinMode(LEDAzul, OUTPUT);

  // Imprimir por Display un 0
  miMentorBitDisplay.imprimir(0);
  
}

void loop() {

  // Cambiar el valor de la variable Contrasena respecto al potenciómetro
  Contrasena = map(analogRead(A0)01023011);

  // Imprimir por Display el valor de la variable Contrasena
  miMentorBitDisplay.imprimir(Contrasena);

  // En caso de que el valor de la variable Reset sea 1
  if(Reset == 1){

    // Cambiar el valor de las variables a un número aleatorio entre 0 y 10;
    Contrasena1 = random(010);
    Contrasena2 = random(010);
    Contrasena3 = random(010);

    // Cambiar el valor de la variable a 0
    Reset = 0;

    // Inicializamos y configuramos la pantalla OLED
    miMentorBitPantallas.inicializarOLED();
    miMentorBitPantallas.oled.setTextColor(SSD1306_WHITE);
    miMentorBitPantallas.oled.setTextSize(1);
   
// Mostramos las contraseñas por la OLED, para no tener que realizar muchos intentos
    
    miMentorBitPantallas.oled.clearDisplay();
    miMentorBitPantallas.oled.setCursor(0,0);
    miMentorBitPantallas.oled.println(Contrasena1);
    miMentorBitPantallas.oled.setCursor(0,15);
    miMentorBitPantallas.oled.println(Contrasena2);
    miMentorBitPantallas.oled.setCursor(0,30);
    miMentorBitPantallas.oled.println(Contrasena3);
    miMentorBitPantallas.oled.display();
    
  }

  // En caso de poner la primera Contraseña
  if(NumContrasena == 1){

    // Imprimir por pantalla LCD el estado del Sistema
    miMentorBitPantallas.lcd.setCursor(0,0);
    miMentorBitPantallas.lcd.print("Contrasena 1?");


    // Esperar 0.2 segundos
    delay(200);

    // Leer el pin digital 23, siendo este el botón normalmente en baja
    if(digitalRead(23) == 1){

      // Comparar los valores de Contraseña con el valor de la primera contraseña
      if(Contrasena == Contrasena1){

        // Cambiar el valor de la variable NumContrasena
        NumContrasena = 2;

        // Limpiar la pantalla LCD
        miMentorBitPantallas.lcd.clear();
        // Imprimir por pantalla LCD el estado del Sistema
        miMentorBitPantallas.lcd.setCursor(0,0);
        miMentorBitPantallas.lcd.print("Correcto!!!");

        // Encender Led Rojo
        digitalWrite(LEDRojo,1);

        // Esperar 1 segundo
        delay(1000);

        // Limpiar la pantalla LCD
        miMentorBitPantallas.lcd.clear();

      }

      // En caso de que los valores de las variables no sean iguales
      else{

        // Imprimir por pantalla LCD el estado del Sistema
        miMentorBitPantallas.lcd.setCursor(0,0);
        miMentorBitPantallas.lcd.print("Incorrecto!!!");

        // Bucle que se repite 3 veces
        for(int i = 0; i < 3; i++){

          // Encender Led Rojo
          digitalWrite(LEDRojo,1);

          // Esperar 0.3 segundos
          delay(300);

          // Apagar Led Rojo
          digitalWrite(LEDRojo,0);

          // Esperar 0.3 segundos
          delay(300);          

        }

        // Cambiar el valor de la variable NumContrasena a 1
        NumContrasena = 1;

        // Limpiar la pantalla LCD
        miMentorBitPantallas.lcd.clear();

      }
    }
  }

  // En caso de poner la segunda Contraseña
  if(NumContrasena == 2){

    // Imprimir por pantalla LCD el estado del Sistema
    miMentorBitPantallas.lcd.setCursor(0,0);
    miMentorBitPantallas.lcd.print("Contrasena 2?");

    // Leer el pin digital 23, siendo este el botón normalmente en baja
    if(digitalRead(23) == 1){

      // Comparar los valores de Contraseña con el valor de la segunda contraseña
      if(Contrasena == Contrasena2){

        // Cambiar el valor de la variable NumContrasena
        NumContrasena = 3;

        // Limpiar la pantalla LCD
        miMentorBitPantallas.lcd.clear();
        // Imprimir por pantalla LCD el estado del Sistema
        miMentorBitPantallas.lcd.setCursor(0,0);
        miMentorBitPantallas.lcd.print("Correcto!!!");

        // Encender Led Verde
        digitalWrite(LEDVerde,1);

        // Esperar 1 segundo
        delay(1000);

        // Limpiar pantalla LCD
        miMentorBitPantallas.lcd.clear();

      }

      // En caso de que los valores de las variables no sean iguales
      else{

        // Imprimir por pantalla LCD el estado del Sistema
        miMentorBitPantallas.lcd.setCursor(0,0);
        miMentorBitPantallas.lcd.print("Incorrecto!!!");

        // Bucle que se repite 3 veces
        for(int i = 0; i < 3; i++){

          // Encender Leds Rojo y Verde
          digitalWrite(LEDRojo,1);
          digitalWrite(LEDVerde,1);

          // Esperar 0.3 segundos
          delay(300);

          //Apagar LEds Rojo y Vender
          digitalWrite(LEDRojo,0);
          digitalWrite(LEDVerde,0);

          // Esperar 0.3 segundos
          delay(300);

        }

        // Cambiar el valor de la variable NumContrasena a 1
        NumContrasena = 1;

        // Limpiar pantalla LCD
        miMentorBitPantallas.lcd.clear();

      }
    }
  }

  // En caso de poner la tercera Contraseña
  if(NumContrasena == 3){

    // Cambiar el valor de la variable NumContrasena
    miMentorBitPantallas.lcd.setCursor(0,0);
    miMentorBitPantallas.lcd.print("Contrasena 3?");

    // Leer el pin digital 23, siendo este el botón normalmente en baja
    if(digitalRead(23) == 1){

      // Comparar los valores de Contraseña con el valor de la tercera contraseña
      if(Contrasena == Contrasena3){

        // Cambiar el valor de la variable NumContrasena
        NumContrasena = 4;

        // Limpiar la pantalla LCD
        miMentorBitPantallas.lcd.clear();
        // Cambiar el valor de la variable NumContrasena
        miMentorBitPantallas.lcd.setCursor(0,0);
        miMentorBitPantallas.lcd.print("Correcto!!!");

        // Encender Led Azul
        digitalWrite(LEDAzul,1);

        // Esperar 1 segundo
        delay(1000);

        // Limpiar pantalla LCD
        miMentorBitPantallas.lcd.clear();

      }

      // En caso de que los valores de las variables no sean iguales
      else{

        // Cambiar el valor de la variable NumContrasena
        miMentorBitPantallas.lcd.setCursor(0,0);
        miMentorBitPantallas.lcd.print("Incorrecto!!!");

        // Bucle que se repite 3 veces
        for(int i = 0; i < 3; i++){

          // Encender Leds Rojo, Verde y Azul
          digitalWrite(LEDRojo,1);
          digitalWrite(LEDVerde,1);
          digitalWrite(LEDAzul,1);

          // Esperar 0.3 segundos
          delay(300);

          // Apagar Leds Rojo, Verde y Azul
          digitalWrite(LEDRojo,0);
          digitalWrite(LEDVerde,0);
          digitalWrite(LEDAzul,0);

          // Esperar 0.3 segundos
          delay(300);

        }

        // Cambiar el valor de la variable a 1
        NumContrasena = 1;

        // Limpiar la pantalla LCD
        miMentorBitPantallas.lcd.clear();

      }
    }
  }

  // Este valor de la variable se alcanza cuando se han acetado las contraseñas
  if(NumContrasena == 4){

    // Imprimir por pantalla LCD el estado del Sistema
    miMentorBitPantallas.lcd.setCursor(0,0);
    miMentorBitPantallas.lcd.print("Caja Fuerte");
    miMentorBitPantallas.lcd.setCursor(0,1);
    miMentorBitPantallas.lcd.print("Abierta!!!");

    // Bucle que se repite 3 veces
    for(int i = 0; i < 3; i++){

      // Encender el Led Rojo y Apagar los Leds Verde y Azul
      digitalWrite(LEDRojo,1);
      digitalWrite(LEDVerde,0);
      digitalWrite(LEDAzul,0);

      // Esperar 0.3 segundos
      delay(300);

      // Encender el Led Verde y Apagar los Leds Rojo y Azul
      digitalWrite(LEDRojo,0);
      digitalWrite(LEDVerde,1);
      digitalWrite(LEDAzul,0);

      // Esperar 0.3 segundos
      delay(300);

      // Encender el Led Azul y Apagar los Leds Rojo y Verde
      digitalWrite(LEDRojo,0);
      digitalWrite(LEDVerde,0);
      digitalWrite(LEDAzul,1);

      // Esperar 0.3 segundos
      delay(300);

    }

    // Apagar el Led Azul
    digitalWrite(LEDAzul,0);

    // Cambiar los valores de las variables a 1
    NumContrasena = 1;
    Reset = 1;

    // Limpiar la pantalla LCD
    miMentorBitPantallas.lcd.clear();

  }
}
Vistas
13 Número de vistas
13 Vistas de miembros
0 Vistas públicas
Acciones
0 Gustos
0 No me gusta
0 Comentarios
Compartir en redes sociales
Compartir enlace
Compartir por correo

Por favor iniciar sesión para compartir esto webpage por correo.