Contenido del curso

Proyecto Final 2 

 

Controlador de Cortinas Automatizadas por Horario

Quieres mejorar la comodidad y la eficiencia energética en tu hogar. Quieres un sistema que controle automáticamente las cortinas de tu habitación, abriéndolas por la mañana para aprovechar la luz natural, y cerrándolas por la noche para mantener la privacidad y el calor. Este sistema debe ser programable, lo que te permitirá establecer horarios específicos para abrir y cerrar las cortinas según tus preferencias.

Tu tarea es programar el MentorBit para desarrollar un controlador de cortinas automatizadas que opere en función de horarios preestablecidos. El sistema debe utilizar un motor paso a paso para mover las cortinas y mostrar información sobre el estado de las cortinas en una pantalla.

Programaremos un menú en la pantalla LCD. Normalmente mostrará la hora actual y el estado de las cortinas (por ejemplo, "Cortinas abiertas" o "Cortinas cerradas"). Utilizarás el RTC para mantener un seguimiento de la hora actual. Utilizarás un potenciómetro y varios pulsadores para programar dos horarios: uno para abrir las cortinas y otro para cerrarlas.

Primero un pulsador te permitirá acceder al menú de programación. Una vez dentro del menú, podrás navegar entre las opciones disponibles, que incluyen "Apertura" y "Cierre", utilizando un segundo pulsador. Para ajustar la hora deseada en la opción seleccionada, se utilizará un tercer botón; simplemente, girando el potenciómetro: primero seleccionarás la hora, tras confirmar ésta, pasarás a seleccionar los minutos. Cuando hayas configurado el valor correcto, presiona el cuarto pulsador para confirmar la programación. También se mostrará un mensaje por pantalla cuando se haya programado un nuevo horario (por ejemplo, "Horario guardado"). Si en cualquier momento decides salir del menú, simplemente presiona nuevamente el primer botón que usaste para entrar, y volverás a la pantalla principal.

El motor paso a paso simulará la apertura y cierre de las persianas. Cuando la hora programada llegue, el sistema activará el motor para abrir o cerrar las cortinas, según se haya configurado.

Además, utiliza el LED Verde para indicar que las cortinas están abiertas y el LED Rojo para indicar que están cerradas. Puedes añadir un Zumbador, el cual emita un sonido corto cada vez que las cortinas se abran o cierren, proporcionando una señal adicional de que la acción se ha realizado.

Para ello vamos a utilizar los siguientes componentes del MentorBit:

  • 4 Pulsadores

  • Pantalla LCD

  • RTC

  • 2 LEDs

  • Potenciómetro

  • Motor Paso a Paso

  • Zumbador

// Proyecto - Control de cortinas automatizadas por horario

// Incluimos las librerías necesarias
#include <MentorBit.h>
#include <MentorBitMotores.h>
#include <MentorBitPantallas.h>
#include <MentorBitDataLogger.h>

// Creamos los objetos que nos permitan trabajar con las clases
MentorBit miMentorBit;
MentorBitPantallas miPantalla;
MentorBitMotores miMotor;
MentorBitDataLogger miRTC;

// Variables para guardar con nombres más intuitivos los pulsadores
int pulsador_acceso_menu = miMentorBit.PULSADOR_PULLDOWN_DIGITAL;
int pulsador_navegacion = miMentorBit.PULSADOR_PULLDOWN_ANALOGICO;
int pulsador_confirmacion_valor = miMentorBit.PULSADOR_PULLUP_DIGITAL;
int pulsador_confirmacion_global = miMentorBit.PULSADOR_PULLUP_ANALOGICO;

// Variables para guardar estado de acceso al menú y el menú en el estamos
bool estamos_dentro_de_un_menu = false;
int menu_actual = 0;

// Variable para guardar el estado de las cortinas (false: cerradas, true: abiertas)
bool estan_la_cortinas_abiertas = false;

// Variable para guardar el dato que se está modificando en el menú
bool estamos_ajustando_la_hora = true;

// Variables para guardar las horas y minutos de apertura y cierre
int hora_apertura = 8;
int minuto_apertura = 37;
int hora_cierre = 8;
int minuto_cierre = 38;

// Inicialización del código
void setup() {

    // Inicializamos y configuramos ambas pantallas (LCD y OLED)
    miPantalla.inicializarLCD();
    miPantalla.lcd.backlight();
    // Mostramos un mensaje inicial por la pantalla LCD
    miPantalla.lcd.setCursor(30);
    miPantalla.lcd.print("Control de");
    miPantalla.lcd.setCursor(41);
    miPantalla.lcd.print("Cortinas");
    // Inicializamos el RTC del MentorBit
    miRTC.inicializarRTC();
    miRTC.ajustarHoraRTC();
    // Configuramos el estado por defecto de las salidas
    digitalWrite(miMentorBit.LED_ROJO, LOW);
    digitalWrite(miMentorBit.LED_VERDE, LOW);
    noTone(miMentorBit.ZUMBADOR);
    // Esperamos un poco antes de empezar
    delay(2000);

}

// Bucle principal de funcionamiento
void loop() {

    // Comprobamos que se quiera acceder al menún
    if(!estamos_dentro_de_un_menu && (digitalRead(pulsador_acceso_menu) == HIGH)) {

        // Actualizamos el estado del menú y la edición
        estamos_dentro_de_un_menu = true;
        estamos_ajustando_la_hora = true;
        menu_actual = 0;
        // Esperamos un poco antes de continuar
        delay(500);

    }

    // Comprobamos que estemos en el menú
    if(estamos_dentro_de_un_menu) {

        // Mostramos el menú en pantalla
        miPantalla.lcd.clear();
        String hora = "";
        String minuto = "";

        // si queremos salir del menú en cualquier momento, volvemos a activar el pulsador
        if (digitalRead(pulsador_acceso_menu) == HIGH) {
          // Actualizamos el estado del menú y la edición
        estamos_dentro_de_un_menu = false;
        estamos_ajustando_la_hora = false;
        }


        // Comprobamos el menú que tengamos que mostrar
        if(menu_actual == 0) {

            // Mostramos el menú en el que estamos
            miPantalla.lcd.setCursor(00);
            miPantalla.lcd.print("Ajustar apertura");
            // Asignamos lo valores de hora y minuto de apertura para mostrarlos
            // añadimos un 0 a la hora y al minuto en el LCD, cuando son menores que 10
            // para simular el formato correcto de HH:MM
            if (hora_apertura < 10) {
              hora = "0" + String(hora_apertura);
            } else {
            hora = String(hora_apertura);
            }

            if(minuto_apertura < 10){
              minuto = "0" + String(minuto_apertura);
            } else {
            minuto = String(minuto_apertura);
            }
           

        } else { // menu_actual = 1

            // Mostramos el menú en el que estamos
            miPantalla.lcd.setCursor(00);
            miPantalla.lcd.print("Ajustar cierre");
            // Asignamos lo valores de hora y minuto de cierre para mostrarlos
            // añadimos un 0 a la hora y al minuto en el LCD, cuando son menores que 10
            // para simular el formato correcto de HH:MM
            if (hora_cierre < 10) {
              hora = "0" + String(hora_cierre);
            } else {
            hora = String(hora_cierre);
            }

            if(minuto_cierre < 10){
              minuto = "0" + String(minuto_cierre);
            } else {
            minuto = String(minuto_cierre);
            }
            

        }
        // Ajustamos el formato de los minutos cuando vale 0
        if(minuto == "0") {
            minuto += "0";
        }
        // Mostramos por pantalla el valor completo de Hora:Minuto
        miPantalla.lcd.setCursor(51);
        miPantalla.lcd.print(hora + ":" + minuto);
        // Ajustamos los valores con el potenciómetro
        int valor_seleccionado = analogRead(miMentorBit.POTENCIOMETRO);
        // convertimos el valor según lo que estemos editando (hora o minuto) y lo asignamos
        if(estamos_ajustando_la_hora) {
            if(menu_actual == 0) {
                hora_apertura = map(valor_seleccionado, 01023023);
            } else {
                hora_cierre = map(valor_seleccionado, 01023023);
            }
        } else {
            if(menu_actual == 0) {
                minuto_apertura = map(valor_seleccionado, 01023059);
            } else {
                minuto_cierre = map(valor_seleccionado, 01023059);
            }
        }
        // Comprobamos que se quiere confirmar el valor introducido
        if(digitalRead(pulsador_confirmacion_valor) == LOW) {

            // Cambiamos el indicador del valor que estamos introduciendo
            estamos_ajustando_la_hora = !estamos_ajustando_la_hora;
            // Esperamos un poco antes de continuar
            delay(200);

        }
        // Comprobamos que quiere cambiarse el menú actual
        if(digitalRead(pulsador_navegacion) == HIGH) {

            // Aumentamos en 1 el menú actual
            menu_actual++;
            // Comprobamos que no superemos el menú máximo
            if(menu_actual > 1) {
                menu_actual = 0; // Reiniciamos el menú mostrado
            }

        }
        // Comprobamos que se quiere confirmar la configuración
        if(digitalRead(pulsador_confirmacion_global) == LOW) {

            // Actualizamos el estado del menú
            estamos_dentro_de_un_menu = false;
            // Esperamos un poco antes de continuar
            delay(200);

        }

    // En el caso contrario (no estamos en el menú) mostramos la hora actual y el estado de las cortinas
    } else {

        // Obtenemos la fecha y hora del RTC
        String fecha_hora_actual = miRTC.obtenerHoraRTC();
        // Separamos la fecha y la hora en dos variables diferentes
        String fecha_actual = fecha_hora_actual.substring(010);
        String hora_actual = fecha_hora_actual.substring(11);
        // Mostramos la fecha actual en la pantalla LCD
        miPantalla.lcd.clear();
        miPantalla.lcd.setCursor(30);
        miPantalla.lcd.print(fecha_actual);
        // Mostramos la hora actual en la pantalla LCD
        miPantalla.lcd.setCursor(01);
        miPantalla.lcd.print(hora_actual);
        // Mostramos el estado de las persianas
        miPantalla.lcd.setCursor(91);
        if(estan_la_cortinas_abiertas) {
            miPantalla.lcd.print("Abierto");
        } else {
            miPantalla.lcd.print("Cerrado");
        }
        // Extraemos y convertimos en número la hora y el minuto actual
        int solo_hora_actual = fecha_hora_actual.substring(1113).toInt();
        int solo_minuto_actual = fecha_hora_actual.substring(1416).toInt();
        // Comprobamos que toque abrir las cortinas
        if((solo_hora_actual == hora_apertura) && (solo_minuto_actual == minuto_apertura)) {
            if(!estan_la_cortinas_abiertas) {

                // Simulamos que abrimos las cortinas
                miMotor.moverMotorPP(5000);
                // Configuramos el estado de los LEDs
                digitalWrite(miMentorBit.LED_ROJO, LOW);
                digitalWrite(miMentorBit.LED_VERDE, HIGH);
                // Generamos un tono de apertura con el Zumbador
                tone(miMentorBit.ZUMBADOR1000500);
                // Actualizamos el estado de las cortinas
                estan_la_cortinas_abiertas = true;
                // Esperamos un poco antes de continuar
                delay(200);

            }
        }
        // Comprobamos que toque cerrar las cortinas
        if((solo_hora_actual == hora_cierre) && (solo_minuto_actual == minuto_cierre)) {
            if(estan_la_cortinas_abiertas) {

                // Simulamos que cerramos las cortinas
                miMotor.moverMotorPP(5001);
                // Configuramos el estado de los LEDs
                digitalWrite(miMentorBit.LED_ROJO, HIGH);
                digitalWrite(miMentorBit.LED_VERDE, LOW);
                // Generamos un tono de apertura con el Zumbador
                tone(miMentorBit.ZUMBADOR1000500);
                // Actualizamos el estado de las cortinas
                estan_la_cortinas_abiertas = false;
                // Esperamos un poco antes de continuar
                delay(200);

            }
        }

    }

    // Esperamos un poco antes de continuar
    delay(250);

}
Vistas
17 Número de vistas
17 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.