Ejercicio 03 — Leer una LDR (fotorresistor) con divisor de tensión en A0 y mostrar…
Dificultad: verde · Módulo 04 (Entradas analogicas)
Enunciado
Leer una LDR (fotorresistor) con divisor de tensión en A0 y mostrar el nivel de luz por Serial.
Cómo se resuelve
El código de este ejercicio es prácticamente idéntico al del ejercicio 01: leer A0 e imprimir el número. El aprendizaje está entero en el montaje, y es el concepto más importante del módulo. Merece la pena entenderlo bien antes de cablear nada.
Una LDR (fotorresistor) es una resistencia que cambia de valor con la luz que le llega: a oscuras puede estar en cientos de miles de ohmios, y con luz directa bajar a unos pocos cientos. El problema es que informa cambiando su resistencia, y un pin analógico solo sabe medir tensión. Si conectas la LDR a A0 y ya está, no hay nada que medir: el pin queda flotante, sin ningún circuito que fije su tensión, y el ADC devuelve ruido ambiental, números que bailan sin relación con la luz. Esta es la trampa clásica del módulo, y no se detecta con un mensaje de error: el programa compila, sube y muestra números; simplemente los números no significan nada.
La solución es un divisor de tensión: dos resistencias en serie entre 5 V y GND, con el pin midiendo el punto intermedio.
5V ──[ LDR ]──┬──[ 10 kΩ ]── GND
│
A0
Los 5 V se reparten entre las dos resistencias en proporción a su valor, y A0 mide la parte que le toca a la resistencia fija: V(A0) = 5V · 10k / (R_LDR + 10k). Con mucha luz, la resistencia de la LDR se desploma, se queda con muy pocos voltios, y en A0 aparece una tensión alta, o sea un analogRead alto. A oscuras, la LDR sube muchísimo, acapara casi todos los voltios y en A0 queda una tensión baja. Por eso el comentario del código dice que más luz da un valor más alto con este cableado: si intercambiaras la LDR y la resistencia de 10 kΩ, el sentido se invertiría. No es una propiedad del sensor, es una consecuencia de dónde has puesto cada pieza.
En el simulador Wokwi la LDR se representa con el módulo wokwi-photoresistor-sensor, que ya trae la resistencia del divisor integrada en su placa: solo cableas VCC a 5 V, GND a GND y AO a A0. Es cómodo, pero conviene tener presente que ese módulo está escondiendo exactamente el concepto que acabas de aprender. En protoboard física la resistencia de 10 kΩ la pones tú, y sin ella no hay lectura.
Con eso claro, el código no da sorpresas:
const int PIN_LDR = A0; // nodo central del divisor (LDR + resistencia fija)El nombre de la constante ya documenta lo importante: A0 no está conectado “a la LDR”, está conectado al nodo central del divisor. Esa distinción es la diferencia entre entender el circuito y no.
setup() solo abre el puerto serie con Serial.begin(9600). Igual que en el ejercicio 01, no hay pinMode: un pin analógico no lo necesita para leer.
El loop() mide, imprime y espera:
int luz = analogRead(PIN_LDR); // 0..1023 -> proporcional a la luz que recibe la LDR
Serial.print("Luz: ");
Serial.println(luz);
delay(200);La variable se llama luz y no valor, y no es un detalle cosmético: el número sigue siendo una lectura de tensión, pero el nombre declara qué representa esa tensión en este montaje concreto. Los 200 ms son otra vez por comodidad de lectura, cinco líneas por segundo, un ritmo al que puedes tapar el sensor con la mano y ver el número reaccionar sin que la pantalla se desborde.
La parte experimental es la que de verdad importa aquí. Con el monitor abierto, anota tres cifras: el valor con la luz normal de la habitación, el valor tapando la LDR con la mano y el valor iluminándola con la linterna del móvil. Verás que el rango real de tu montaje no va de 0 a 1023 ni de lejos: quizá se mueva entre 150 y 800, según tu LDR, tu resistencia y la luz que haya. Esos tres números son el material de trabajo del ejercicio 04, donde hay que elegir un umbral. Elegirlo sin haber hecho esta medida es adivinar.
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 04: Entradas analógicas
* Ejercicio 03 — PRÁCTICA (rellena los TODO)
* Enunciado: Leer una LDR (fotorresistor) con divisor de tensión en A0 y mostrar el nivel de luz por Serial.
* Dificultad: verde
* Placa: Arduino UNO
* Montaje (protoboard): 5V -> LDR -> nodo A0 -> R 10k -> GND (divisor de tensión)
* En Wokwi se usa el módulo wokwi-photoresistor-sensor: VCC=5V, GND=GND, AO=A0 (ya trae la R).
* Correr: Arduino IDE / Wokwi (wokwi/ej03) / arduino-cli (ver README)
*/
const int PIN_LDR = A0; // nodo central del divisor (LDR + resistencia fija)
void setup() {
// TODO: arranca el Serial -> Serial.begin(9600)
}
void loop() {
// TODO: lee la LDR -> int luz = analogRead(PIN_LDR)
// TODO: imprime "Luz: " -> Serial.print("Luz: ")
// TODO: imprime el valor con salto -> Serial.println(luz)
// TODO: delay(200)
}Solución — cópiala y ejecútala
/*
* Curso de Arduino — Módulo 04: Entradas analógicas
* Ejercicio 03 — MODELO (resuelto)
* Enunciado: Leer una LDR (fotorresistor) con divisor de tensión en A0 y mostrar el nivel de luz por Serial.
* Dificultad: verde
* Placa: Arduino UNO
* Montaje (protoboard): 5V -> LDR -> nodo A0 -> R 10k -> GND (divisor de tensión)
* En Wokwi se usa el módulo wokwi-photoresistor-sensor: VCC=5V, GND=GND, AO=A0 (ya trae la R).
* Correr: Arduino IDE / Wokwi (wokwi/ej03) / arduino-cli (ver README)
*/
const int PIN_LDR = A0; // nodo central del divisor (LDR + resistencia fija)
void setup() {
Serial.begin(9600);
}
void loop() {
int luz = analogRead(PIN_LDR); // 0..1023 -> proporcional a la luz que recibe la LDR
Serial.print("Luz: ");
Serial.println(luz); // más luz -> valor más alto (con este cableado)
delay(200);
}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-photoresistor-sensor", "id": "ldr1", "top": -130, "left": 150, "attrs": {} }
],
"connections": [
[ "ldr1:VCC", "uno:5V", "red", [] ],
[ "ldr1:GND", "uno:GND.1", "black", [] ],
[ "ldr1:AO", "uno:A0", "green", [] ]
],
"dependencies": {}
}En VS Code, con el repo del curso
El paquete de simulación de este ejercicio está en practica/04-entradas-analogicas/wokwi/ej03/. Con la extensión Wokwi instalada y la licencia activada (lo cuenta el onboarding del curso):
make sim EJ=04-entradas-analogicas/ej03y 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.