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 usardelay(), 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 usardelay(), 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}