Cómo usar millis en Arduino, funciones de tiempo
Funciones de Tiempo en Arduino
Si eres nuevo con Arduino probablemente seguro que mucho tiempo en el Arduino Playground o en Internet, explorando y experimentando con los códigos que otros han escrito. A medida que ganes experiencia y empieces a escribir tus propios programas deberás entender la diferencia entre los comandos delay() y millis().
A pesar de compartir algunos puntos en común superficiales, estos dos comandos son bastante diferentes y útiles para diferentes tipos de aplicaciones. Aquí, aclararemos la diferencia y examinaremos cómo empezar a usar el comando Arduino millis() de forma efectiva.
delay() vs. millis()
Empecemos con las similitudes:
- Puedes utilizar los comandos delay() y milis() para regular el tiempo de las operaciones.
- Medimos ambos en milisegundos.
Las diferencias, sin embargo, son las que hacen que el comando millis() sea más importante y brille realmente. En pocas palabras, la diferencia principal es que el comando delay() regula el tiempo de una actividad, como por ejemplo el parpadeo de un LED, suspendiendo temporalmente casi todas las funciones de Arduino durante un tiempo específico. El comando millis(), por otro lado, basa su temporización en cambios en un temporizador que comienza en 0 y continúa avanzando, sin relación con otras actividades, luego se detiene y comienza de nuevo.
En términos prácticos, mientras que la función delay() interrumpe los otros procesos, esencialmente poniendo todo en espera, el comando millis() puede establecer el tiempo sin interrumpir otras funciones, permitiendo una especie de efecto «multitarea».
Para un sketch muy simple, como hacer que un LED parpadee sin otra funcionalidad, el comando delay() puede ser suficiente. Después de todo, la unidad no necesita lograr nada más en el tiempo que el LED esté encendido o apagado. Sin embargo, si tu proyecto implica más «piezas móviles», como el parpadeo del LED y la impresión periódica de un contador, necesitarás usar el comando millis() para hacerlo.
En tal caso, puedes utilizar el comando millis() para establecer que cada tarea ocurra cuando el contador alcance una cierta diferencia (como parpadear cada 500ms e imprimir cada 1500ms).
millis()
- Esta función devuelve el número de milisegundos transcurridos desde que la placa Arduino empezó a ejecutar el programa actual.
- Este número se desborda (vuelve a cero) después de aproximadamente 50 días.
- El valor devuelto por milis es un int. largo sin firmar.
- Ejemplo
- unsigned long time
time = millis()
- unsigned long time
delay(value)
- value : el número de milisegundos para pausar el programa.
- Esta función detiene el programa durante el número de milisegundos especificado.
Código de ejemplo
const byte ledPin = 13; //the number of the LED pin
byte ledState = 0; //ledState used to set the LED
unsigned long previousMillis1 = 0; //will store last time LED was updated
unsigned long interval1 = 500; //interval at which to blink (milliseconds)
unsigned long previousMillis2 = 0;
unsigned long interval2 = 1500;
unsigned int counter = 0;
void setup() {
Serial.begin(19200);
delay(2000);
pinMode(ledPin, OUTPUT); //set the digital pin as output:
}
void loop() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis1 > interval1) {
previousMillis1 = currentMillis; // save the last time I blinked the LED
//if the LED is off turn it on and vice-versa:
ledState ^= 1;
digitalWrite(ledPin, ledState);
}
currentMillis = millis();
if (currentMillis - previousMillis2 > interval2) {
previousMillis2 = currentMillis; // save the last time I printed on the serial
Serial.println(++counter);
}
}
Mirando el código anterior, que hemos desarrollado modificando ligeramente este código, puedes ver que el comando no detiene el funcionamiento total del Arduino. Por lo tanto, ambas tareas pueden ocurrir en sus propios tiempos sin interrupción.
micros() y Overflowing
Así como delay() tiene una versión de microsegundos llamada delayMicrosegundos(), millis() tiene micros(). Si necesitas una mejor definición para tu proyecto, micros() puede ser la opción que debas usar.
Sin embargo, debes tener en cuenta que micros() se desbordará después de aproximadamente 70 minutos, en comparación con los 50 días de milis(). Esto significa que los valores de retorno de las funciones comenzarán de nuevo desde cero.
Otras Funciones básicas relacionadas con el tiempo
Nos queda por ver la función micros()
micros()
- Esta función devuelve el número de microsegundos transcurridos desde que la placa Arduino empezó a ejecutar el programa actual.
- Este número se desborda (vuelve a cero) después de aproximadamente 70 minutos.
- El valor devuelto por los micros es un int. largo sin firmar.
- Ejemplo: unsigned long time
time = micros()
Tiempo de impresión transcurrido en microsegundos y milisegundos en el monitor serie de Arduino desde el momento en que se enciende el Arduino.
/* Printing time elapsed in microseconds and milliseconds on the serial monitor of Arduino from the time the Arduino is powered on */
unsigned long time_value;
/* Setup is run once at the start (Power-On or Reset) of sketch */
void setup()
{
pinMode(13, OUTPUT); /* Pin 13 is defined as Output */
Serial.begin(9600); /* opens serial port, sets data rate to 9600 bps */
}
/* Loop runs over and over after the startup function */
void loop()
{
digitalWrite(13, HIGH); /* Make pin 13 HIGH */
delay(2000); /* Wait for 2 seconds */
digitalWrite(13, LOW);
delayMicroseconds(100); /* Wait for 100 microseconds */
Serial.print("Time passed since power on in milliseconds:");
time_value = millis(); /* Read value of number of microseconds since program started executing */
Serial.println(time_value);
delay(2000);
Serial.print("Time passed since power on in microseconds:");
time_value = micros(); /* Read value of number of milliseconds since program started executing */
Serial.println(time_value);
delay(1000);
}
Conclusión
La función delay() es un gran punto de partida, y puedes utilizarla para realizar muchas tareas sencillas. Es uno de los primeros comandos que probablemente aprenderás, pero a medida que avances y desarrolles códigos más complicados, deberías familiarizarte con el comando millis(), que te permitirá ejecutar sketches más complicados con más tareas sin las paradas que causa delay(). Para una explicación más detallada de estos comandos y sus diferencias, echa un vistazo a este post en el Foro Arduino o en el tutorial de Norwegian Creations.