✅ La función millis() en Arduino devuelve el tiempo en milisegundos desde que el programa inició. Es crucial para gestionar temporizadores sin bloquear el programa.
La función millis() en Arduino es una herramienta fundamental que permite medir el tiempo transcurrido desde que se inició el programa. Esta función devuelve el número de milisegundos que han pasado desde que se encendió la placa o se reinició el programa. Es muy útil para la creación de temporizadores, la ejecución de tareas a intervalos regulares y para controlar el tiempo sin bloquear el flujo del programa.
Exploraremos en profundidad cómo se utiliza la función millis() en Arduino, su sintaxis, ejemplos prácticos y algunas recomendaciones para su uso. Aprenderás a implementar esta función en tus proyectos para mejorar la eficiencia y la organización de tu código.
¿Cómo funciona la función millis()?
La función millis() devuelve un valor de tipo unsigned long, que representa el tiempo en milisegundos. Dado que este valor puede alcanzar hasta aproximadamente 49.7 días antes de reiniciarse, es importante tener en cuenta su límite al diseñar aplicaciones prolongadas.
Uso básico de millis()
La forma más básica de utilizar la función millis() es llamándola directamente en tu código. Aquí tienes un ejemplo simple:
void setup() { Serial.begin(9600); } void loop() { unsigned long tiempoActual = millis(); Serial.println(tiempoActual); delay(1000); // Espera 1 segundo }
En este ejemplo, simplemente imprimimos el tiempo transcurrido en milisegundos cada segundo. Esto muestra cómo funciona millis() y cómo se puede utilizar para llevar un control del tiempo en tu programa.
Implementaciones prácticas
A continuación, se presentan algunas implementaciones prácticas donde la función millis() puede ser extremadamente útil:
- Temporizadores: Puedes crear un temporizador sin bloquear el ciclo principal de ejecución de Arduino.
- Parpadeo de LEDs: Controlar el parpadeo de un LED a intervalos fijos sin usar la función delay().
- Monitoreo de eventos: Realizar acciones al pasar un período específico, como leer sensores a intervalos regulares.
Ejemplo de un LED parpadeante
A continuación, se presenta un ejemplo que utiliza millis() para parpadear un LED:
const int ledPin = 13; // Pin del LED unsigned long tiempoAnterior = 0; // Almacena el último tiempo registrado const long intervalo = 1000; // Intervalo de 1 segundo void setup() { pinMode(ledPin, OUTPUT); } void loop() { unsigned long tiempoActual = millis(); if (tiempoActual - tiempoAnterior >= intervalo) { tiempoAnterior = tiempoActual; // Actualiza el tiempo anterior digitalWrite(ledPin, !digitalRead(ledPin)); // Cambia el estado del LED } }
En este código, el LED conectado al pin 13 parpadeará cada segundo sin bloquear el ciclo del programa, demostrando una de las ventajas de usar millis().
Recomendaciones al usar millis()
Al implementar la función millis(), es recomendable seguir algunas prácticas para evitar problemas comunes:
- Evitar el uso de variables globales: Si es posible, utiliza variables locales para evitar conflictos entre diferentes partes de tu código.
- Controlar el rollover: Cuando el contador de milisegundos se reinicie, asegúrate de que tu lógica siga funcionando correctamente.
- Usar funciones para manejar temporizadores: Considera crear funciones específicas para manejar tareas basadas en tiempo, lo que puede simplificar tu código.
Ejemplos prácticos de uso de millis() en proyectos Arduino
La función millis() es una herramienta poderosa en el mundo de Arduino, permitiendo realizar tareas de temporización sin bloquear el flujo del programa. A continuación, exploraremos algunos ejemplos prácticos que ilustran su utilidad.
1. Parpadeo de un LED sin delay
Un uso básico de millis() es controlar el parpadeo de un LED. A diferencia del uso de delay(), que detiene la ejecución del código, millis() permite seguir realizando otras tareas. Aquí tienes un ejemplo:
int ledPin = 13; // Pin del LED unsigned long previousMillis = 0; // Almacena el tiempo anterior const long interval = 1000; // Intervalo de parpadeo en milisegundos void setup() { pinMode(ledPin, OUTPUT); } void loop() { unsigned long currentMillis = millis(); // Captura el tiempo actual if (currentMillis - previousMillis >= interval) { previousMillis = currentMillis; // Guarda el tiempo actual digitalWrite(ledPin, !digitalRead(ledPin)); // Cambia el estado del LED } }
2. Control de un motor con temporizador
En proyectos donde se requiera el control de motores, millis() puede ser utilizado para activar un motor por un período específico. Por ejemplo, activa un motor durante 5 segundos y luego lo detiene:
int motorPin = 9; // Pin del motor unsigned long motorStartMillis = 0; // Tiempo de inicio bool motorRunning = false; // Estado del motor void setup() { pinMode(motorPin, OUTPUT); } void loop() { if (!motorRunning) { digitalWrite(motorPin, HIGH); // Activa el motor motorStartMillis = millis(); // Guarda el tiempo de inicio motorRunning = true; // Actualiza el estado } if (motorRunning && millis() - motorStartMillis >= 5000) { // 5000 ms = 5 segundos digitalWrite(motorPin, LOW); // Detiene el motor motorRunning = false; // Actualiza el estado } }
3. Temporizador de cuenta regresiva
Otra aplicación interesante de millis() es la implementación de un temporizador de cuenta regresiva. Esto es útil para tareas como apagar un dispositivo después de un tiempo determinado:
unsigned long countdownMillis = 10000; // 10 segundos unsigned long startMillis; // Tiempo de inicio bool countdownActive = false; void setup() { Serial.begin(9600); } void loop() { if (!countdownActive) { startMillis = millis(); // Guarda el tiempo de inicio countdownActive = true; // Cambia estado } unsigned long elapsedMillis = millis() - startMillis; if (elapsedMillis < countdownMillis) { Serial.print("Tiempo restante: "); Serial.println((countdownMillis - elapsedMillis) / 1000); // Muestra el tiempo restante en segundos } else { Serial.println("¡Tiempo agotado!"); countdownActive = false; // Reinicia el temporizador } }
Consejos prácticos
- Prueba diferentes intervalos: Experimenta con los valores de tiempo en los ejemplos para ver cómo cambia el comportamiento.
- Combina funciones: Intenta usar millis() junto con otros sensores y actuadores para crear proyectos más complejos.
Con estos ejemplos, hemos tocado solo la superficie de lo que se puede lograr con millis(). A medida que te familiarices más con esta función, descubrirás su potencial en la creación de proyectos dinámicos y eficientes.
Preguntas frecuentes
¿Qué hace la función millis() en Arduino?
La función millis() devuelve el tiempo en milisegundos desde que el Arduino se encendió. Es útil para medir intervalos de tiempo.
¿Cómo se usa millis() para crear retardos sin bloquear el programa?
Almacena el valor de millis() en una variable y lo compara en un bucle para ejecutar acciones tras un tiempo determinado sin usar delay().
¿Es millis() precisa para tiempos largos?
Millis() es precisa para intervalos cortos, pero puede perder precisión en tiempos prolongados debido a un desbordamiento después de aproximadamente 50 días.
¿Puedo usar millis() en lugar de delay()?
Sí, millis() es ideal para mantener la ejecución del programa fluida, permitiendo realizar otras tareas mientras se espera.
¿Qué pasa si uso millis() en un bucle infinito?
Si usas millis() en un bucle infinito sin condiciones de salida, puede llevar a un mal rendimiento o hacer que el programa no responda correctamente.
Puntos clave sobre la función millis()
- Devuelve el tiempo en milisegundos desde el encendido.
- Útil para medir intervalos sin detener el programa.
- Precisión adecuada para tiempos cortos.
- Desbordamiento después de 50 días de funcionamiento continuo.
- Permite realizar múltiples tareas de forma simultánea.
- Ideal para proyectos que requieren temporización precisa.
- Uso común en proyectos de control de luces, motores, y más.
¡Nos gustaría saber tu opinión! Deja tus comentarios sobre este artículo y no olvides revisar otros artículos en nuestra web que podrían interesarte.






