En este tutorial aprenderás a usar el sensor de luz ambiental BH1750, un OLED y un Arduino Uno para medir y mostrar la intensidad de la luz.
Aunque puedes usar una simple resistencia dependiente de la luz ( LDR ) para detectar luz, esas lecturas no están calibradas en una unidad estándar definida de intensidad luminosa. En cambio, el sensor BH1750 mide la intensidad de la luz en lux, ofreciendo mediciones mucho más comparables.
Si quieres saber más, sigue leyendo.
Partes necesarias
Usé un Arduino Uno para este proyecto, pero cualquier otro Arduino o placa ESP32/ESP8266 también funcionará. En cuanto al sensor de luz, usé la placa breakout que se menciona abajo, pero también existe un BH1750 sensor con una tapa protectora, que puede ser mejor para algunas aplicaciones prácticas.

Sensor de luz ambiental BH1750

Arduino Uno

Cable USB para Arduino UNO

Juego de cables Dupont

Protoboard

Pantalla OLED
Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.
El sensor de luz ambiental BH1750
El sensor de luz ambiental BH1750 es un sensor digital que mide la intensidad de la luz en su entorno. Proporciona una interfaz I2C para comunicarse con microcontroladores como Arduino y ESP32. El sensor tiene un amplio rango de sensibilidad lumínica de 1 a 65535 lux, lo que lo hace adecuado para diversas condiciones de iluminación.
Una de las características clave del sensor BH1750 es su bajo consumo de energía (corriente en modo apagado de 0.01 µA), lo que lo hace ideal para dispositivos alimentados por batería. También tiene alta resolución y puede proporcionar lecturas precisas de la intensidad luminosa. El sensor es fácil de usar y puede integrarse en diferentes proyectos DIY como sistemas de iluminación automática, agricultura inteligente y estaciones meteorológicas. Para más detalles, consulta la hoja de datos:
Internamente, el chip del sensor contiene un fotodiodo (PD) como detector de luz, un amplificador de señal (AMP), un convertidor analógico-digital de 16 bits (ADC) y lógica para convertir el valor ADC en una medición de intensidad luminosa y enviarla vía I2C. La siguiente imagen muestra el diagrama de bloques:

Placa breakout del sensor BH1750
El chip del sensor es muy pequeño y para proyectos con Arduino normalmente se usa una placa breakout que tiene pines más grandes, un regulador de voltaje y resistencias pullup para la interfaz I2C. El regulador de voltaje permite alimentar el sensor con 3.3V o 5V. La imagen abajo muestra el frente y reverso de una típica placa breakout del sensor BH1750:

Puedes ver los pines de alimentación (VCC, GND), la interfaz I2C (SCL, SDA) y un pin ADDR. El pin ADDR se usa para configurar la dirección I2C del sensor. Si conectas ADDR a VCC, la dirección será 0x5C. De lo contrario, la dirección I2C por defecto es 0x23.
Mediciones en lux
El sensor mide la intensidad luminosa en lux, que según Wikipedia se define así:
El lux (símbolo: lx ) es la unidad de illuminance , o luminous flux por unidad de área, en el International System of Units (SI). Equivale a un lumen por metro cuadrado. En photometry , se usa como medida de la intensidad, tal como la percibe el ojo humano, de light que incide o atraviesa una superficie.
La siguiente tabla muestra niveles de lux para diferentes condiciones de iluminación. Si usas el sensor BH1750 para medir niveles de lux, ten en cuenta que el ángulo de la luz entrante afectará la medición.

La hoja de datos contiene la curva de respuesta espectral para el BH1750 y puedes ver que el sensor es más sensible a la luz en el rango de longitud de onda de 500nm a 600nm.

Conexión del BH1750 al Arduino
Gracias a la interfaz I2C, conectar el sensor BH1750 a un Arduino es muy sencillo. Primero, conecta los pines SCL y SDA de la placa breakout BH1750 a los pines correspondientes del Arduino como se muestra abajo. Luego conecta tierra y VCC.

Como la placa breakout funciona con 5V o 3.3V, puedes usar cualquiera para VCC; yo usé 3.3V. En la siguiente sección escribiremos código para probar el funcionamiento del sensor.
Código para medir luz ambiental con BH1750
Comenzamos implementando un código simple que imprime la intensidad de luz medida por el sensor BH1750.
#include "Wire.h"
#include "BH1750.h"
BH1750 luxMeter;
void setup(){
Serial.begin(9600);
Wire.begin();
luxMeter.begin();
}
void loop() {
float lux = luxMeter.readLightLevel();
Serial.print("Light:");
Serial.print(lux);
Serial.println(" lx");
delay(1000);
}
El código inicia incluyendo las librerías necesarias. La Wire library es una librería estándar que viene con el core de Arduino, pero la BH1750 library tendrás que instalarla. Solo abre el Library Manager, busca BH1750 e instala la BH1750 library de Christopher Laws como se muestra a continuación:

Existen varias otras librerías, y la BH1750 library de Rob Tillaart es una alternativa interesante, ya que tiene funciones adicionales para compensación de temperatura, corrección de ángulo y medición asíncrona.
En la función setup inicializamos la comunicación serial, la comunicación I2C vía Wire y el sensor BH1750. Nota que debes llamar a Wire.begin() , incluso usando los pines I2C por defecto. Sin embargo, si quieres usar pines diferentes para SDA y SCL, puedes usar Wire.begin() para configurarlos.
En la función loop, cada segundo, leemos el nivel de luz del BH1750 en lux y mostramos el valor en el Monitor Serial. Si abres el Serial Plotter y expones el sensor a una fuente de luz, deberías ver un pico en la gráfica:

Añadiendo un OLED
En lugar de mostrar los datos en el Monitor Serial, sería mejor mostrarlos en una pantalla separada. Esto nos permitiría construir un medidor de lux portátil. En esta sección, añadimos un OLED al circuito y mostramos la intensidad luminosa en él.
Conexión del OLED al Arduino
Como el OLED también es un dispositivo I2C, conectarlo es sencillo. Simplemente conectamos SDA y SCL a los mismos pines donde está conectado el sensor BH1750. Como el OLED funciona a 3.3V, también podemos compartir las líneas de alimentación. La imagen abajo muestra el cableado completo.

Si tienes dificultades con el OLED, consulta el tutorial How to Interface the SSD1306 I2C OLED Graphic Display With Arduino . La imagen abajo muestra el cableado completo en una protoboard real.

Código para mostrar datos del BH1750 en OLED
En esta sección aprenderás a mostrar la intensidad luminosa medida por el BH1750 en una pantalla OLED. Para escribir en el OLED usaremos la librería Adafruit_SSD1306 . Puedes instalarla vía Library Manager como siempre:

El código a continuación lee la medición de luz del sensor BH1750 y muestra el valor en lux en el OLED. Mira el código completo primero antes de que discutamos sus detalles.
#include "BH1750.h"
#include "Adafruit_SSD1306.h"
BH1750 luxMeter;
Adafruit_SSD1306 oled(128, 64, &Wire, -1);
void oled_init() {
oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);
oled.clearDisplay();
oled.setTextSize(3);
oled.setTextColor(WHITE);
}
void centered(const char* text, int y) {
int16_t x1, y1;
uint16_t w, h;
oled.getTextBounds(text, 0, 0, &x1, &y1, &w, &h);
oled.setCursor(64 - w / 2, y);
oled.print(text);
}
void display_lux() {
static char text[30];
float lux = luxMeter.readLightLevel();
oled.clearDisplay();
sprintf(text, "%.0f", lux);
centered(text, 25);
oled.display();
}
void setup() {
oled_init();
Wire.begin();
luxMeter.begin();
}
void loop() {
display_lux();
delay(1000);
}
Librerías e inicialización de la pantalla
Comenzamos incluyendo las librerías necesarias para el sensor BH1750 y la pantalla OLED Adafruit SSD1306. Luego inicializamos la pantalla OLED en la función oled_init() . Esta función configura la pantalla, la limpia, establece el tamaño y color del texto.
#include "BH1750.h"
#include "Adafruit_SSD1306.h"
BH1750 luxMeter;
Adafruit_SSD1306 oled(128, 64, &Wire, -1);
void oled_init() {
oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);
oled.clearDisplay();
oled.setTextSize(3);
oled.setTextColor(WHITE);
}
Ten en cuenta que la dirección I2C para la pantalla OLED está configurada a 0x3C en oled.begin() . La mayoría de estos pequeños OLED usan esta dirección, pero la tuya podría ser diferente. Si no ves nada en el OLED, probablemente tenga una dirección I2C distinta y deberás cambiar la dirección pasada a oled.begin() . Si no sabes la dirección I2C, consulta el tutorial How to Interface the SSD1306 I2C OLED Graphic Display With Arduino .
Funciones de visualización
La función centered() se usa para imprimir texto centrado en la pantalla OLED en una coordenada y especificada. La función display_lux() lee la intensidad luminosa en lux del sensor y la muestra en la pantalla OLED.
void centered(const char* text, int y) {
// Function to center text on OLED display
}
void display_lux() {
// Function to display light intensity on OLED display
}
Función setup
En la función setup() inicializamos la comunicación serial para depuración, inicializamos la pantalla OLED y comenzamos la comunicación con el sensor BH1750. Si cambias los pines I2C a los que está conectado el sensor, aquí es donde debes ajustar. Wire.begin()
void setup() {
oled_init();
Wire.begin();
luxMeter.begin();
}
Función loop
La función loop() llama continuamente a la función display_lux() para actualizar y mostrar el valor en la pantalla OLED. Luego añade un retardo de 1 segundo antes de la siguiente actualización.
void loop() {
display_lux();
delay(1000);
}
Salida en OLED
Si subes y ejecutas el código, deberías ver la intensidad luminosa en lux mostrada en el OLED.

Y ahí tienes un buen medidor de lux que puedes usar para medir intensidades de luz.
Conclusiones
En este tutorial aprendiste a usar el sensor de luz ambiental BH1750, un OLED y un Arduino Uno para construir un medidor de lux.
Como el BH1750 tiene un modo de bajo consumo y funciona a 3.3V, sería especialmente adecuado para construir un medidor de lux portátil alimentado por batería usando un ESP32. Echa un vistazo al Simple ESP32 Internet Weather Station , donde usamos un ESP32 alimentado por batería, para detalles técnicos.
Además, si usas el medidor de lux principalmente en exteriores, te recomendaría una pantalla e-Paper en lugar de un OLED, ya que será mucho mejor para leer a la luz directa del sol. El tutorial Weather Station on e-Paper Display puede ser útil aquí.
Finalmente, si quieres medir específicamente luz UV, también tenemos un tutorial sobre eso: UV Index Meter With VEML6070 and Arduino
Si tienes alguna pregunta, no dudes en preguntar.
¡Feliz bricolaje ; )

