Diferencia entre revisiones de «Tip 3»

De ArduWiki
Saltar a: navegación, buscar
(Página creada con «== 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. == Código...»)
 
(Código 2)
Línea 45: Línea 45:
  
 
{{Nota|Veras que el valor de n se incrementa muy rápidamente en cada ciclo de loop().}}
 
{{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.
 +
 +
<syntaxhighlight lang="c++">
 +
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);
 +
  }
 +
}
 +
</syntaxhighlight>
 +
 +
{{Nota|Veras que cada LED puede ir a su propio ritmo de forma independiente.}}
  
 
== Vea también ==
 
== Vea también ==

Revisión del 19:14 18 sep 2019

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.

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.


Vea también

Tips


Referencias externas