Curso C para Arduino

1. Temporizador LED

  • Crea un LED que se encienda durante 3 segundos y luego se apague.

2. Semáforo no bloqueante

  • Simula un semáforo usando millis() sin usar delay(), alternando entre verde, amarillo y rojo con distintos tiempos.

3. Cronómetro simple

  • Muestra en el monitor serie cuánto tiempo ha pasado desde que se pulsó un botón.

Aquí tienes la solución para los tres ejercicios prácticos de la Unidad 6: Manejo de tiempo, usando millis() para evitar bloqueos y lograr mayor control del tiempo.


✅ 1. Temporizador LED

Crea un LED que se encienda durante 3 segundos y luego se apague.

1const int pinLED = 13;
2unsigned long tiempoEncendido = 3000;
3unsigned long tiempoInicio;
4bool encendido = false;
5
6void setup() {
7  pinMode(pinLED, OUTPUT);
8  tiempoInicio = millis();
9  digitalWrite(pinLED, HIGH);
10  encendido = true;
11}
12
13void loop() {
14  if (encendido && (millis() - tiempoInicio >= tiempoEncendido)) {
15    digitalWrite(pinLED, LOW);
16    encendido = false;
17  }
18}

✅ 2. Semáforo no bloqueante

Simula un semáforo usando millis() sin usar delay(), alternando entre verde, amarillo y rojo con distintos tiempos.

1const int pinRojo = 8;
2const int pinAmarillo = 9;
3const int pinVerde = 10;
4
5unsigned long tiempoAnterior = 0;
6int estado = 0;
7
8void setup() {
9  pinMode(pinRojo, OUTPUT);
10  pinMode(pinAmarillo, OUTPUT);
11  pinMode(pinVerde, OUTPUT);
12}
13
14void loop() {
15  unsigned long actual = millis();
16
17  switch (estado) {
18    case 0: // Verde
19      digitalWrite(pinVerde, HIGH);
20      digitalWrite(pinAmarillo, LOW);
21      digitalWrite(pinRojo, LOW);
22      if (actual - tiempoAnterior >= 4000) {
23        estado = 1;
24        tiempoAnterior = actual;
25      }
26      break;
27
28    case 1: // Amarillo
29      digitalWrite(pinVerde, LOW);
30      digitalWrite(pinAmarillo, HIGH);
31      digitalWrite(pinRojo, LOW);
32      if (actual - tiempoAnterior >= 1000) {
33        estado = 2;
34        tiempoAnterior = actual;
35      }
36      break;
37
38    case 2: // Rojo
39      digitalWrite(pinVerde, LOW);
40      digitalWrite(pinAmarillo, LOW);
41      digitalWrite(pinRojo, HIGH);
42      if (actual - tiempoAnterior >= 4000) {
43        estado = 0;
44        tiempoAnterior = actual;
45      }
46      break;
47  }
48}

✅ 3. Cronómetro simple

Muestra en el monitor serie cuánto tiempo ha pasado desde que se pulsó un botón.

1const int pinBoton = 2;
2unsigned long tiempoInicio = 0;
3bool cronometroActivo = false;
4
5void setup() {
6  pinMode(pinBoton, INPUT_PULLUP);
7  Serial.begin(9600);
8}
9
10void loop() {
11  if (digitalRead(pinBoton) == LOW && !cronometroActivo) {
12    tiempoInicio = millis();
13    cronometroActivo = true;
14    Serial.println("¡Cronómetro iniciado!");
15    delay(300); // anti-rebote
16  }
17
18  if (cronometroActivo) {
19    unsigned long tiempoActual = millis() - tiempoInicio;
20    Serial.print("Tiempo transcurrido: ");
21    Serial.print(tiempoActual / 1000.0);
22    Serial.println(" segundos");
23    delay(1000); // actualizar cada segundo
24  }
25}