Contenido del curso

Problema 2

 

Luces Interactivas para una Gran Fiesta

Estás organizando una gran fiesta y has decidido que las luces jueguen un papel crucial en la ambientación. Para lograr un efecto especial, utilizarás un sistema de control de luces interactivas que respondan a tus instrucciones en tiempo real.

Para ello, vamos a utilizar los siguientes componentes del MentorBit:

  • 2 Botones

  • 2 Leds

  • Pantalla LCD

  • Display 7 Segmentos

Descripción de Sistema:

  • Botón de configuración (S1): Sirve para ajustar el tiempo de parpadeo de las luces. Mientras mantengas presionado el botón, una variable de tiempo (inicializada en 0) se incrementa de 200 en 200 milisegundos. Ese valor será utilizado como el intervalo de parpadeo de las luces.

  • Botón de activación (S2): Al pulsar este botón, el tiempo seleccionado se aplicará a las luces, que comenzarán a parpadear de manera intermitente según el valor almacenado en la variable. El valor de esta variable también se irá reduciendo progresivamente a medida que pasa el tiempo, haciendo que las luces parpadeen más rápido hasta detenerse.

Funcionamiento del Sistema:

  1. Mientras el botón S1 esté presionado, la pantalla LCD mostrará el mensaje "Cargando...", indicando que se está ajustando el tiempo de las luces.

  2. Al soltar S1, la variable dejará de incrementarse y el valor actual de la variable se mostrará en un display 7 segmentos.

  3. Al pulsar el botón S2, los LEDs comenzarán a parpadear en intervalos de tiempo iguales al valor de la variable un total de 10 veces.

    1. En la pantalla LCD aparecerá el mensaje "Felices Fiestas!!!"

    2. El display 7 segmentos mostrará el valor de las variable, que irá disminuyendo mientras los LEDs siguen parpadeando.

    3. Si se pulsa el botón S1 se cancela el parpadeo de los LEDs.

  4. Los LEDs continuarán parpadeando hasta que el valor de la variable llegue a 0, momento en el que el parpadeo cesará y la fiesta estará lista para comenzar con una iluminación perfecta.

Detalle del Hardware:

  • Botón S1: Sirve para ajustar el valor de la variable de tiempo, que determina el intervalo de parpadeo de las luces.

  • Botón S2: Aplica el valor de la variable a los LEDs, que parpadeará en intervalos de tiempo que corresponde al valor de la variable.

  • Pantalla LCD: Muestra los mensajes "Cargando..." mientras ajustas el tiempo, y "Felices Fiestas!!!" cuando los LEDs comienzan a parpadear.

  • LEDS: Parpadean según el valor seleccionado para crear el efecto de luces intermitentes 10 veces en total.

  • Display 7 segmentos: Muestra el valor de la variable que controla el parpadeo de las luces, decreciendo a medida que pasa el tiempo.

 

 

Tarea:

Escribe un programa que controle las luces de la fiesta siguiendo los siguientes pasos:

  1. Configuración del tiempo de parpadeo: Mientras se mantiene presionado S1, la variable de tiempo se incrementa de 200 en 200 milisegundos. Cuando se suelte el botón, la pantalla LCD deja de mostrar "Cargando..." mientras el valor se va reflejando en el display 7 segmentos.

  2. Aplicación del valor: Al pulsar S2, el valor seleccionado se asigna a los LEDs, que parpadearán de acuerdo con el intervalo de tiempo.

  3. Reducción del valor: Mientras los LEDs parpadean, el valor de la variable se reduce gradualmente en el display 7 segmentos hasta llegar a 0, momento en el que los LEDs dejan de parpadear, o pulsando el botón S1 para terminar el parpadeo.

Recuerda que el pin analógico lee de 0 a 1023, por tanto, para que se detecte que has pulsado el botón
el valor del pin tiene que ser mayor a 0, para mantener un margen de seguridad puede poner un número
más elevado, en este caso vamos a utilizar >100:


Para quitar de la pantalla LCD lo mostrado, "Cargando...", recuerda que puedes utilizar el bloque para
mostrar en pantalla vacío y limpiando antes de mostrar:


Un truco para salir de un bucle de repetición es decirle que repita el número de veces de una variable, por
ejemplo, "Repetir", darle un valor, y dentro del bucle, si se pulsa un botón cambiar la variable "Repetir" a 0:


Recuerda que el pin analógico lee de 0 a 1023, por tanto, para que se detecte que has pulsado el botón el
valor del pin tiene que ser mayor a 0, para mantener un margen de seguridad puede poner un número
más elevado, en este caso vamos a utilizar >100:

if(analogRead(A2)>100){

}
Para quitar de la pantalla LCD lo mostrado, "Cargando...", recuerda que puedes utilizar el comando para
limpiar la pantalla:

miMentorBitPantallas.lcd.clear();
Un truco para salir de un bucle de repetición es cambiar el valor de la variable i creada para hacer el
bucle, para ello, dentro del bucle se puede cambiar la variable "i" a un número mayor que "Repeticiones",
puedes poner un valor elevado también:

for (int i = 0; i < Repeticiones; i++){

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

        // Cambiar el valor de i a un número elevado para salir de bucle
        i = 1000;

    }
}
// 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
float Tiempo = 0;
int Repeticiones = 5;
int Contador = 0;

// Definir los pines en los que van conectados los componentes electrónicas
#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);

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

void loop() {

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

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

    // Imprimir por pantalla LCD el estado del Sistema
    miMentorBitPantallas.lcd.clear();
    miMentorBitPantallas.lcd.print("Cargando...");

    // La variable se incrementa en +0.2
    Tiempo += 0.2;

    //Esperar 1 segundo
    delay(1000);

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

  }

  // En caso de no pulsar el botón digital
  else{

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

  }

  // Leer el pin analógico A2, siendo este el botón normalmente en baja
  if(analogRead(A2) > 100){

    // Cambiar el valor de la variable a 5
    Contador = 5;

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

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

    // Blucle que dura el valor de la variable Repeticiones
    for (int i = 0; i < Repeticiones; i++){

      // Encender Led Rojo y Apagar Led Verde
      digitalWrite(LEDRojo, 1);
      digitalWrite(LEDVerde, 0);

      // Esperar lo indicado en el valor de Tiempo
      delay(Tiempo*1000);

      //Apagar Led Rojo y Encender Led Verde
      digitalWrite(LEDRojo, 0);
      digitalWrite(LEDVerde, 1);

      // Esperar lo indicado en el valor de Tiempo
      delay(Tiempo*1000);

      // Disminuir el valor de la variable Contador en -1
      Contador -= 1;

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

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

        // Cambiar el valor de i a un número elevado para salir de bucle
        i = 1000;

      }
    }

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

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

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

    //Esperar 1 segundo
    delay(1000);

  }
}

 

 

Desafío adicional 1:

Haz que el mensaje "Cargando..." en la pantalla LCD sea dinámica. Mientras el botón S1 esté presionado y el tiempo de parpadeo se esté ajustando, el mensaje deberá mostrar una animación en la que los puntos después de la palabra "Cargando" vayan apareciendo progresivamente, hasta completar tres puntos ("Cargando.", "Cargando.." y "Cargando..."). Luego, la secuencia debe reiniciarse, creando un efecto de movimiento.

Para mostrar un punto tras otro, en un tiempo determinado y que parezca que aparece de forma
dinámica puedes usar un bucle de repetir, junto a un bloque de esperar y finalmente que imprima por
pantalla dejando mensajes actuales:

Para mostrar un punto tras otro, en un tiempo determinado y que parezca que aparece de forma
dinámica puedes usar un comando de bucle de repetir, junto al comando de esperar y finalmente que
imprima por pantalla dejando mensajes actuales:

    // Hacer que la pantalla sea dinámica a través de un bucle
    for(int i = 0; i<=2;i++){

      //Esperar 0.25 segundos
      delay(250);

      //Imprimir un punto
      miMentorBitPantallas.lcd.print(".");

    }
// 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
float Tiempo = 0;
int Repeticiones = 5;
int Contador = 0;

// Definir los pines en los que van conectados los componentes electrónicas
#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);

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

void loop() {

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

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

    // Imprimir por pantalla LCD el estado del Sistema
    miMentorBitPantallas.lcd.clear();
    miMentorBitPantallas.lcd.print("Cargando");

    // Hacer que la pantalla sea dinámica a través de un bucle
    for(int i = 0; i<=2;i++){

      //Esperar 0.25 segundos
      delay(250);

      //Imprimir un punto
      miMentorBitPantallas.lcd.print(".");

    }

    // La variable se incrementa en +0.2
    Tiempo += 0.2;

    //Esperar 1 segundo
    delay(1000);

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

  }

  // En caso de no pulsar el botón digital
  else{

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

  }

  // Leer el pin analógico A2, siendo este el botón normalmente en baja
  if(analogRead(A2) > 100){

    // Cambiar el valor de la variable a 5
    Contador = 5;

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

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

    // Blucle que dura el valor de la variable Repeticiones
    for (int i = 0; i < Repeticiones; i++){

      // Encender Led Rojo y Apagar Led Verde
      digitalWrite(LEDRojo, 1);
      digitalWrite(LEDVerde, 0);

      // Esperar lo indicado en el valor de Tiempo
      delay(Tiempo*1000);

      //Apagar Led Rojo y Encender Led Verde
      digitalWrite(LEDRojo, 0);
      digitalWrite(LEDVerde, 1);

      // Esperar lo indicado en el valor de Tiempo
      delay(Tiempo*1000);

      // Disminuir el valor de la variable Contador en -1
      Contador -= 1;

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

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

        // Cambiar el valor de i a un número elevado para salir de bucle
        i = 1000;

      }
    }

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

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

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

    //Esperar 1 segundo
    delay(1000);

  }
}

 

 

Desafío adicional 2:

Añade una validación que limite el valor máximo de la variable para evitar que los LEDs parpadeen demasiado tiempo. Puedes mostrar un mensaje de error en la pantalla LCD si el valor excede un umbral predefinido, como "Tiempo máximo alcanzado".

No te olvides de que puedes utilizar dos bloques para mostrar en pantalla un mensaje en cada fila:
Recuerda que puedes utilizar el comando setCursor para desplazar la impresión en la pantalla LCD en la
fila de debajo:

      // Imprimir por pantalla LCD el estado del Sistema
      miMentorBitPantallas.lcd.clear();
      miMentorBitPantallas.lcd.print("Tiempo maximo");
      miMentorBitPantallas.lcd.setCursor(0,1);
      miMentorBitPantallas.lcd.print("alcanzado");
// 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
float Tiempo = 0;
int Repeticiones = 5;
int Contador = 0;

// Definir los pines en los que van conectados los componentes electrónicas
#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);

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

}

void loop() {

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

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

    // En caso de que el valor de la variable Tiempo sea igual o menor que 3
    if(Tiempo <= 2){

      // Imprimir por pantalla LCD el estado del Sistema
      miMentorBitPantallas.lcd.clear();
      miMentorBitPantallas.lcd.print("Cargando");

      // Hacer que la pantalla sea dinámica a través de un bucle
      for(int i = 0; i<=2;i++){

        //Esperar 0.25 segundos
        delay(250);

        //Imprimir un punto
        miMentorBitPantallas.lcd.print(".");

      }
      // La variable se incrementa en +0.2
      Tiempo += 0.2;

      //Esperar 0.25 segundos
      delay(250);

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

    // En caso de que el valor de la variable Tiempo sea mayor que 2
    if(Tiempo > 2){

      // Imprimir por pantalla LCD el estado del Sistema
      miMentorBitPantallas.lcd.clear();
      miMentorBitPantallas.lcd.print("Tiempo maximo");
      miMentorBitPantallas.lcd.setCursor(0,1);
      miMentorBitPantallas.lcd.print("alcanzado");

      //Esperar 0.25 segundos
      delay(250);

    }
  }

  // En caso de no pulsar el botón digital
  else{

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

  }

  // Leer el pin analógico A2, siendo este el botón normalmente en baja
  if(analogRead(A2) > 100){

    // Cambiar el valor de la variable a 5
    Contador = 5;

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

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

    // Blucle que dura el valor de la variable Repeticiones
    for (int i = 0; i < Repeticiones; i++){

      // Encender Led Rojo y Apagar Led Verde
      digitalWrite(LEDRojo, 1);
      digitalWrite(LEDVerde, 0);

      // Esperar lo indicado en el valor de Tiempo
      delay(Tiempo*1000);

      //Apagar Led Rojo y Encender Led Verde
      digitalWrite(LEDRojo, 0);
      digitalWrite(LEDVerde, 1);

      // Esperar lo indicado en el valor de Tiempo
      delay(Tiempo*1000);

      // Disminuir el valor de la variable Contador en -1
      Contador -= 1;

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

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

        // Cambiar el valor de i a un número elevado para salir de bucle
        i = 1000;

      }
    }

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

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

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

    //Esperar 1 segundo
    delay(1000);

  }
}

 

 

Desafío adicional 3:

Sustituye la función del botón S1 por un potenciómetro, ajustando el tiempo de cada parpadeo de los LEDs moviéndolo. Puedes ajustar el tiempo de parpadeo entre un tiempo máximo y un tiempo mínimo. Mientras no pulses el botón S2, en la pantalla LCD seguirá mostrando el mensaje estático "Cargando...".

Para este desafío hay que añadir el potenciómetro:



Recuerda usar el bloque mapear para transformar la señal del potenciómetro por los segundos deseados, ten en cuenta que este mapeo da como resultado un número entero, por lo que se aconseja multiplicar este
valor por 10 para posteriormente dividirlo entre 10 y así obtener 1 decimal:


Recuerda usar el comando map() para modificar el rango de una entrada de un valor a otro.

  // Cambiar el valor de la variable Tiempo respecto al potenciómetro
  Tiempo = map(analogRead(A0),0,1023,0,30);

  // Cambiar el valor de la variable Tiempo a si mismo dividido entre 10
  Tiempo = Tiempo/10;
// 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
float Tiempo = 0;
int Repeticiones = 5;
int Contador = 0;

// Definir los pines en los que van conectados los componentes electrónicas
#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);

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

}

void loop() {
  
  // Apagar los Leds Verde y Rojo
  digitalWrite(LEDVerde,0);
  digitalWrite(LEDRojo,0);

  // Cambiar el valor de la variable Tiempo respecto al potenciómetro
  Tiempo = map(analogRead(A0),0,1023,0,30);

  // Cambiar el valor de la variable Tiempo a si mismo dividido entre 10
  Tiempo = Tiempo/10;

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

  // Imprimir por pantalla LCD el estado del Sistema
  miMentorBitPantallas.lcd.clear();
  miMentorBitPantallas.lcd.print("Cargando...");

  //Esperar 0.1 segundos
  delay(100);

  // Leer el pin analógico A2, siendo este el botón normalmente en baja
  if(analogRead(A2) > 100){

    // Cambiar el valor de la variable a 5
    Contador = 5;

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

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

    // Blucle que dura el valor de la variable Repeticiones
    for (int i = 0; i < Repeticiones; i++){

      // Encender Led Rojo y Apagar Led Verde
      digitalWrite(LEDRojo, 1);
      digitalWrite(LEDVerde, 0);

      // Esperar lo indicado en el valor de Tiempo
      delay(Tiempo*1000);

      //Apagar Led Rojo y Encender Led Verde
      digitalWrite(LEDRojo, 0);
      digitalWrite(LEDVerde, 1);

      // Esperar lo indicado en el valor de Tiempo
      delay(Tiempo*1000);

      // Disminuir el valor de la variable Contador en -1
      Contador -= 1;

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

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

        // Cambiar el valor de i a un número elevado para salir de bucle
        i = 1000;

      }
    }

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

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

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

    //Esperar 1 segundo
    delay(1000);

  }
}
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.