Millis (): tot el que cal saber de la funció d'Arduino

Arduino UNO funcions Millis

Arduino compta amb un bon repertori de funcions per treballar amb el temps. Una d'elles és Millis (), Una instrucció que et dóna el temps en mil·lisegons des que s'encén la placa Arduino. Això pot semblar una mica absurd, i que només serveix per saber quan es va encendre la placa, però la veritat és que té moltes més aplicacions pràctiques.

Per EXEMPLE, Et pot servir per determinar el temps que ha passat entre dos o més esdeveniments, evitar el debounce (rebot) d'un botó, etc. També podria servir per mostrar el temps d'execució en etapes crítiques de el codi, assegurant que el programa funciona en temps real.

Funció Millis ()

Millis funció Arduino

Com ja he comentat, la funció Millis d'Arduino serveix per mesurar el temps, i ho fa en mil·lisegons (ms), D'aquí el seu nom. Dit d'una altra manera, el valor numèric que retorna aquesta funció quan la inclous en el teu sketch és una dada temporal expressat en aquesta unitat.

Has de saber que el valor màxim d'aquesta variable és sense signar llarg, És a dir, llarga sense signe. Això és important, ja que si es fa servir una altra més petita podrien ocórrer problemes de lògica. A més, has de saber que pot prolongar-se fins a 50 dies de temps (4.320.000.000 ms), un cop arribat a aquest valor es reiniciarà i començarà novament de zero.

Una altra de les coses que has de saber és que la funció Millis no fa servir paràmetres.

Altres funcions temporals d'Arduino

Arduino compta amb altres funcions referents a el temps perquè puguis utilitzar en els teus codis. Una d'elles és la famosa delay (), Però hi ha més:

  • retard(): És la més utilitzada i comú de totes les funcions d'Arduino. També fa servir els mil·lisegons com Millis (). I també serà de tipus unsigned long, a més de no tenir un valor de retorn. S'usa principalment per introduir pauses en l'execució d'un programa, amb nombroses aplicacions.
  • delayMicroseconds (): És menys usada en els esquetxos, en aquest cas segueix sent unsigned long, sense valor de retorn, i en aquest cas fa servir microsegons. Actualment es pot aconseguir un valor màxim amb precisió de 16383, i la mínima de 3μs. Si has de gestionar esperes més grans que aquesta es recomana usar delay ().
  • micros (): També retorna un valor numèric en microsegons (μs) des que la placa Arduino va començar a executar el programa. És a dir, és com Millis (), però amb una altra unitat. De fet, també usa el tipus unsigned long i tampoc fa servir paràmetres. Però té algunes diferències addicionals, com que es reseteja i comença de zero quan arriba a 70 minuts. Quant a la seva resolució de 4 μs, o dit d'una altra manera, el valor que retorna sempre serà un múltiple de quatre (4, 8, 12, 16, ...). Recorda que 1000 μs equivalen a 1 ms i 1.000.000 a 1 s.

Exemples de Millis () en Arduino IDE

Captura d'Arduino IDE

Tot això són paraules, i com millor es veu la funció Millis () és mostrant alguns exemples de senzills esquetxos en Arduino IDE perquè vegis algunes aplicacions i casos d'ús. Així que aquí tens alguns exemples pràctics...

1-Exemple per explicar l'ús de Millis ():

unsigned long inicio, fin, transcurrido;  // Declarar las variables a usar
void setup(){
   Serial.begin(9600);  //Iniciar la comunicación serial
}
void loop(){
   inicio=millis();  //Consultar ms desde que inició la ejecución del sketch
   delay(1000);  //Espera 1 segundo
   fin=millis();  //Consultar ms fin del sketch
   transcurrido=fin-inicio;  //Calcula el tiempo desde la última lectura
   Serial.println(transcurrido);  //Muestra el resultado en el monitor serial
   delay(500);  //Esperar medio segundo
}

Mesurar el temps entre dos missatges serials:

unsigned long tiempo1 = 0;  //Declaramos las variables e iniciamos a 0
unsigned long tiempo2 = 0;
unsigned long diferenciaTiempo = 0;
void setup() {
  Serial.begin(9600);
  Serial.println("Envía la letra A/a por la terminal serial");
}

void loop() {
  if(Serial.available() > 0){
     char datoRecibido = Serial.read();
     if(datoRecibido == 'A' || datoRecibido == 'a'){
        tiempo1 = millis();
        Serial.println("Envía la letra B/b por la terminal Serial");
     }
     else if(datoRecibido == 'b' && datoRecibido == 'B'){
        tiempo2 = millis();
        diferenciaTiempo = tiempo1-tiempo2;
        Serial.print("El tiempo transcurrido entre el primer y último dato enviado es: ");
        Serial.print(diferenciaTiempo);
     }
   }
}

Fer titil·lar un LED amb Millis ():

int estadoLed;  //Almacena el estado del LED (Encendido o apagado)
int periodo = 100;  //Tiempo que está el LED encendido o apagado
unsigned long tiempoAnterior = 0;  //Almacena tiempo de referencia para comparar
void setup() {
    pinMode(13,OUTPUT);  //Configura el pin 13 como salida para el LED
}
void loop() {
  if(millis()-tiempoAnterior>=periodo){  //Evalúa si ha transcurrido el periodo programado
    estadoLed=!estadoLed;  //Cambia el estado del LED cada 100ms
    digitalWrite(13,estadoLed);  //Actualiza el estado del LED al actual
    tiempoAnterior=millis();  //Almacena el tiempo actual como referencia
    }
}

crear un simple seqüenciador perquè enviï text pel monitor serial en diferents intervals de temps usant Millis ():

#define INTERVALO_MENSAJE1 3000
#define INTERVALO_MENSAJE2 5000
#define INTERVALO_MENSAJE3 7000
#define INTERVALO_MENSAJE4 15000
 
unsigned long tiempo_1 = 0;
unsigned long tiempo_2 = 0;
unsigned long tiempo_3 = 0;
unsigned long tiempo_4 = 0;
 
void print_tiempo(unsigned long tiempo_millis);
 
void setup() {
    Serial.begin(9600);
}
 
void loop() {
    if(millis() > tiempo_1 + INTERVALO_MENSAJE1){
        tiempo_1 = millis();
        print_tiempo(tiempo_1);
        Serial.println("Soy");
    }
   
    if(millis() > tiempo_2 + INTERVALO_MENSAJE2){
        tiempo_2 = millis();
        print_tiempo(tiempo_2);
        Serial.println("Un mensaje");
    }
   
    if(millis() > tiempo_3 + INTERVALO_MENSAJE3){
        tiempo_3 = millis();
        print_tiempo(tiempo_3);
        Serial.println("De");
    }
   
    if(millis() > tiempo_4 + INTERVALO_MENSAJE4){
        tiempo_4 = millis();
        print_tiempo(tiempo_4);
        Serial.println("Esperanza");
    }
}
 
void print_tiempo(unsigned long tiempo_millis){
    Serial.print("Tiempo: ");
    Serial.print(tiempo_millis/1000);
    Serial.print("s - ");
}

Ja saps que per Més informació pots descarregar el curs gratis de programació d'Arduino en PDF.


Sigues el primer a comentar

Deixa el teu comentari

La seva adreça de correu electrònic no es publicarà. Els camps obligatoris estan marcats amb *

*

*

  1. Responsable de les dades: Miguel Ángel Gatón
  2. Finalitat de les dades: Controlar l'SPAM, gestió de comentaris.
  3. Legitimació: El teu consentiment
  4. Comunicació de les dades: No es comunicaran les dades a tercers excepte per obligació legal.
  5. Emmagatzematge de les dades: Base de dades allotjada en Occentus Networks (UE)
  6. Drets: En qualsevol moment pots limitar, recuperar i esborrar la teva informació.