El BH1750 es un sensor digital de luz ambiente extremadamente popular en proyectos con Arduino. Su misión es medir la iluminancia en unidades de lux, ofreciendo un rango amplio, excelente estabilidad y comunicación mediante el bus I2C, lo que simplifica la conexión y reduce el ruido eléctrico respecto a soluciones analógicas.
1. ¿Cómo funciona el BH1750 internamente?
El BH1750 es un sensor de luz basado en un fotodiodo y un convertidor analógico-digital (ADC) de 16 bits. Su proceso interno ocurre en cuatro etapas:
a) Captura de luz
El fotodiodo transforma la intensidad luminosa en una corriente proporcional.
El sensor es especialmente sensible al rango visible, aproximando bien la respuesta del ojo humano (curva fotópica).
b) Conversión a señal digital
La corriente del fotodiodo se amplifica y pasa a un ADC de alta resolución, lo que permite lecturas precisas incluso con variaciones pequeñas de iluminación.
c) Procesamiento interno
El microcontrolador interno convierte el valor del ADC directamente a lux, por lo que el usuario no necesita aplicar fórmulas externas ni calibraciones complejas.
d) Comunicación por I2C
El sensor expone dos direcciones posibles:
- 0x23 (por defecto)
- 0x5C (si el pin ADDR está en HIGH)
La comunicación es sencilla: el maestro (Arduino) envía un comando de medición y el BH1750 responde con dos bytes que representan el valor de luz.
2. Modos de operación
El BH1750 ofrece varios modos orientados a diferentes necesidades:
| Modo | Descripción | Tiempo típico | Precisión |
|---|---|---|---|
| H-Resolution (1 lx) | Mide luminosidad con resolución estándar | ~120 ms | Alta |
| H-Resolution2 (0.5 lx) | Variante más precisa | ~120 ms | Muy alta |
| L-Resolution (4 lx) | Medición rápida | ~16 ms | Media |
Nota: El sensor puede configurarse para lecturas continuas o una sola medición.
3. Alcances del BH1750
✔ Rango útil muy amplio: desde 1 lux (ambiente oscuro) hasta aproximadamente 65 000 lux (luz solar directa moderada).
✔ Muy buena linealidad gracias al ADC de 16 bits.
✔ Estabilidad a largo plazo y baja deriva por temperatura.
✔ Lectura directa en lux, ideal para principiantes y proyectos educativos.
✔ Inmunidad al ruido, ya que no usa salidas analógicas.
4. Limitaciones del sensor
⚠ Se satura en ambientes muy brillantes, por encima de ~65 000 lux (sol directo intenso).
⚠ No detecta luz IR ni UV, pues está optimizado para reproducir la sensibilidad del ojo humano.
⚠ No funciona correctamente detrás de algunos vidrios tintados o filtros polarizados.
⚠ Su tiempo de respuesta puede ser lento en los modos de alta resolución.
⚠ Depende del ángulo de incidencia, ya que no incorpora un difusor óptico profesional.
5. Conexión con Arduino
| BH1750 | Arduino |
|---|---|
| VCC | 3.3 V o 5 V |
| GND | GND |
| SDA | A4 (en Arduino UNO) |
| SCL | A5 (en Arduino UNO) |
| ADDR | GND (0x23) o VCC (0x5C) |
6. 3 Aplicaciones reales con Arduino
1. Control automático de iluminación interior
El BH1750 puede medir los niveles luminosos en una habitación y ajustar:
- Intensidad de lámparas LED via PWM
- Persianas automáticas
- Encendido inteligente según presencia y luz ambiental
Ideal en proyectos domóticos.
2. Medición de luz para invernaderos o cultivos
El BH1750 permite:
- Estimar si las plantas están recibiendo la luz adecuada
- Controlar paneles LED de crecimiento
- Registrar historiales de luminosidad en SD o en la nube
Funciona bien en rangos típicos de agricultura interior.
3. Monitoreo de exposición luminosa en museos o laboratorios
Sensores como el BH1750 se usan para proteger materiales sensibles:
- Fotografías
- Tintas
- Material biológico
- Obras de arte
Arduino puede registrar lux y activar alarmas o registrar datos por Ethernet/WiFi.
7. Fuentes recomendadas para profundizar
- Hoja de datos oficial del BH1750
Disponible en sitios de fabricantes como ROHM o WJ Technology. - Referencia del Bus I2C para Arduino
Documentación deWire.hen Arduino.cc. - Guía técnica de sensores de luminosidad
Tutorials de SparkFun o Adafruit sobre fotodiodos y luxómetros digitales.
8. Prompt para generar tu propio código con IA
Puedes sugerir este prompt a tus lectores, listo para copiar y pegar:
Prompt recomendado
Quiero que me ayudes a generar un código en Arduino para leer un sensor BH1750 por I2C.
Necesito que el programa tenga:
- Inicialización correcta del bus I2C.
- Lectura continua en modo High Resolution.
- Conversión a lux con explicación de cada línea.
- Mensajes claros por Serial Monitor.
- Manejo de errores si el sensor no responde.
Además, quiero que el código sea modular, usando funciones separadas para iniciar el sensor y tomar mediciones.
Explícame cómo modificar el tiempo de muestreo y cómo adaptar el programa para un ESP32 o un Arduino Nano Every.
