lunes, 23 de diciembre de 2013

Temporizar la ejecuciones sin detener el flujo de loop()

En algunos proyectos he necesitado optimizar la lectura de sensores (por consumo de batería u otros motivos) y no medir en cada vuelta de loop(), pero que otros sensores si midieran en cada vuelta de loop.

Por ejemplo que cada 1 minuto leyera "sensor A" pero que cada 2 mida el "sensor B".

Se podría hacer con delay() y contadores de vueltas, pero el código se vuelve difícil de leer.
La solución es crear una variable global cargada con el resultado de millis() y hacer
comparaciones de esta sumándole el tiempo que quiero que tarde en ejecutarse.
Hay que tener en cuenta dos cosas:

  1. Que este resultado no es preciso si hay algún delay que bloque el flujo del loop.
  2. Que millis() devuelve el tiempo en milisegundos transcurridos desde que se arranco la placa Arduino con el programa actual. Este número de desbordará (volverá a cero), después de aproximadamente 50 días.
Bueno pues vamos a ver el código:

unsigned long Crono=0;
// Tiempo de espera para la ejecucion
unsigned int Tiemp=5000; // en milisegundo = 5 segundos

void setup(){
  Serial.begin(9600);
}

void loop(){
  if (( Crono+Tiemp)<millis()) {
    Serial.println("Crono 1");
    Crono=millis();
  }
}

Una vez entendido el funcionamiento os cuelgo la librería y el ejemplo que viene con ella:

#include <Cronos.h>

Cronos M1(1000); // este temporizador se ejecutara cada 1 segundo
Cronos M2(5000);   // este temporizador se ejecutara cada 5 segundos

void setup(){
  Serial.begin(9600);
}

void loop(){
  if(M1.Estado()){Serial.println("Crono 1");}
  if(M2.Estado()){Serial.println("Crono 2");}
}

Pondremos un if() evaluando el resultado de  Estado().  Estado() devuelve un false cuando no se ha cumplido el tiempo y un true cuando se cumplió reiniciando el crono. 

1 comentario:

  1. Exelente post, cual seria el limite de tiempo para Cronos M"x", es decir, el tiempo máximo al que respondería el temporizador

    ResponderEliminar