14 de diciembre de 2012

Arduino: Sensor de luz

Esta vez, vamos a variar la luminosidad de un LED según la luz que detecte un pequeño sensor de luz. Si hay mucha luz, nuestra "lámpara" debería estar apagada y, cuando menos luz detecte, más brillo debo aplicarle.

Estas son las conexiones tal como las he hecho:

Imagen realizada con Fritzing


La resistencia que he usado para la LED es de 330Ω y la que he usado para el fotorresistor es de 10kΩ.

He aquí el vídeo del resultado:




Este es el código que he utilizado:

#define PIN_LED 9  // Conectamos una LED en el pin analógico 9
#define PIN_LUZ A0 // Conectamos el fotorresistor en el pin analógico A0

void setup()
{
  pinMode(PIN_LED, OUTPUT); // establecemos PIN_LED como salida
  pinMode(PIN_LUZ, INPUT);  // establecemos PIN_LUZ como entrada
}

void loop()
{
  int nivelDeLuz = analogRead(PIN_LUZ);           // obtenemos el nivel de luz
  nivelDeLuz = map(nivelDeLuz, 0, 900, 0, 255);   // escalamos el valor obtenido
  if(nivelDeLuz < 15){
    nivelDeLuz = 0;
  }      
  analogWrite(PIN_LED, nivelDeLuz);               // aplicamos el brillo a la led
}

Al valor del fotorresistor varía entre 0 y 900, siendo 0 el valor de ninguna oscuridad (luz al máximo) y 900 el de oscuridad total. Teniendo en cuenta esto, extrapolamos el valor obtenido utilizando la función map, de tal forma que escalamos el valor recibido por el sensor para que se ajuste a los valores que podemos darle para el brillo de la LED. Es decir, tomamos un valor de 0 a 900 y lo escalamos para ajustarse a un valor de 0 a 255.

Con ello tendremos que, cuando hay mucha luz (valor 0 en el fotorresistor), el brillo de la LED será 0 y, cuando estamos a oscuras (valor 900 en el fotorresistor), la LED tendrá el brillo máximo.

Como la medición de luz máxima (aproximación a 0 del valor del fotorresistor) es complicado que nos de 0, utilizamos una condición para que, si el valor es menor de 15 (hay mucha luz), el brillo de la LED sea directamente 0.

Si quisiéramos el efecto inverso (encender la luz cuando hay mucho brillo en el fotorresistor), sólo tendríamos que cambiar la línea siguiente:
  nivelDeLuz = map(nivelDeLuz, 0, 900, 0, 255);   // escalamos el valor obtenido

Por esta otra:

  nivelDeLuz = map(nivelDeLuz, 0, 900, 255, 0);   // escalamos el valor obtenido


Ahora debéis hacerle sombra al fotorresistor para lograr apagar la luz.

Espero que os haya resultado entretenido.

Un saludo: Roi