Como funciona o sensor de luz BH1750

Muitas vezes fazemos uso de bibliotecas, ajudando no desenvolvimento e facilitando para quem não tem tempo ou conhecimento necessário para uma implementação partindo do zero. Em alguns casos, não conseguimos encontrar uma biblioteca adequada, sendo as vezes, necessário criar uma.

Um problema em utilizar bibliotecas, é que de certo modo, ficamos sem saber como é de fato o funcionamento, seja de um sensor, atuador ou mesmo uma integração com a nuvem.

Não vou abordar a criação de uma biblioteca neste post, e sim mostrar o funcionamento de um sensor, neste caso o BH1750, de luminosidade, sem o uso de biblioteca pronta para este sensor.

Vale lembrar que a biblioteca wire, será utilizada para a comunicação I2C. Vou demonstrar apenas o que cabe ao uso do sensor BH1750.

O BH1750 tem uma biblioteca já pronta para Arduino, que pode ser facilmente encontrada no gitHub.

Quem quiser adquirir o sensor, a loja FILIPEFLOP tem disponível para compra, o mesmo utilizado neste post.

O BH1750

Para o uso do sensor, todas as informações são facilmente encontradas no datasheet do fabricante, que pode ser baixado aqui.

O sensor BH1750 é um sensor de luminosidade com interface I2C, utilizado para detectar a incidência de luz. É muito utilizado em sistemas que detectam a luminosidade para um ajuste de eficaz da iluminação, por exemplo.

Algumas características do sensor:

  • Interface I2C de comunicação
  • Resposta de espectro de luz idêntico ao olho humano
  • Resolução de 16bits
  • Modo power down para baixo consumo
  • Filtro para frequências de 50 e 60Hz
  • Baixa influencia de luz infravermelha

Diagrama de bloco

O diagrama de blocos mostra a estrutura interna do sensor e seus elementos, em alto nível.

Instruções

O BH1750 possui um conjunto de instruções, com o seu respectivo opecode. Para enviar um comando para o sensor, precisamos enviar, acompanhado do endereço, o código da instrução, conforme tabela abaixo:

O endereço é definido pelo pino ADDR, onde:

  • Nível lógico 0: 0x23
  • Nível lógico 1: 0x5c

A figura abaixo ilustra a forma de envio do opecode:

Por exemplo, para fazer leituras em alta resolução, devemos seguir os seguintes comandos com a biblioteca wire:

Feito o envio do opecode, devemos esperar que o sensor faça a aquisição do sinal e somente depois desta aquisição podemos fazer a requisição do valor, ou esperar que o sensor responda com o valor lido.

Dependendo do modo da resolução, podemos ter temporizações diferentes, podendo variar de 16 a 120ms de tempo de resposta do sensor.

Para fazer a requisição do dado, utilizamos as seguintes instruções:

Como a resolução do sensor é de 16bits, devemos esperar a resposta em 2bytes.

Código Exemplo

Para demonstrar o funcionamento do BH1750, o código (plataforma Arduino) abaixo faz uma leitura do sensor no modo “alta resolução”, a cada 2 segundos. A comunicação I2C se dá com o uso da biblioteca Wire (wire.h).

Github: Código completo

Conclusão

As vezes usar bibliotecas é uma solução interessante, mas, mesmo assim, é importante entender o funcionamento do sensor. Muitas vezes a biblioteca não faz uso de todas as funções disponíveis no sensor, ou não deixa fazer uma configuração mais customizada.

Na questão do sensor, o BH1750 tem uma ótima resolução e consegue captar pequenas variações de luz, algo que com o LDR é bem mais complicado de conseguir.

 

Happy Hacking!

Deixe seu comentário