Arduino: Fotorresistor (Ejercicio 05)

Las fotocélulas son sensores que permiten detectar la intensidad de luz. Son pequeños, económicos, de bajo consumo, fáciles de usar y no se desgastan. Por esa razón, a menudo aparecen en juguetes, artilugios y electrodomésticos. se los conoce también como células CdS (están hechas de sulfuro de cadmio), resistencias dependientes de la luz (LDR) o fotorresistores.

Las fotocélulas  cambia su valor resistivo (en ohmios Ω) dependiendo de la cantidad de luz que les llega. No son precisas, permiten determinar los cambios de luz básicos.

Para la mayoría de las aplicaciones de detección de luz como "¿está claro u oscuro?", "¿Hay algo delante del sensor (que bloquearía la luz)", "hay algo que interrumpe un rayo láser" (sensores de rayo), o "¿Cuál de los múltiples sensores tiene más luz?", ¡las fotocélulas pueden ser una buena opción!

Medición de la intensidad de luz

Como ya dijimos, la resistencia de una fotocélula cambia a medida que la cara queda expuesta a más luz. Cuando está oscuro, el sensor se ve como una resistencia grande de hasta 10MΩ, a medida que aumenta el nivel de luz, la resistencia disminuye. Este gráfico indica aproximadamente la resistencia del sensor a diferentes niveles de luz. Téngase en cuenta que está escala logarítmica en ambos ejes.

Las fotocélulas, particularmente las células CdS, son sensibles a la luz entre 700 nm (rojo) y 500 nm (verde). Así, la luz azul no será tan eficaz para activar el sensor como luz verde / amarilla.

En la siguiente tabla puede verse la correspondencia entre intensidad de luz y los ambientes reconocibles donde típicamente se da:

Método de lectura de voltaje analógico

La forma más fácil de medir un sensor resistivo es conectar un extremo a la alimentación y el otro a una resistencia de pull-down (a tierra). El punto entre la resistencia de pull-down fija y la fotocélula variable se conecta a la entrada analógica de un microcontrolador como Arduino:

En este ejemplo se conecta a 5V (también se puede alimentar a 3.3V). En esta configuración, la lectura de tensión analógica varía de 0 V (tierra) a aproximadamente 5 V. A medida que disminuye la resistencia de la fotocélula, la resistencia total del circuito disminuye de 600 KΩ a 10 KΩ.

Esta tabla indica el voltaje analógico aproximado basado en la luz / resistencia del sensor con un suministro de 5V y una resistencia de pulldown de 10KΩ.

Si se tiene el sensor en una zona muy luminosa y la resistencia de pull-down es de 10KΩ, la fotocélula se saturará rápidamente. Eso significa que alcanzará el 'techo' de 5V y no podrá diferenciar entre un poco brillante y realmente brillante. En ese caso, debe reemplazarse  dicha resistencia por otra de 1KΩ (es decir, por una de un valor del mismo orden de magnitud que la correspondiente al nivel de iluminación que se desea medir). En ese caso no podrá detectar diferencias con poca ilumnicación, pero podrá detectar mejor las diferencias de luz brillante.

También puede usar la fórmula Axel Benz midiendo primero el valor de resistencia mínimo y máximo con el multímetro y luego encontrando el valor de resistencia con:

Resistencia_Pull-Down= raiz_cuadrada(Rmin * Rmax)

De esta forma optimizaremos la sensibilidad de medida en el rango de iluminaciones al que queremos que responda.

Esta tabla indica el voltaje analógico aproximado basado en la luz / resistencia del sensor con un suministro de 5V y una resistencia de pulldown de 1K.

La relación entre el voltaje de salida y la resistencia del sensor es de proporcionalidad inversa:

Vo = Vcc (Rpull_down / (R_fotocélula R + Rppull_down))

Es decir, la tensión es proporcional a la inversa de la resistencia de la fotocélula que, a su vez, es inversamente proporcional a los niveles de luz.

Demostración de uso

El esquema de montaje arriba indicado corresponde al siguiente circuito:

El código para Arduino presentado hace dos cosas:

  • Ilumina el led con una señal PWM proporcional al nivel iluminación (recuérdese que las salidas de Arduino son de 8 bits (0-255), mientras que las entradas son de 10 bits (0-1023). De ahí la necesidad de escalar la lectura analógica a 8 bits para obtener una salida PWM proporcional:

LEDbrightness = map(photocellReading, 0, 1023, 0, 255);

  • Da una salida cualitativa del nivel de iluminación, teniendo en cuenta el rango de la lectura analógica 0-1023.

URL en el repositorio IoT-Arduino

/* Photocell simple testing sketch.
 
Connect one end of the photocell to 5V, the other end to Analog 0.
Then connect one end of a 10K resistor from Analog 0 to ground
Connect LED from pin 11 through a resistor to ground
*/

 
int photocellPin = 0;     // the cell and 10K pulldown are connected to a0
int photocellReading;     // the analog reading from the sensor divider
int LEDpin = 11;          // connect Red LED to pin 11 (PWM pin)
int LEDbrightness;        //
void setup(void) {
  // We'll send debugging information via the Serial monitor
  Serial.begin(9600);  
}
 
void loop(void) {
  photocellReading = analogRead(photocellPin);  
 
  // LED gets brighter the darker it is at the sensor
  // that means we have to -invert- the reading from 0-1023 back to 1023-0
  //photocellReading = 1023 - photocellReading;
  //now we have to map 0-1023 to 0-255 since thats the range analogWrite uses
  LEDbrightness = map(photocellReading, 0, 1023, 0, 255);
  analogWrite(LEDpin, LEDbrightness);

  Serial.print("LED brightness = ");
  Serial.print(LEDbrightness);
  Serial.print("\tAnalog reading = ");
  Serial.print(photocellReading);     // the raw analog reading
 
  // We'll have a few threshholds, qualitatively determined
  if (photocellReading < 10)
    Serial.println(" - Negro");
  else if (photocellReading < 200)
    Serial.println(" - Oscuro");
  else if (photocellReading < 500)
    Serial.println(" - Intermedio");
  else if (photocellReading < 800)
    Serial.println(" - Brillante");
  else
    Serial.println(" - Muy brillante");

  delay(1000);
}