Como funciona o sensor de luz BH1750
janeiro 31, 2017 4:00 pm Publicado por major 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.
O diagrama de blocos mostra a estrutura interna do sensor e seus elementos, em alto nível.
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
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.
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).
Copyright (c) 2017 Pedro Minatel
//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){
Github: Código completo
À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.