Como funciona o sensor de luz BH1750

janeiro 31, 2017 4:00 pm Publicado por Deixe um comentário

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 artigo, mas vou 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, que tem uma biblioteca já pronta para Arduino, que pode ser facilmente encontrada no GitHub.

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:

//Inicia a comunicação I2C no endereço selecionado
Wire.beginTransmission(u8_BH1750_address);
//Configura o sensor para o modo de operação
Wire.write(mode_HighResolution_1);
//Finaliza a comunicação
Wire.endTransmission();

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:

//Faz a requisição de leitura do sensor, esperando 2 bytes de resosta
Wire.requestFrom(u8_BH1750_address, 2); //
 
//Espera a chegada dos 2 bytes
if (2 <= Wire.available()) {
  sensor_result = Wire.read();
  sensor_result = sensor_result << 8;
  sensor_result |= Wire.read();
  Serial.println(sensor_result);
}

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).

/*
The MIT License (MIT)
Copyright (c) 2017 Pedro Minatel
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
 
#include <Wire.h>
 
//Endereço do sensor BH1750
byte u8_BH1750_address = 0x23; //Pino ADDR em nível lógico 0
//byte u8_BH1750_address = 0x5c; //Pino ADDR em nível lógico 1
 
//Instruções de modo de leitura
byte mode_HighResolution_1 = 0x10; //Modo de alta precisão com 1 lux de resolução
byte mode_HighResolution_2 = 0x11; //Modo de alta precisão com 0.5 lux de resolução
byte mode_LowResolution = 0x13; //Modo de baixa precisão com 4 lux de resolução
 
uint16_t sensor_result = 0;
 
void read_sensor(void){
 
  //Inicia a comunicação I2C no endereço selecionado
  Wire.beginTransmission(u8_BH1750_address);
  //Configura o sensor para o modo de operação
	Wire.write(mode_HighResolution_1);
  //Finaliza a comunicação
	Wire.endTransmission();
 
  //Faz a requisição de leitura do sensor, esperando 2 bytes de resosta
  Wire.requestFrom(u8_BH1750_address, 2); //
 
  //Espera a chegada dos 2 bytes
  if (2 <= Wire.available()) {
    sensor_result = Wire.read();
    sensor_result = sensor_result << 8;
    sensor_result |= Wire.read();
    Serial.println(sensor_result);
  }
}
 
void setup(void){
  Wire.begin();
  Serial.begin(115200);
}
 
void loop(void){
  read_sensor();
  delay(2000);
}

Github: Código completo

Conclusão

Às 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.

Source: IMasters

Categorizados em:

Este artigo foi escrito pormajor

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *