Skip to Content

Sensor de Luz Ambiente BH1750 com Arduino

Sensor de Luz Ambiente BH1750 com Arduino

Neste tutorial, vais aprender a usar o Sensor de Luz Ambiente BH1750, um OLED e um Arduino Uno para medir e mostrar a intensidade da luz.

Embora possas usar um simples resistor dependente de luz ( LDR ) para detetar luz, essas leituras não estão calibradas para uma unidade padrão definida de intensidade luminosa. O sensor BH1750, por outro lado, mede intensidades de luz em lux e, por isso, oferece medições muito mais comparáveis.

Se quiseres saber mais, continua a ler.

Peças Necessárias

Usei um Arduino Uno para este projeto, mas qualquer outro Arduino ou placa ESP32/ESP8266 também funcionará. Quanto ao Sensor de Luz, usei a placa breakout listada abaixo, mas existe também um BH1750 sensor com uma tampa protetora, que pode ser melhor para algumas aplicações práticas.

Sensor de Luz Ambiente BH1750

Arduino

Arduino Uno

USB Data Sync cable Arduino

Cabo USB para Arduino UNO

Dupont wire set

Conjunto de Fios Dupont

Half_breadboard56a

Breadboard

OLED display

Ecrã 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.

O Sensor de Luz Ambiente BH1750

O Sensor de Luz Ambiente BH1750 é um sensor digital que mede a intensidade da luz ao seu redor. Fornece uma interface I2C para comunicar com microcontroladores como Arduino e ESP32. O sensor tem uma ampla gama de sensibilidade luminosa, de 1 a 65535 lux, tornando-o adequado para várias condições de iluminação.

Uma das principais características do sensor BH1750 é o seu baixo consumo de energia (corrente em modo desligado de 0,01 µA), tornando-o ideal para dispositivos alimentados por bateria. Também tem alta resolução e pode fornecer leituras precisas da intensidade luminosa. O sensor é fácil de usar e pode ser integrado em vários projetos DIY, como sistemas de iluminação automáticos, agricultura inteligente e estações meteorológicas. Para mais detalhes, consulta o datasheet:

Internamente, o chip do sensor contém um fotodíodo (PD) como detector de luz, um amplificador de sinal (AMP), um conversor analógico-digital de 16 bits (ADC) e alguma lógica para converter o valor do ADC numa medição de intensidade luminosa e enviá-la via I2C. A imagem seguinte mostra o diagrama de blocos:

Block Diagram of BH1750
Diagrama de Blocos do BH1750 ( source )

Placa breakout do sensor BH1750

O chip do sensor é muito pequeno e, para projetos Arduino, normalmente usas uma placa breakout que tem pinos maiores, um regulador de tensão e resistores pullup para a interface I2C. O regulador de tensão permite usar o sensor a 3,3V ou 5V. A imagem abaixo mostra a frente e o verso de uma típica placa breakout do sensor BH1750:

Front and back of breakout board for BH1750
Frente e verso da placa breakout para BH1750

Podes ver os pinos de alimentação (VCC, GND), a interface I2C (SCL, SDA) e um pino ADDR. O pino ADDR pode ser usado para definir o endereço I2C do sensor. Se ligares o ADDR ao VCC, o endereço do sensor será 0x5C. Caso contrário, o endereço I2C (padrão) é 0x23.

Medições em Lux

O sensor mede a intensidade luminosa em lux, que segundo Wikipedia é definido da seguinte forma:

lux  (símbolo:  lx ) é a unidade de  illuminance , ou  luminous flux  por unidade de área, no sistema  International System of Units  (SI). É igual a um  lumen  por metro quadrado. Em  photometry , isto é usado como medida da intensidade, tal como percebida pelo olho humano, da  light  que incide ou passa através de uma superfície.

A tabela seguinte mostra níveis de Lux para diferentes condições de iluminação. Se usares o sensor BH1750 para medir níveis de lux, nota que o ângulo da luz incidente afetará a medição.

Lux Levels
Níveis de Lux ( source )

O datasheet contém a curva de Resposta Espectral para o BH1750 e podes ver que o sensor é mais sensível à luz na faixa de comprimento de onda entre 500nm e 600nm.

Spectral Response of BH1750
Resposta Espectral do BH1750 ( source )

Ligação do BH1750 ao Arduino

Devido à interface I2C, ligar o sensor de luz BH1750 a um Arduino é muito simples. Primeiro, liga os pinos SCL e SDA da placa breakout do BH1750 aos pinos correspondentes no Arduino, como mostrado abaixo. Depois, liga o terra e o VCC.

Wiring of BH1750 sensor with Arduino
Ligação do sensor BH1750 ao Arduino

Como a placa breakout funciona a 5V ou 3,3V, podes usar qualquer um para o VCC; eu escolhi 3,3V. Na próxima secção, vamos escrever algum código para testar o funcionamento do sensor.

Código para medir Luz Ambiente com BH1750

Começamos por implementar um código simples de teste que imprime a intensidade luminosa medida pelo 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);
}

O código começa por incluir as bibliotecas necessárias. A Wire library é uma biblioteca padrão que vem com o core do Arduino, mas a BH1750 library tens de instalar. Basta abrir o Library Manager, procurar por BH1750 e instalar a BH1750 library de Christopher Laws, como mostrado abaixo:

BH1750 library by Christopher Laws in Library Manager
Biblioteca BH1750 no Library Manager

Existem várias outras bibliotecas, e a BH1750 library de Rob Tillaart é uma alternativa interessante, pois tem funções adicionais para compensação de temperatura, correção de ângulo e medição assíncrona.

Na função setup inicializamos a comunicação serial, a comunicação I2C via Wire e o sensor BH1750. Nota que precisas chamar Wire.begin() , mesmo quando usas os pinos I2C padrão. No entanto, se quiseres usar pinos diferentes para SDA e SCL, podes usar Wire.begin() para os definir.

Na função loop, a cada segundo, lemos o nível de luz do BH1750 em lux e imprimimos o valor no Monitor Serial. Se abrires o Serial Plotter e expuseres o sensor a uma fonte de luz, deverás ver um pico no gráfico:

Serial Plotter showing light response of BH1750
Serial Plotter mostrando resposta luminosa do BH1750

Adicionar um OLED

Em vez de mostrar os dados no Monitor Serial, seria mais agradável exibi-los num ecrã separado. Isso permitiria construir um Luxímetro portátil. Nesta secção, adicionamos portanto um OLED ao circuito e mostramos a intensidade luminosa nele.

Ligação do OLED ao Arduino

Como o OLED também é um dispositivo I2C, a ligação é simples. Ligamos SDA e SCL aos mesmos pinos onde o sensor BH1750 está ligado. Como o OLED funciona a 3,3V, podemos também partilhar as linhas de alimentação. A imagem abaixo mostra a ligação completa.

Connecting OLED and BH1750 with Arduino
Ligação do OLED e BH1750 ao Arduino

Se tiveres dificuldades com o OLED, consulta o tutorial How to Interface the SSD1306 I2C OLED Graphic Display With Arduino . A imagem abaixo mostra a ligação completa numa breadboard real.

Wiring of OLED and BH1750 with Arduino
Ligação do OLED e BH1750 ao Arduino numa breadboard

Código para mostrar dados do BH1750 no OLED

Nesta secção, vais aprender a mostrar a intensidade luminosa medida pelo BH1750 num ecrã OLED. Para escrever no OLED, vamos usar a biblioteca Adafruit_SSD1306 . Podes instalá-la via Library Manager como de costume:

Adafruit_SSD1306 library installed in Library Manager
Biblioteca Adafruit_SSD1306 instalada no Library Manager

O código abaixo lê a medição de luz do sensor BH1750 e mostra o valor em lux no OLED. Vê o código completo primeiro antes de discutirmos os detalhes.

#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);
}

Bibliotecas e Inicialização do Ecrã

Começamos por incluir as bibliotecas necessárias para o sensor BH1750 e para o ecrã OLED Adafruit SSD1306. Depois inicializamos o ecrã OLED na função oled_init() . Esta função configura o ecrã, limpa-o, define o tamanho do texto e a cor do 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);
}

Nota que o endereço I2C do ecrã OLED está definido para 0x3C em oled.begin() . A maioria destes pequenos OLEDs usa este endereço, mas o teu pode ser diferente. Se não vires nada no OLED, provavelmente tem um endereço I2C diferente e tens de alterar o endereço passado para oled.begin() . Se não souberes o endereço I2C, consulta o tutorial How to Interface the SSD1306 I2C OLED Graphic Display With Arduino .

Funções de Exibição

A função centered() é usada para imprimir texto centrado no ecrã OLED numa coordenada y especificada. A função display_lux() lê a intensidade luminosa em lux do sensor e mostra-a no ecrã 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
}

Função Setup

Na função setup() , inicializamos a comunicação serial para depuração, inicializamos o ecrã OLED e iniciamos a comunicação com o sensor BH1750. Se alterares os pinos I2C onde o sensor está ligado, então Wire.begin() é o local onde tens de ajustar.

void setup() {
  oled_init();
  Wire.begin();
  luxMeter.begin();
}

Função Loop

A função loop() chama continuamente a função display_lux() para atualizar e mostrar o valor no ecrã OLED. Depois adiciona um atraso de 1 segundo antes da próxima atualização.

void loop() {
  display_lux();
  delay(1000);
}

Saída no OLED

Se carregares e executares o código, deverás ver a intensidade luminosa em lux mostrada no OLED.

BH1750 Output on OLED
Saída do BH1750 no OLED

E assim tens um luxímetro simpático que podes usar para medir intensidades de luz!

Conclusões

Neste tutorial aprendeste a usar o Sensor de Luz Ambiente BH1750, um OLED e um Arduino Uno para construir um luxímetro.

Como o BH1750 tem um modo de baixo consumo e funciona a 3,3V, seria especialmente adequado para construir um luxímetro portátil alimentado por bateria usando um ESP32. Dá uma vista de olhos no Simple ESP32 Internet Weather Station , onde usamos um ESP32 alimentado por bateria, para detalhes técnicos.

Além disso, se usares o luxímetro principalmente no exterior, recomendaria um ecrã e-Paper em vez de um OLED, pois será muito melhor para ler à luz direta do sol. O tutorial Weather Station on e-Paper Display pode ser útil aqui.

Finalmente, se quiseres medir especificamente luz UV, temos também um tutorial sobre isso: UV Index Meter With VEML6070 and Arduino

Se tiveres alguma dúvida, não hesites em perguntar.

Boas experiências ; )