Tip 3

De ArduWiki
Revisión del 11:40 25 sep 2019 de Kike GL (Discusión | contribuciones) (Código 4)

(dif) ← Revisión anterior | Revisión actual (dif) | Revisión siguiente → (dif)
Saltar a: navegación, buscar

Descripción

Intentare explicar la diferencia entre usar delay() y millis().

Ambos códigos hacen lo mismo prender y apagar un LED cada 0.5 seg.

Tip: Este metodo permite a Arduino hacer mas cosas en el mismo ciclo.


Código 1

Este ejemplo funciona muy bien porque lo único que tiene que hacer Arduino es prender y apagar el LED. Pero si ademas quisieras hacer algo mas no funcionaria porque los delay() paralizan todas las operaciones y no habria tiempo para hacer nada mas. Aumentar el valor de n por ejemplo.

unsigned long n;
void setup(){
   Serial.begin(9600);
   pinMode(13, OUTPUT);
}
void loop(){
   digitalWrite(13, HIGH);       //Prende LED
   delay(500);                   //Espera 0.5 seg
   digitalWrite(13, LOW);        //Apaga LED
   delay(500);                   //Espera 0.5 seg
   n++;
   Serial.println(n);
}

Nota: Veras que el valor de n se incrementa cada 1 segundo.


Código 2

Con este codigo te das cuenta que Arduino puede hacer otras tareas (aumentar el valor de n por ejemplo), porque le sobra tiempo hasta que debe conmutar el LED, porque el corre a una velocidad muy superior. Aproximadamente a 16 MHz.

unsigned long n,t;
void setup(){
   Serial.begin(9600);
   pinMode(13, OUTPUT);
}
void loop(){
   if (millis() - t > 500){
      digitalWrite(13, !digitalRead(13));   //Conmuta LED
      t = millis();
   }
   n++;
   Serial.println(n);   
}

Nota: Veras que el valor de n se incrementa muy rápidamente en cada ciclo de loop().


Código 3

Con este código te das cuenta que Arduino puede aparentar multihilo haciendo que dos LED intermitentes a destiempo.

const byte pinRojo = 4;         //LED rojo
const byte pinVerde = 5;        //LED verde

bool estadoRojo;                //Estado LED rojo
unsigned long previoRojo;       //Ultimo cambio LED rojo
int intervaloRojo = 500;        //Intervalo LED rojo (milliseconds)

bool estadoVerde;               //Estado LED verde
unsigned long previoVerde;      //Ultimo cambio LED verde 
int intervaloVerde = 1000;      //Intervalo LED verde (milliseconds)

void setup() {
   pinMode(pinRojo, OUTPUT);
   pinMode(pinVerde, OUTPUT);  
}

void loop(){
   LedRojo();
   LedVerde();
}

void LedRojo(){
   if (millis() - previoRojo > intervaloRojo) {
      previoRojo = millis();  
      estadoRojo = !estadoRojo;
      digitalWrite(pinRojo, estadoRojo);
   }
}

void LedVerde(){
   if (millis() - previoVerde > intervaloVerde) {
      previoVerde = millis();  
      estadoVerde = !estadoVerde;
      digitalWrite(pinVerde, estadoVerde);
   }
}

Nota: Veras que cada LED puede ir a su propio ritmo de forma independiente.


Código 4

Se me ocurrio comparar la velocidad de algunas instrucciones.

bool x;
int n;
void setup(){
   Serial.begin(115200);
   pinMode(13, OUTPUT);
}
void loop(){
   //digitalWrite(13, !digitalRead(13));  //598 124
   digitalWrite(13, x);                   //787 629
   x = !x;
   //PORTB = PORTB ^ 32;                  //1446 372
   n++;
   if (millis() > 5000){
      Serial.println(n);
      while (1);
   }
}

Vea también

Tips


Referencias externas