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.

https://es.aliexpress.com/item/KY-018-3pin-Optical-Sensitive-Resistance-Light-Detection-Photosensitive-Sensor-Module-for-arduino-DIY-Kit-KY018/32820189174.html?spm=a2g0s.9042311.0.0.274263c0aUwt8q

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 😉

Deja tu comentario