Diferencia entre revisiones de «Tip 3»
(→Código 3) |
(→Código 4) |
||
Línea 97: | Línea 97: | ||
<syntaxhighlight lang="c++"> | <syntaxhighlight lang="c++"> | ||
bool x; | bool x; | ||
+ | int n; | ||
void setup(){ | void setup(){ | ||
Serial.begin(115200); | Serial.begin(115200); |
Revisión actual del 16:40 25 sep 2019
Contenido
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
Referencias externas
- Saber nuestra IP por Mail - jojopapa