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.