Ejercicio 4: LDR

Elaborado a partir de http://www.arduino.cc/playground/Learning/PhotoResistor y http://arduino.cc/es/Reference/Map

Uso de una fotoresistencia como sensor de luz

Este es un ejercicio muy sencillo en el que veremos como obtener lecturas analógicas de un sensor y darles salida por el monitor del puerto serie para verlas.

Necesitaremos una placa Arduino UNO y una resistencia sensible a la luz o fotoresistencia

También utilizaremos un led para que nos de una salida proporcional a las lecturas recibidas desde la entrada analógica mediante PWM.

fotoresistencia

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/* Prueba simple del funcionamiento de una fotoresistencia
Conecta la fotoresistencia por una pata al pin 0 y por la
otra a +5V.
Conecta una resistencia de 10K entre el pin 0 y GND.
----------------------------------------------------
PhotoR 10K
+5 o---/\/\/--.--/\/\/---o GND
              |
Pin 0 o-------'
----------------------------------------------------
*/

int lightPin = 0; // Pin para la fotoresistencia
int ledPin=11;    // Pin al que se conecta el LED

void setup()
{
Serial.begin(9600);    // Inicia la comunicacion serie
pinMode( ledPin, OUTPUT ); // Establece el pin del LED
                           // como salida
}

void loop()
{
// Primero leemos el valor que nos da la fotoresistecia
// y lo mostramos por el puerto serie
Serial.println(analogRead(lightPin));

// Ahora cogemos la lectura de la fotoresistencia, la
// dividimos por 4 y la mandamos como salida analogica
// al LED
analogWrite(ledPin, analogRead(lightPin)/4);

// Hacemos una pequeña pausa para que el baile de
// numeros en el puerto serie no sea mareante
delay(100);
}

Ya podemos subir este código a nuestra placa y probar a ver que pasa.

Muy probablemente el resultado sea decepcionante: el LED brilla poco y cuando pasamos la mano por encima de la fotoresistencia el brillo del LED baja un poco más, pero dependiendo de las condiciones de luz ambiental es probable que no se note apenas nada.

La solución es el calibrado del sensor, esto es, hacer una lectura de los valores que devuelve el sensor en el ambiente en el que va a trabajar y ajustar los valores de salida a este rango. Para ello emplearemos el comando map().

map(valor, desdeBajo, desdeAlto, hastaBajo, hastaAlto)

valor: el número (valor) a mapear.
desdeBajo: el límite inferior del rango actual del valor.
desdeAlto: el límite superior del rango actual del valor.
hastaBajo: límite inferior del rango deseado.
hastaAlto: límite superior del rango deseado.

El comando map() re-mapea un número desde un rango hacia otro. Esto significa que, un valor contenido en el al rango desdeBajo-desdeAlto será mapeado al rango hastaBajo-hastaAlto.

No se limitan los valores dentro del rango, ya que los valores fuera de rango son a veces objetivos y útiles, así que si le pasamos un valor fuera del rango inicial calculará una salida dentro del rango de salida. Se puede utilizar el comando constrain() tanto antes como después de ésta función si es importante respetar los límites de los rangos.

Ten en cuenta que los límites “inferiores” de algún rango pueden ser mayores o menores que el límite “superior” por lo que map() puede utilizarse para revertir una serie de números, por ejemplo:

y = map(x, 1, 50, 50, 1);

La función maneja correctamente también los números negativos, por ejemplo:

y = map(x, 1, 50, 50, -100);

también es válido y funciona correctamente.
El comando map() usa matemática de enteros por lo que no generará números en coma flotante, es decir, su uso se limita a valores o variables del tipo int.

Trata de aplicar la función map() al ejercicio por ti mismo, de modo que el LED brille al mínimo cuando tapas con la mano la LDR y al máximo cuando la LDR capta la luz de ambiente. Si te atascas aquí tienes la solución, aunque te sentirás más orgulloso si lo resuelves sin mirar.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int lightPin = 0;  //define el pin de la foto-resistencia
int ledPin=11;     //define el pin para el  LED
int valor;     //define una variable en la que haremos los cálculos
int min = 0;       //valor mínimo que da la foto-resistencia
int max = 0;       //valor máximo que da la foto-resistencia

void setup()
{
    Serial.begin(9600);  //Inicializa la comunicación serie
    pinMode( ledPin, OUTPUT );
}

void loop()
{
    valor = analogRead(lightPin);
    valor = map(valor, min, max, 0, 255);  
    analogWrite(ledPin, valor);
    Serial.println(valor);
    delay(10); //pequeño retardo para darle
               // tiempo al LED a responder.
}

Si este tutorial te ha sido de utilidad puedes considerar hacerme un donativo, por pequeño que sea estarás contribuyendo a que siga con esta labor.


5 Comentarios

  1. Estoy intentando montar un control de una entrada analógica, representándola en una barra de leds. Midiendo el valor de umbral o pico y encendiendo un led cuando se alcance este valor, el led debe quedar encendido hasta que se pulse un pulsador de reset para apagarlo confirmando que se está enterado.
    Me funciona todo correcto hasta el punto de hacer el reset, no consigo programar que apague el led al pulsar el pulsador.
    Agradecería si alguien me puede orientar como programar esta parte.
    Gracias.

    • Antonio, sin ver el código es difícil orientarte con precisión, pero piensa que tu proyecto debe recorrer una serie de estados. Un estado inicial con las salidas a ciertos valores y una serie de estados durante la ejecución para los que las diferentes salidas deberán estar a ciertos valores.

      El reset deberá poner la salida vinculada al led en estado LOW y en la siguiente ejecución del loop() ese estado deberá mantenerse, es decir, no se puede dar la circunstancia que antes cambió esa salida a HIGH

  2. Hola Jose Manuel,

    primero de todo, agradecerte la publicación de este ejemplo que me sera muy útil para mi primer proyecto casero de arduino.
    Por otro lado, solo comentarte que al reproducir el diagrama en mi placa, he tenido que colocar el cátodo del led hacia la resistencia y asimismo respecto al pin 9 he tenido que modificar el mapeo en el código ya que viene establecido al 11.

    Gracias,

    Un cordial saludo,

    Fabian

  3. Pingback: Joystick total – Scratch controlado por Arduino. | expeduca

  4. Exelentes tutoriales 😀

Deja un comentario

Campos requeridos marcados con *.


Una estúpida ley me obliga a molestarte con algo obvio: este sitio utiliza cookies. Aquí tienes el ladrillo en cuestión por si quieres leerlo