Tutorial módulo sensor de luz BH1750
EL módulo BH1750 es un sensor de luz, que a diferencia del LDR es digital y nos entrega valores de medición en Lux ( lumen /m² ) que es una unidad de medida estándar para el nivel de iluminación (iluminancia). Tiene alta precisión y un rango ente 1 – 65535 lx el cual es configurable.
EL módulo tiene un regulador interno de 3.3V pudiendo alimentar con 5V sin problemas.
La interfaz de comunicación es I2C pudiéndolo implementar en la mayoría de microcontroladores, el módulo aparte de los pines de alimentación y pines I2C tiene un pin para establecer la dirección.
Tenemos dos direcciones para poder trabajar:
Pin ADDR |
Dirección I2C |
---|---|
ADDR=HIGH (5V) |
0x5C |
ADDR=LOW (GND o NC) |
0x23 |
El pin ADDR internamente en el módulo tiene una resistencia a GND, por lo que si dejamos sin conectarlo la dirección será 0x23.
Podemos configurar también la resolución del sensor, el cual también afecta a la velocidad de medición; tenemos 3 modos de resolución:
Modo |
Resolución |
Tiempo de medición |
---|---|---|
High resolution Mode2 |
0.5 lx |
120 ms |
High Resolution Mode |
1 lx |
120 ms |
Llow Resolution Mode |
4 lux |
16 ms |
Estas tres configuraciones se subdividen en dos, en modo CONTINUOUS y ONE_TIME, con el primero es para cuando se realizan mediciones constantemente, el segundo para cuando no se necesitan realizar medidas de forma constante, cuando está configurada como ONE_TIME, el modulo se apaga después de realizar la medida, y para volver a leer es necesario volver a configurar.
Librería BH1750
Nosotros usaremos una de varias librerías que podemos encontrar en internet, usaremos la librería BH1750 escrita por Christopher Laws, librería que lo pueden descargar en:
https://github.com/claws/BH1750
A continuación explicamos las funciones da la librería
begin(mode)
Inicializa el módulo, esto inicializa la comunicación I2c de Arduino y configura la resolución del BH175, mode es la configuración que se va a establecer, esta puede ser:
BH1750_CONTINUOUS_HIGH_RES_MODE
BH1750_CONTINUOUS_HIGH_RES_MODE_2
BH1750_CONTINUOUS_LOW_RES_MODE
BH1750_ONE_TIME_HIGH_RES_MODE
BH1750_ONE_TIME_HIGH_RES_MODE_2
BH1750_ONE_TIME_LOW_RES_MODE
EL significado de cada uno se explicó anteriormente. Si no se especifica el mode , por defecto es BH1750_CONTINUOUS_HIGH_RES_MODE
configure(mode)
Al igual que el begin(), configura el BH175, con la diferencia que en esta función no se inicializa La comunicación I2C, para usar esta función la comunicación I2C ya debe estar inicializada.
Mode debe ser uno de los siguientes estados:
BH1750_CONTINUOUS_HIGH_RES_MODE
BH1750_CONTINUOUS_HIGH_RES_MODE_2
BH1750_CONTINUOUS_LOW_RES_MODE
BH1750_ONE_TIME_HIGH_RES_MODE
BH1750_ONE_TIME_HIGH_RES_MODE_2
BH1750_ONE_TIME_LOW_RES_MODE
EL significado de cada uno se explicó anteriormente.
readLightLevel()
Realiza una lectura de la iluminancia a la que está expuesto el sensor, nos retorna un entero sin signo con el valor de de la medicion de luz en Lux
Conexiones entre Arduino y el módulo BH1750
Las conexiones del módulo son como cualquier conexión con buz I2C:
Adaptador LCD a I2C |
Arduino Uno, Nano, Mini. |
Arduino Mega , DUE |
Arduino Leonardo |
---|---|---|---|
VCC |
5V |
5V |
5V |
GND |
GND |
GND |
GND |
SCL |
A5 |
21 |
3 |
SDA |
A4 |
20 |
2 |
ADDR |
No conectado |
No conectado |
No conectado |
El pin ADDR lo dejamos sin conectar puesto que la librería que usamos trabaja con la dirección 0x23.
Luxómetro: midiendo la iluminancia de un ambiente con el BH1750.
Este ejemplo realizamos mediciones de luz con el BH1750. La programación es sencilla, el proceso simplemente es configurar el modulo y luego realizar las lecturas.
El sketch es el siguiente:
#include <Wire.h> #include <BH1750.h> BH1750 Luxometro; void setup(){ Serial.begin(9600); Serial.println("Inicializando sensor..."); Luxometro.begin(BH1750_CONTINUOUS_HIGH_RES_MODE); //inicializamos el sensor } void loop() { uint16_t lux = Luxometro.readLightLevel();//Realizamos una lectura del sensor Serial.print("Luz(iluminancia): "); Serial.print(lux); Serial.println(" lx"); delay(500); }
A continuación se muestra las lecturas leídas:
Encendido de focos automático:
En este ejemplo encenderemos a apagaremos un led (que podría ser un foco de tu fachada o jardín) de acuerdo al nivel de luz que sensamos, de esta forma el foco se encenderá de forma automática en la noche y se apagará en el día.
Este ejemplo trabajaremos para simular un foco el led del pin13, pero fácilmente podrían conectarlo a un módulo relé o triac e implementarlo con un foco de 200V
El sketch es el siguiente:
#include <Wire.h> #include <BH1750.h> BH1750 Luxometro; uint16_t Lux_noche=20; uint16_t Lux_dia=30; int pinFoco=13; void setup(){ Serial.begin(9600); Serial.println("Inicializando sensor..."); Luxometro.begin(BH1750_CONTINUOUS_HIGH_RES_MODE); //inicializamos el sensor pinMode(pinFoco, OUTPUT); digitalWrite(pinFoco, LOW); } void loop() { uint16_t lux = Luxometro.readLightLevel();//Realizamos una lectura del sensor Serial.print("Luz(iluminancia): "); Serial.print(lux); Serial.println(" lx"); if(lux<Lux_noche) { digitalWrite(pinFoco, HIGH); Serial.println(" Noche - Foco Encendido"); } else if(lux>Lux_dia) { digitalWrite(pinFoco, LOW); Serial.println(" Dia - Foco Apagado"); } delay(500); }
Notar que tenemos dos umbrales para determinar si es día o noche, Lux_noche inferior a este valor de lux lo consideramos noche, Lux_dia superior a este valor lo consideramos dia, y valores entre Lux_noche y Lux_dia lo consideramos un estado de histéresis, en donde mantendremos el valor anterior del foco, esto con el fin de no hacer oscilar y no quemar el foco, puesto que si tuviéramos un solo umbral cuando nos encontremos justo en este valor cualquier variación pequeña de luz haría que el foco se encienda y apague pudiendo malograr el foco o simplemente dar una mala iluminación.
A continuación se muestra la salida del monitor serial:
Fa**** 13/10/2021 Responder
Hola. ¿Alguien sabe dónde podría obtener los datos con que se construyó la gráfica de la respuesta espectral del datasheet del BH1750? Necesito saber su sensibilidad para cada longitud de onda.Saludos, Fangio.
Sa****** *****ez 07/09/2020 Responder
Hola a todos.Alguien sabe la diferencia entre el modulo GY302 y el modulo GY30??
bo**** *******co 03/03/2020 Responder
Cuando uno se plantea ahorrar en la factura de la luz, además de realizar un consumo responsable, disponer de productos eficientes es parte importante de la ecuación.MA*** ***EZ 28/10/2019 Responder
hola como puedo obtener las lecturas de 4 sensores en un solo arduinoSe**** **ra 11/07/2019 Responder
Hola! Puedo visualizar en serial la lectura del sensor al cien por ciento, pero en mi SSH1106 sigue apareciendo una lectura de 0.00. que hago???El** ***** *il 02/02/2019 Responder
Hola, tengo una pregunta. Como puedo hacer que el sensor realice una medición cada minuto o cada 5 minutos?Ad**** 06/10/2019 Responder
Hola Eloy.Dentro del bloque loop() incorpora funcion de demora para hace cada segundo pon delay(60000) y para hacerlo cada 5 minutos pon delay(300000)
Jo** *****to 14/10/2018 Responder
Hola tengo un error, en el monitor serial me aparece solo inicializando sensor... y no aparece otra cosa podrias decirme a que se debe, gracias, tengo un arduino mega 2560, muchas graciasJo** 26/06/2018 Responder
Hola a todosDeseo saludarles y agradecerles esta publicación.con sus errores y soluciones
A mi me salen muchos errores, pero al final, cuando creo que ya funcionara, al complilar me sale el siguiente error:
exit status 1
Error compilando para la tarjeta Arduino Nano.
y en el informe detallado:
Arduino:1.8.5 (Windows 10), Tarjeta:"Arduino Nano, ATmega328P"
Archiving built core (caching) in: C:UsersJosepAppDataLocalTemparduino_cache_623347corecore_arduino_avr_nano_cpu_atmega328_0c812875ac70eb4a9b385d8fb077f54c.a
librariesBH1750-masterBH1750_1.cpp.o (symbol from plugin): In function `BH1750::BH1750(unsigned char)':
(.text+0x0): multiple definition of `BH1750::BH1750(unsigned char)'
librariesBH1750-masterBH1750.cpp.o (symbol from plugin):(.text+0x0): first defined here
librariesBH1750-masterBH1750_1.cpp.o (symbol from plugin): In function `BH1750::BH1750(unsigned char)':
(.text+0x0): multiple definition of `BH1750::BH1750(unsigned char)'
librariesBH1750-masterBH1750.cpp.o (symbol from plugin):(.text+0x0): first defined here
librariesBH1750-masterBH1750_1.cpp.o (symbol from plugin): In function `BH1750::BH1750(unsigned char)':
(.text+0x0): multiple definition of `BH1750::configure(BH1750::Mode)'
librariesBH1750-masterBH1750.cpp.o (symbol from plugin):(.text+0x0): first defined here
librariesBH1750-masterBH1750_1.cpp.o (symbol from plugin): In function `BH1750::BH1750(unsigned char)':
(.text+0x0): multiple definition of `BH1750::begin(BH1750::Mode)'
librariesBH1750-masterBH1750.cpp.o (symbol from plugin):(.text+0x0): first defined here
librariesBH1750-masterBH1750_1.cpp.o (symbol from plugin): In function `BH1750::BH1750(unsigned char)':
(.text+0x0): multiple definition of `BH1750::readLightLevel(bool)'
librariesBH1750-masterBH1750.cpp.o (symbol from plugin):(.text+0x0): first defined here
collect2.exe: error: ld returned 1 exit status
exit status 1
Error compilando para la tarjeta Arduino Nano.
Este reporte podría tener más información con
"Mostrar salida detallada durante la compilación"
opción habilitada en Archivo -> Preferencias.
Bueno, si alguien puede ayudarme, le estare muy agradecido
Pa*** 23/06/2018 Responder
Pude resolver el problema, hay un error en la sintaxis del código. Se debe usar lightMeter y no Luxometro.Además para seleccionar el tipo de muestreo se debe usar BH1750::CONTINUOUS_HIGH_RES_MODE y no BH1750_CONTINUOUS_HIGH_RES_MODE.
Con respecto a la librería se debe descargar el archivo Zip (BH1750-master.zip) extraerlo el la carpeta de \Arduino\libraries como cualquier otra librería.
Ad**** 06/10/2019 Responder
Gracias Pablo, aunque lo de lightMeter en vez de Luxometro no afecta para nada.Lo que se tiene que cambiar es en vez de BH1750_CONTINUOUS_HIGH_RES_MODE poner:
BH1750::CONTINUOUS_HIGH_RES_MODE.
La unica diferencia es :: en vez de _ (dos puntos dos puntos en vez de guion bajo).
Gracias
JU** * *****AR 05/10/2018 Responder
Si tiene razon, realizando dichos cambios la compilacion es exitosa. Gracias y muy buen aporte !!Pa*** 23/06/2018 Responder
Hola yo tambien tengo el mismo problema, descargue la librería y al compilar me devuelve el error: 'BH1750_CONTINUOUS_HIGH_RES_MODE' was not declared in this scope. Ya probe de todo y no puedo solucionarlo. Gracias.Ma**** 17/05/2018 Responder
Hola qué tal. Tengo el mismo problema de laura, descargué y añadí la librería, cuando compilo el codigo me bota este error: BH1750_CONTINUOUS_LOW_RES_MODE' was not declared in this scope. Alguien tendrá alguna solución? Graciasla*** 12/05/2018 Responder
hola buenas noches, tengo un problema con la compilación del programa , ya descargué y añadí la librería y al momento de compilar me manda este error: 'CONTINUOUS_HIGH_RES_MODE' was not declared in this scope. les agradeceria mucho que me ayudaran a solucionarlo. Graciasjo** **is 03/04/2018 Responder
es posible poner mas de 1 sensores en un solo arduino?Al******* 06/04/2018 Responder
Sí, en el Arduino Uno R3 tienes 6 entradas analógicas (A0, .., A5). Te adjunto las características en este link: https://bit.ly/2hXOablGa** 15/03/2018 Responder
Hola,No se si me puedes ayudar con la siguiente duda:
El voltaje de salida del sensor BH1750 que va a la placa arduino sabes de cuanto es?
Por que el sensor LDR tenía una diferencia de potencial entre la placa y el sensor, y lo podias controlar mediante una resistenca. En cambio con este sensor no hablais si tiene un voltaje de salida por la intenisdad de luz que recibe.
gracias por el tutorial, es muy completo!
Di*** 02/06/2017 Responder
hola buenas tardes.. me funciona bien el sensor. quiero regular un foco led mediante la cantidad de luxes que tenga en mi oficina. agradeceria que me echaran la mano con el codigo y la electronica para poder hacer eso y echar andar mi sensor.. de antemano graciasri***** ****ta 18/02/2018 Responder
holabusca e implementa el motor paso a paso para arduino. una vez te funcione. ese giro lo acoplas a un DIMMER . le das una orden para q el valor de salida sea inverso a la entrada..
saludos
ed***** 20/12/2016 Responder
hola buenas tardes .. tengo un problema con la compilacion del programa , he descargado la libreria que han proporcionado arriba , la he colocado en la carpeta de librerias en donde se instalo mi arduino y al momento de compilar me manda este error ....luxometro.ino:2:20: fatal error: BH1750.h: No such file or directory
compilation terminated.
Error de compilación
.... le agradeceria mucho que me ayudaran a solucionarlo .. de antemano gracias
ed***** 20/12/2016 Responder
... he resuelto el problema .. en ves de colocar la carpeta(BH1750-master) directamente en la carpeta librería use la opción de importar desde el sketch así solo le dije a arduino donde buscar la libreria . en este caso le dije que en el zip. que nos proporcionan en la descarga ... gracias que tengan un buen diaAN****** 17/11/2016 Responder
gracias con este tutorial pude poner a funcionar mi sensor