Contenido del curso

Actividad 29

 

Registro de eventos con Micro SD y RTC

Imagina que estás programando un sistema que registra el accionamiento de la puerta de garaje de una comunidad de vecinos. Simularemos la apertura de la puerta con un pulsador y mostraremos la hora en tiempo real en la pantalla LCD. Para registrar las aperturas, imprimiremos en la pantalla OLED los tres últimos accionamientos de la puerta (mostrando fecha y hora de cada uno). Además, llevaremos la cuenta de las veces que la puerta se ha abierto en un archivo que llamaremos "Apertura.txt" dentro de la Tarjeta Micro SD. Los registros que guardemos en el archivo deben ir acompañados de la fecha y la hora en que se realizó la apertura.

Como añadido para completar la actividad, deberemos programar el MentorBit para que cada pulsación del botón sea una de la acciones posibles sobre la puerta (abrir o cerrar) de manera que la primera vez que accionemos el pulsador, la puerta quedará abierta, y la siguiente vez quedará cerrada, y así sucesivamente. También añadiremos un LED Rojo para indicar que la puerta está cerrada, y un LED Verde para indicar que está abierta.

Por último, mostraremos la cuenta de aperturas por el Display 7 Segmentos.





Puedes descargar la solución pinchando en el siguiente icono:



#include <MentorBit.h>
#include <MentorBitDisplay.h>
#include <MentorBitPantallas.h>
#include <MentorBitDataLogger.h>

// Declaración de instancia de la clase
MentorBit miMentorBit;
MentorBitDisplay miDisplay;
MentorBitPantallas misPantallas;
MentorBitDataLogger miDataLogger;

// Variable con el nombre del Archivo que vamos a emplear
String archivo = "Apertura.txt";

// Variable con la cuenta de aperturas
int cuenta_aperturas = 0;
int cuenta_aperturas_OLED = 0;
int fila_OLED = 14;
// Array con las aperturas
String aperturas[3] = {""""""};

// Variable para guardar el estado de la puerta
bool la_puerta_esta_abierta = false;

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

    // Inicializamos y configuramos la pantalla LCD
    misPantallas.inicializarLCD();
    misPantallas.lcd.backlight();
    misPantallas.lcd.clear();
    // Mostramos un mensaje inicial por la LCD
    misPantallas.lcd.setCursor(30);
    misPantallas.lcd.print("Registro de");
    misPantallas.lcd.setCursor(31);
    misPantallas.lcd.print("eventos");

    // Inicializamos y configuramos la pantalla OLED
    misPantallas.inicializarOLED();
    misPantallas.oled.setTextColor(SSD1306_WHITE);
    misPantallas.oled.setTextSize(1);
    // Mostramos un mensaje inicial por la OLED
    misPantallas.oled.setCursor(00);
    misPantallas.oled.println("Registros");
    misPantallas.oled.display();

    // Inicalizamos el RTC
    miDataLogger.inicializarRTC();
    // Configuramos el RTC con la fecha y la hora del PC
    miDataLogger.ajustarHoraRTC();
    // Comprobamos que la Tarjeta Micro SD se inicialice correctamente
    if(!miDataLogger.inicializarSD()) {
        // Mostramos un mensaje por Pantalla LCD indicando un error con la SD
        misPantallas.lcd.setCursor(00);
        misPantallas.lcd.print("Problema con la");
        misPantallas.lcd.setCursor(01);
        misPantallas.lcd.print("Micro SD");
        while(true) {} // Código bloqueante para no avanzar sin Tarjeta Micro SD
    }
    // Guardamos un primer mensaje distintivo al comienzo de la cuenta
    miDataLogger.escribirEnArchivo(archivo, "---- Registro de aperturas ----");

    // Inicializamos el Display 7 Segmentos
    miDisplay.inicializarDisplay();

    // Configuramos el estado por defecto de los LEDs indicadores
    digitalWrite(miMentorBit.LED_ROJO, HIGH);
    digitalWrite(miMentorBit.LED_VERDE, LOW);

    // Esperamos un poco antes de empezar
    delay(2000);

}

// Bucle principal del sketch
void loop() {

    // Obtenemos la fecha y hora del RTC
    String fecha_hora_actual = miDataLogger.obtenerHoraRTC();
    // Separamos la fecha del resto de la cadena
    String fecha_actual = fecha_hora_actual.substring(010);
    // Separamos la hora del resto de la cadena
    String hora_actual = fecha_hora_actual.substring(11);

    // Comprobamos que se acciona el pulsador con la puerta cerrada
    if(!la_puerta_esta_abierta && (digitalRead(miMentorBit.PULSADOR_PULLDOWN_DIGITAL) == HIGH)) {

        // Aumentamos en 1 el número de cuenta_aperturas
        cuenta_aperturas++;
        //Apagamos led rojo y encendemos el verde (puerta abierta)
        digitalWrite(miMentorBit.LED_ROJO, LOW);
        digitalWrite(miMentorBit.LED_VERDE, HIGH);
        // Actualizamos el estado de la puerta
        la_puerta_esta_abierta = true;
        // Actualizamos la cuenta en el Display 7 Segmentos
        miDisplay.imprimir(cuenta_aperturas);
        // Guardamos la apertura en el Array y movemos los elementos una posición
        aperturas[2] = aperturas[1];
        aperturas[1] = aperturas[0];
        aperturas[0] = String(cuenta_aperturas) + " " + fecha_actual + " " + hora_actual;
        // Guardamos el número de cuenta_aperturas en el archvo
        miDataLogger.escribirEnArchivo(archivo, aperturas[0]);
        if(cuenta_aperturas_OLED > 2){
        // Vaciamos la pantalla OLED
        misPantallas.oled.clearDisplay();
        // Reseteamos la variable para mostrar las últimas aperturas en la pantalla OLED
        cuenta_aperturas_OLED=0;
        fila_OLED=14;
        }
        if(cuenta_aperturas_OLED == 0){
        // Vaciamos la pantalla OLED
        misPantallas.oled.clearDisplay();
        }
        // Imprimimos el mensaje por defecto
        misPantallas.oled.setCursor(00);
        misPantallas.oled.println("Registros");
        // Imprimimos la hora actual
        misPantallas.oled.setCursor(14, fila_OLED);
        misPantallas.oled.println(fecha_actual + " " + hora_actual);
        fila_OLED = fila_OLED + 14;
        cuenta_aperturas_OLED++;
        // Actualizamos nuestra OLED
        misPantallas.oled.display();
        // Esperamos un poco antes de continuar
        delay(300);

    // Comprobamos que se accione el pulsador con la puerta abierta
    } else if(la_puerta_esta_abierta && (digitalRead(miMentorBit.PULSADOR_PULLDOWN_DIGITAL) == HIGH)) {

        // Actualizamos el estado de la puerta
        la_puerta_esta_abierta = false;
        //Apagamos led verde y encendemos el rojo (puerta cerrada)
        digitalWrite(miMentorBit.LED_ROJO, HIGH);
        digitalWrite(miMentorBit.LED_VERDE, LOW);
        // Esperamos un poco antes de continuar
        delay(300);

    }

    // Limpiamos la pantalla LCD
    misPantallas.lcd.clear();
    // Imprimimos en la primera línea la fecha actual
    misPantallas.lcd.setCursor(30);
    misPantallas.lcd.print(fecha_actual);
    // Imprimimos en la primera línea la hora actual
    misPantallas.lcd.setCursor(41);
    misPantallas.lcd.print(hora_actual);
    // Esperamos un poco antes de continuar
    delay(200);

}

La solución sin utilizar nuestra librería no está disponible actualmente.
Vistas
8 Número de vistas
8 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.