Curso C para Arduino

delay(): Pausas simples

La función delay() detiene la ejecución del programa durante una cantidad de milisegundos especificada. Es útil para tareas simples donde no importa que el microcontrolador se detenga temporalmente.

Sintaxis:

1delay(milisegundos);

Ejemplo:

1digitalWrite(13, HIGH);
2delay(1000); // espera 1 segundo
3digitalWrite(13, LOW);
4delay(1000); // espera otro segundo

Desventaja:
Mientras se ejecuta delay(), Arduino no puede hacer nada más. No puede leer sensores ni responder a eventos.


millis(): Medición de tiempo sin bloquear

millis() devuelve el número de milisegundos que han pasado desde que la placa comenzó a ejecutarse. Con esta función puedes controlar el tiempo sin detener la ejecución del programa.

Sintaxis:

1unsigned long tiempo = millis();

Ejemplo - Parpadeo sin delay():

1const int pinLED = 13;
2unsigned long tiempoAnterior = 0;
3const long intervalo = 1000; // 1 segundo
4bool estadoLED = false;
5
6void setup() {
7  pinMode(pinLED, OUTPUT);
8}
9
10void loop() {
11  unsigned long tiempoActual = millis();
12
13  if (tiempoActual - tiempoAnterior >= intervalo) {
14    tiempoAnterior = tiempoActual;
15
16    estadoLED = !estadoLED; // alterna el estado del LED
17    digitalWrite(pinLED, estadoLED);
18  }
19}

Este enfoque permite realizar otras tareas mientras el LED parpadea.


Temporizadores simples

Puedes usar millis() para ejecutar diferentes tareas con diferentes intervalos en paralelo.

Ejemplo – Dos LEDs parpadeando a diferente ritmo:

1const int led1 = 8;
2const int led2 = 9;
3unsigned long t1 = 0, t2 = 0;
4const long intervalo1 = 500;  // LED1 cada 500ms
5const long intervalo2 = 1000; // LED2 cada 1000ms
6bool estado1 = false, estado2 = false;
7
8void setup() {
9  pinMode(led1, OUTPUT);
10  pinMode(led2, OUTPUT);
11}
12
13void loop() {
14  unsigned long ahora = millis();
15
16  if (ahora - t1 >= intervalo1) {
17    t1 = ahora;
18    estado1 = !estado1;
19    digitalWrite(led1, estado1);
20  }
21
22  if (ahora - t2 >= intervalo2) {
23    t2 = ahora;
24    estado2 = !estado2;
25    digitalWrite(led2, estado2);
26  }
27}