Arduino millis con Ejemplos y su uso

Arduino millis – Introducción

En Arduino millis es una función que se usa para medir tiempo. Está instrucción te da el tiempo en milisegundos desde que se encendió la tarjeta Arduino. Una de los principales usos es el determinar el tiempo que ha pasado entre dos o más procesos del programa principal. Por ejemplo, para evitar el debouce en un botón de entrada. Es decir, que mide el tiempo entre el primer pulso de entrada del boton hasta el tiempo X. Es decir hasta que pase un tiempo X después del primer impulso, es que se procede a ejecutar la función del botón.

Otra aplicación de la Arduino millis es la de averiguar el tiempo de ejecución en etapas criticas del código. Esto es para asegurar un tiempo real en la aplicación.

Es importante mencionar que el dato que regresa la función de Arduino millis, require de una variable del tipo unsigned long. Si se usará otra más pequeña pueden ocurrir errores de lógica.

Sintaxis:

Variable = millis();

Parámetros de entrada:

  • Ninguno.

Parámetros de salida:

  • Variable unsigned long. El valor de desbordamiento ocurriría a los 50 días aproximadamente.

 

Arduino millis - Introduccion

Ejemplos de uso

Ejemplo-1. Usando en Arduino millis, se imprimira cada segundo un mensaje sin usar retardos

En este ejemplo se hará uso de la función millis, se usará para calcular si ha pasado 1 segundo. Entonces para lograr este propósito se requieren dos variables del tipo u-long para guardar dos eventos de tiempo. La primera variable, tiempo-1, guardará el tiempo antes de ejecutar a la función loop indefinidamente. Posteriormente y en cada iteración de la función loop, se medirá el tiempo transcurrido y se guardará en la variable tiempo-2. Para luego en una sentencia «if» hacer una evaluación. Dicha evaluación permitirá ver si el tiempo-2 (Que se actualiza regularmente) ha superado a el tiempo inicial + 1000 milisegundos más. Esto indicaría que ha pasado 1 segundo de tiempo en el microcontrolador de Arduino.

Si esta sentencia es verdadera, entonces se harán tres cosas:

  • Actualizar el tiempo-1, para continuar con el siguiente segundo.
  • Calcular el tiempo en segundos desde que se prendio el Arduino, es decir, millis()/1000. Recordemos que 1000 misegundos son 1 segundo.
  • Imprimir el tiempo en segundos desde que se encendió el Arduino usando millis().

Código del ejemplo-1

 

Ejemplo-2 . Usar en el lenguaje Arduino a la función millis() para medir el tiempo entre dos mensajes seriales

Para este ejemplo, se usara a la función millis() para calcular el tiempo que ha transcurrido desde que un usuario ingresa la letra A y hasta que ingresa otra letra B.

Código del ejemplo-2.

Otras funciones de Arduino:

Autor:

Dr. Rubén E-Marmolejo

Profesor Universidad de Guadalajara, México

13 comentarios en «Arduino millis con Ejemplos y su uso»

  1. Desbordamiento de millis cada 49.71 dias
    Comentario y respuesta de mi código

    Yo tengo un código siguiente haciendo un escaneo cada 100 ms definí de esta forma
    debo acalarar que timer1 y timer 2 son double para llegar a tomar el valor máximo de millis()

    Ts es mi tiempo de muestreo

    Ts=100;

    timer1 = millis();
    if(timer2>millis()) {timer2=(4294967295-timer2)*-1;} //si el valor anterior es mayor al valor actual de millis(); se ha desbordado para ello se reasigna el valor de timer2
    if ((timer1 – timer2) >= Ts ||) // verifico si ha transcurridido el tiempo de muestreo
    {
    timer2 = timer1;

    ///// tu codigo

    }

    cuando ha ocurrido un desbordamiento la resta de timer1- timer2 considera el tiempo trasnscurrido antes del desbordamiento.
    ejemplo supongamos que millis(): va de 0 -1000
    timer1=650 y timer550 el código pasa sin problemas, pero si en un instante esta a punto de desbordarse, supongamos que timer2=950 y se desborda timer 1 toma un valor de timer1=30; entonces en este caso timer2 es mayor a timer1 por lo tanto realiza la operacion actualizando el valor de timer2=(1000-950)*-1=-50,
    entonces -50 es menor que millis por lo tanto no vuelve a entrar en esta función, pero espera que cumpla la condición,
    de
    if (timer1-timer2>=Ts) la operacion seria 30-(-20)>=100 por ley de signos seria 50 >=100 no cumple y espera otros 50 milisegundos hasta que el valor de de 80-(-20)>=100
    para entrar a la condicion del programa.
    Una vez adentro actualiza

    timer2=timer1 lo que es la operacion timer2=80;
    y asi se repite el ciclo

  2. gracias por la explicación, me quedan claras algunas cosas pero en otras no se como solventarlas.

    me gustaría saber si podrías auxiliarme con un ejemplo:
    «al presionar un botón debe encenderse un ed, permanecer encendido durante 8 segundos luego apagarse y no volverse a encender hasta que vuelva a presionar el botón»

  3. en el ejemplo 1 puedo usar ese mismo codigo para saber el tiempo que duro detectando un movimiento con el «pin de sensor de movimiento hc-sr501)
    porfavor decirme mi Whatsapp es 849 452 0216

  4. Hola, asi es, usas una variable para guardar a partir del momento que detectas el flanco del sensor, tan vez a traves de una interruptIn. Posterior cuando vuelve a ocurrir el flanco opuesto, vuelves a capturar en otra variable el tiempo y la resta del tiempo2 menos el tiempo1, seria el tiempo que estuvo activo el sensor.

  5. Buenas tardes, quiero que se realice una función de encendido randómico de leds, a los 30″ de estar parpadeando se incremente la velocidad que se realizan los destellos de cada uno. a los 30 » siguientes aumente la velocidad y así sucesivamente. O de lo contrario que por medio de un pulsador hacer que se incremente la velocidad hasta el siguiente pulsado.
    me podrian dar una solucion por favor me he releído los instructivos de arduino UNO pero no doy con la solución.
    Muchas gracias.-

    1. Edmundo, no me quedo muy clara la pregunta pero si lo que buscas es un generador de numeros aleatorios, arduino tiene una función que es random(min,max) donde min y máx son los valores minimo y maximo para la generación del numero.

  6. Buenos ejemplos, el segundo tiene algunos errores, en el IF de la letra B usa una operación and y debería ser or, aparte la resta de tiempo1 – tiempo2 es incorrecta debería ser al revés. Igual me sirvíó para darme una idea, gracias

  7. muy agradecido, porque ha usado parte de tu tiempo precioso en explicarle a los interesados en aprender arduino conceptos importantes, ayudándolos su formación.

  8. Buenos días. Gracias por compartir sus conocimientos.
    Aprovechando el primer ejemplo, intenté hacer algo similar, pero con los minutos. Sin embargo, solo me sirve para el primer minuto, después ya no cuenta más. ¡Sería tan amable de indicarme en dónde está la falla?
    unsigned long tiempo1 = 0;
    unsigned long tiempo2 = 0;
    unsigned long tiempoMinutos = 0;

    void setup() {
    Serial.begin(9600);
    tiempo1 = millis();

    }

    void loop() {

    tiempo2 = millis();
    if(tiempo2 > ((tiempo1+1000)*60)){ //Si ha pasado 1 minutos ejecuta el IF
    tiempo1 = millis(); //Actualiza el tiempo actual
    tiempoMinutos = tiempo1/60000;
    Serial.print(«Ha transcurrido: «);
    Serial.print(tiempoMinutos);
    Serial.println(» desde que se encendio el Arduino»);

    }

    }

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *