MEF en Arduino¶

Para implementar MEF en Arduino debemos estudiar un concepto clave y es el tiempo relativo.

Tiempo relativo¶

El concepto de tiempo relativo no permite sabe cuanto tiempo a pasado desde un evento anterior a través de una sustracción.

  • Permite el procesamiento de tiempo
  • Permite tener multiples tareas en un microcontrolador
  • Mejora el rendimiento de del microcontrolador

Tiempo relativo con un reloj¶

  • ¿ Para poder responder a la siguiente pregunta que necesito saber ?
    • ¿ Cuantos minutos han pasado desde que inicio la clase ?
  • Necesito saber el tiempo "absoluto" actual.
  • Necesito saber el tiempo "absoluto" del inicio de la clase (el evento).

Tiempo relativo con Arduino¶

En Arduino existen dos funciones que están relacionadas con el tiempo:

  • millis() que retorna el tiempo en milisegundos que el Arduino lleva encendido.
  • micros() que retorna el tiempo en microsegundos que el Arduino lleva encendido.

Estás funciones nos permiten tener encuenta retardo sin frenar la ejecución del código. Para usar el tiempo relativo necesitamos $3$ variables:

  • unsigned long tini; Tiempo de inicio, esta variable se actualiza cuando ocurre el inicio del evento para el cual queremos contar tiempo.
  • unsigned long tact; Tiempo actual, esta variable se actualiza en cada ciclo de ejecución (en el loop())
  • unsigned long trel; Diferencia de tiempo entre el tiempo actual y el tiempo de inicio, esta variable se actualiza a discresión de las necesidades del programa.

Ejemplo de Parpadeo con tiempo relativo¶

💾 Código Parpadeo con tiempo relativo

// Definimos etiquetas
#define L1 2 // Etiquetamos el LED conectado al pin 2 como "L1"

// Declaramos constantes
const unsigned long TBlink = 500; // Constante para el tiempo de parpadeo de 500ms

// Declaramos variables
bool encendido = false;
unsigned long tini, tact, trel;

void setup() {
  // Configuramos los pines
  pinMode(L1, OUTPUT); // Definimos L1 como una salida
  // Limpieza de la salida por seguridad
  digitalWrite(L1, LOW); // Apagamos L1
  tini = millis(); // Iniciamos la marca de tiempo 
}

void loop() {
  tact = millis();    // Tomamos el tiempo actual
  trel = tact-tini;   // Calculamos el tiempo que a pasado desde tini
  if(trel > TBlink){  // Si ha pasado más tiempo que TBlink
    tini = tact;      // Actualizamos el tini
    encendido = !encendido; // Cambiamo el estado de encendido
  }
  digitalWrite(L1, encendido);   // Enviamos información a L1

Estructura de un código MEF en Arduino¶

/* 1:  Declaración de libreria      */  #include <SFEMP3Shield.h>
/* 2.1:  Definición de ESTADOS      */  #define SOFF 0
/* 2:  Definición de etiquetas      */  #define LEDPIN 3
/* 3:  Declaración de constantes    */  const unsigned int contMax = 10;
/* 4:  Declaración de variables     */  float temperature = 0;
/* 5:  Declaración de subrutinas    */  void readSensor(){
                                            int y = analogRead(1);
                                            temperature = 100.0*y/1023.0;
                                        }
/* 6:  Declaración de funciones     */  int sum(int x, int y){
                                            return x + y;
                                        }
/* 7:  Subrutina de configuración   */  void setup(){...}
/* 8:  Subrutina de ejecución inf.  */  void loop(){...
/* 8.1:  Se define dentro de loop 
         la MEF en un Switch Case */        switch(state){}
                                        }

MEF de seguridad en la oscuridad¶

Hacer un MEF que mantenga un "bombillo" apagada mientras haya suficiente luz ambiente, en caso de faltar luz, el "bombillo" parpadeará con el siguiente patrón : 2 segundos encendido y 1 segundo apagado.

💾 Código MEF de seguridad en la oscuridad

MEF de seguridad en la oscuridad con SOS¶

Usar el patrón de SOS en morse para el patrón de parpadeo.

SOS

Solución MEF SOS¶

💾 Código MEF de seguridad con SOS