Medir el nivel de luz con Arduíno es muy sencillo y nos dará juego para interesantes aplicaciones domóticas en casa.
Conociendo la cantidad de luz de una estancia podemos activar una lámpara, ,iluminación por leds, o controlar cortinas y persianas hasta dejarlo a nuestro gusto.
Hay muchos sensores foto eléctricos disponibles, en este caso vamos a utilizar el KY-018, disponible online por 1€, gastos de envío incluidos.
Esquema de conexión
El sensor únicamente necesita corriente a 5v, gnd y un pin analógico por el que devuelve los datos de lectura.

Código
/*
* www.altaruru.com arduino - sensores - LDR
* Fotoresistencia - LDR - Light Dependent Resistor
*/
const int pinLED = 13;
const int pinLDR = A2;
void mensaje(){
Serial.println("www.altaruru.com arduino - sensores - LDR");
Serial.println("ejemplo de uso de un sensor fotoelectrico con Arduino");
Serial.println("el sensor es analógico.");
Serial.println(" > Un valor bajo indica luz");
Serial.println(" > Un valor alto indica oscuridad");
}
void setup()
{
pinMode(pinLED, OUTPUT);
pinMode(pinLDR, INPUT);
Serial.begin(9600);
mensaje();
}
void calibra(int nsegs)
{
int tcalibra = 1000 * nsegs; // 1000 = 1 segundo
long tsini;
int vact, vmax=0, vmin=1023;
String sout = "";
tsini = millis(); // millis() es el tiempo en milisegundos desde el encendido del Arduino
Serial.println("Calibrando sensor LDR...");
digitalWrite(pinLED, HIGH);
while (millis()-tsini < tcalibra) {
vact = analogRead(pinLDR);
if(vact>vmax) vmax=vact;
if(vact<vmin) vmin=vact;
}
sout = "LDR: ";
sout += vmin;
sout += "/";
sout += vmax;
Serial.println(sout);
digitalWrite(pinLED, LOW);
}
void light(int n){
for (int i = 0; i<=n; i++){
digitalWrite(pinLED, HIGH);
delay(1000);
digitalWrite(pinLED, LOW);
delay(1000);
}
}
void loop()
{
calibra(4);
light(2);
}
El código no tiene mucho que comentar.
Está dividido en funciones para mantenerlo más ordenado.
Setup()
Inicia pines, activa monitor serial y muestra mensaje de bienvenida.
calibra(nsegs)
Recupera datos del sensor LDR y los muestra por ventana serial.
El parámetro de entrada nsegs son los segundos que el sensor esta calibrando.
Leemos el sensor con vact = analogRead(pinLDR) y guardamos el valor más alto y más bajo de todas las lecturas en vmin y vmax.
light(n)
Hace parpadear el led13 tantas veces como indiquemos en el parámetro a intervalos de un segundo
loop()
Bucle principal del programa. Ejecuta en cada ciclo calibra() y light().
DEBUG
La salida por el monitor serial os dará algo así:
www.altaruru.com arduino - sensores - LDR
ejemplo de uso de un sensor fotoelectrico con Arduino
el sensor es analógico.
> Un valor bajo indica luz
> Un valor alto indica oscuridad
Calibrando sensor LDR...
LDR: 146/148;
Calibrando sensor LDR...
LDR: 146/148;
Calibrando sensor LDR...
LDR: 148/491;
Calibrando sensor LDR...
LDR: 148/444;
Calibrando sensor LDR...
LDR: 152/425;
Calibrando sensor LDR...
LDR: 368/392;
Calibrando sensor LDR...
LDR: 446/449;
Calibrando sensor LDR...
LDR: 296/771;
Calibrando sensor LDR...
LDR: 821/823;
Calibrando sensor LDR...
LDR: 819/822;
Calibrando sensor LDR...
LDR: 818/820;
Calibrando sensor LDR...
LDR: 138/140
Calibrando sensor LDR...
Curiosamente, al contrario de lo que podría parecer, los valores altos se dan con poca luz y los bajos con mucha luz.
Y no tiene más!! xD ahora a conectar un relé y activar luces y esas cosas!
Espero sea útil, un saludo!!
El esquema lo he hecho con Fritzing y el componente, o part como se denomina en fritzing, del KY-018, se lo debo a AppChris, a quien doy las gracias 😉