Ejercicio 01 — Hacer un “fade” de un LED
Dificultad: verde · Módulo 03 (Salidas analogicas (PWM))
Enunciado
Hacer un “fade” de un LED: subir el brillo de 0 a 255 y bajar de 255 a 0.
Montaje (Arduino UNO)
LED en pin 9 (~) con resistencia 220 ohm a GND
Cómo se resuelve
El primer contacto con PWM. Hasta ahora un pin solo sabía estar a 5 V o a 0 V; aquí el LED va a recorrer todos los brillos intermedios sin que la tensión del pin deje de ser 5 V o 0 V en ningún momento. Lo que cambia es el tiempo: analogWrite conmuta el pin muy rápido y decide qué porcentaje de cada ciclo pasa encendido. El LED y tu ojo ven el promedio.
Lo primero es el pin. El montaje pide el pin 9, y no es un capricho:
const int LED = 9; // pin PWM (~)analogWrite solo genera PWM de verdad en los pines marcados con ~ en la placa: 3, 5, 6, 9, 10 y 11. Si lo intentas en el 8, el programa compila igual, no hay ningún aviso, y el LED se limita a encenderse de golpe cuando el valor llega a 128. Cuando un fade “no atenúa, salta”, el pin es lo primero que hay que mirar.
El setup() no tiene sorpresa: pinMode(LED, OUTPUT). PWM sigue siendo una salida, así que el pin hay que declararlo igual que en el módulo 01.
El cuerpo del ejercicio son dos bucles for, uno para subir y otro para bajar:
for (int brillo = 0; brillo <= 255; brillo++) {
analogWrite(LED, brillo); // duty cycle = brillo/255
delay(8);
}La clave está en entender qué hace cada pieza. analogWrite(LED, brillo) no produce ningún movimiento: fija un brillo y ahí se queda, indefinidamente, hasta que alguien escriba otro valor. El movimiento lo hace el bucle, que escribe 256 valores distintos uno detrás de otro. Sin for tendrías 256 líneas de analogWrite; con él, tres.
El rango es 0 <= brillo <= 255 porque analogWrite trabaja en 8 bits: 0 es apagado permanente, 255 es encendido permanente y equivale a un digitalWrite(LED, HIGH). Ojo con el <=: si escribes < 255 te dejas el máximo fuera, que en la práctica no se nota, pero el bucle de bajada con >= 0 sí importa, porque > 0 dejaría el LED encendido al mínimo en vez de apagado del todo.
El delay(8) es el que fija la velocidad. Cada uno de los 256 escalones dura 8 ms, así que la subida tarda unos 2 segundos (256 × 8 ms ≈ 2050 ms) y la bajada otros 2: el ciclo completo ronda los 4 segundos. Merece la pena separar mentalmente los dos parámetros que controlan la rampa. El delay controla la duración: bájalo a 2 y la rampa es igual de suave pero cuatro veces más rápida. El incremento del for controla la suavidad: cámbialo a brillo += 16 y la rampa dura lo mismo dividida entre dieciséis, pero se ven los escalones.
Los dos bucles se escriben por separado, y el de bajada es el mismo del revés: empieza en 255, condición >= 0 y brillo--. Como en el parpadeo del módulo 01, hacen falta los dos: con solo el de subida, el LED llegaría al máximo y saltaría bruscamente a apagado al reiniciarse el loop(), y en vez de una respiración verías una rampa con un corte seco al final.
Una cosa que se aprecia mejor mirando el LED que leyéndola: la rampa no se ve lineal. Los primeros valores producen un salto de brillo aparente mucho mayor que los últimos, porque el ojo responde de forma logarítmica a la luz. El programa sube el duty cycle en pasos iguales; tu percepción no. No es un fallo del código, es cómo vemos.
Para practicar — cópialo y complétalo
Pega este esqueleto y completa los TODO. Es la mejor forma de aprender: inténtalo antes de mirar la solución.
/*
* Curso de Arduino — Módulo 03: Salidas analógicas (PWM)
* Ejercicio 01 — PRÁCTICA (rellena los TODO)
* Enunciado: Hacer un "fade" de un LED: subir el brillo de 0 a 255 y bajar de 255 a 0.
* Dificultad: verde
* Placa: Arduino UNO Montaje: LED en pin 9 (~) con resistencia 220 ohm a GND
* Correr: Arduino IDE / Wokwi (wokwi/ej01) / arduino-cli (ver README)
*
* Pista: usa un pin con ~ (3,5,6,9,10,11); analogWrite solo funciona en esos.
*/
const int LED = 9; // pin PWM (~)
void setup() {
// TODO: configura LED como salida con pinMode(LED, OUTPUT)
}
void loop() {
// TODO: bucle for que suba brillo de 0 a 255
// dentro: analogWrite(LED, brillo) y un delay(8)
// TODO: bucle for que baje brillo de 255 a 0
// dentro: analogWrite(LED, brillo) y un delay(8)
}Solución — cópiala y ejecútala
/*
* Curso de Arduino — Módulo 03: Salidas analógicas (PWM)
* Ejercicio 01 — MODELO (resuelto)
* Enunciado: Hacer un "fade" de un LED: subir el brillo de 0 a 255 y bajar de 255 a 0.
* Dificultad: verde
* Placa: Arduino UNO Montaje: LED en pin 9 (~) con resistencia 220 ohm a GND
* Correr: Arduino IDE / Wokwi (wokwi/ej01) / arduino-cli (ver README)
*
* Nota: el pin 9 lleva ~ -> tiene PWM. analogWrite NO funciona en pines sin ~.
*/
const int LED = 9; // pin PWM (~)
void setup() {
pinMode(LED, OUTPUT); // salida (PWM también necesita pinMode OUTPUT)
}
void loop() {
// subir brillo: 0 -> 255
for (int brillo = 0; brillo <= 255; brillo++) {
analogWrite(LED, brillo); // duty cycle = brillo/255
delay(8); // 8 ms por paso -> ~2 s en subir
}
// bajar brillo: 255 -> 0
for (int brillo = 255; brillo >= 0; brillo--) {
analogWrite(LED, brillo);
delay(8);
}
}Cómo ejecutar la simulación
Sin instalar nada, en el navegador
- Abre wokwi.com y crea un proyecto nuevo de la placa que pide el ejercicio.
- Pega la solución (o tu intento) en la pestaña
sketch.ino. - Abre la pestaña
diagram.json, borra lo que haya y pega el circuito de aquí abajo. - Dale al play. Verás el circuito funcionando: LEDs, pantallas y monitor serie.
Circuito del ejercicio (diagram.json)
{
"version": 1,
"author": "ESIBot",
"editor": "wokwi",
"parts": [
{ "type": "wokwi-arduino-uno", "id": "uno", "top": 0, "left": 0, "attrs": {} },
{ "type": "wokwi-led", "id": "led", "top": -50, "left": 150, "attrs": { "color": "red" } },
{ "type": "wokwi-resistor", "id": "r1", "top": 100, "left": 150, "attrs": { "value": "220" } }
],
"connections": [
[ "uno:9", "r1:1", "green", [] ],
[ "r1:2", "led:A", "green", [] ],
[ "led:C", "uno:GND.1", "black", [] ]
],
"dependencies": {}
}En VS Code, con el repo del curso
El paquete de simulación de este ejercicio está en practica/03-salidas-analogicas-pwm/wokwi/ej01/. Con la extensión Wokwi instalada y la licencia activada (lo cuenta el onboarding del curso):
make sim EJ=03-salidas-analogicas-pwm/ej01y después, en VS Code, Ctrl+Shift+P → Wokwi: Start Simulator. La extensión no compila: simula un firmware ya compilado, y de compilarlo se encarga ese make.
Cómo usarlo
Con placa: abre el .ino en el Arduino IDE, elige placa y puerto y pulsa Subir. Sin placa: simulalo en Wokwi con cualquiera de las dos vias de arriba. Antes de mirar la solucion, intenta completar tu el esqueleto: es la mejor forma de aprender.