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:
comparaciones de esta sumándole el tiempo que quiero que tarde en ejecutarse.
Hay que tener en cuenta dos cosas:
- Que este resultado no es preciso si hay algún delay que bloque el flujo del loop.
- 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();
}
}
// 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");}
}
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.
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