Projeto103 - Como usar o sensor BH1750 com Arduino sem auxílio de biblioteca específica

Básico - Projeto 103

Usando o sensor BH1750FVI sem biblioteca - luminosidade

Objetivo

O objetivo deste projeto é mostrar como utilizar o sensor de luz BH1750FVI junto com o Arduino para determinar a quantidade de luz que incide sobre o sensor, medida em LUX. Para isto, vamos utilizar o módulo GY-302 ou o módulo GY-30 que possuem o sensor de luz BH1750FVI e geram o mesmo resultado. Para o melhor entendimento dos princípios do funcionamento do sensor BH1750, não vamos usar neste projeto qualquer tipo de biblioteca específica, podendo assim, demonstrarmos todas as etapas de atuação do sensor. O projeto deverá exibir as leituras no Monitor Serial do IDE do Arduino a cada 2 segundos, de forma contínua.

Obs.: É bom lembrar que existem bibliotecas disponíveis para simplificar a programação com este sensor. Falaremos destas bibliotecas nos próximos projetos.

Definições

Obs.: Geralmente os módulos GY-30 e GY-302 não são fornecidos com os pinos soldados.

Módulos GY-30 e o GY-302

1. Como possuem o sensor de luminosidade BH1750FVI (datasheet) como base, estes módulos são capazes de determinar o nível de iluminação (iluminância) que incide sobre o sensor, medido em lux (lx). Portanto, os módulos GY-30 e GY-302 são utilizados para medir a quantidade de luz dentro do ambiente onde está localizado o sensor.

2. O circuito integrado BH1750FVI é capaz de medir a intensidade da luz em lux na faixa de 1 a 65535 lx, sendo ideal para aplicação em sistemas de controle de iluminação automática.

3. O circuito integrado BH1750FVI gera uma resposta de espectro de luz idêntico ao olho humano;

4. Os módulos possuem interface I2C de comunicação, facilitando a montagem e a conexão com o Arduino.

5. Os módulos possuem conversor AD de 16 bits (para transformar sinal analógico em sinal digital) e funcionam com tensões entre 3 e 5Vcc (corrente contínua) .

6. módulos GY-30 e GY-302 são similares e retornam valores de iluminância com a mesma precisão. Se diferem apenas pelas suas dimensões e disposição dos seus pinos de conexão.

Conceitos importantes

Luz ou luz visível é a radiação eletromagnética dentro da parte do espectro eletromagnético que é percebida pelo olho humano. A luz visível é geralmente definida como tendo comprimentos de onda na faixa de 400–700 nanômetros, entre o infravermelho e o ultravioleta. Wikipédia

Fluxo luminoso é a radiação total emitida em todas as direções por uma fonte luminosa ou fonte de luz que pode produzir estímulo visual. Estes comprimentos de onda estão compreendidos entre 380 a 780 nm. Sua unidade é o lúmen (ln). Wikipédia

Iluminamento, intensidade de iluminação ou iluminância é uma grandeza de luminosidade que faz a relação entre o fluxo luminoso que incide na direção perpendicular a uma superfície e a sua área. Na prática, é a quantidade de luz dentro de um ambiente. Sua unidade é o lux (lúmen/m2). Wikipédia

A importância de se medir a iluminância em ambientes, além de possibilitar a automação, pode servir como referência para projetos de iluminação residencial ou comercial. A partir de normas padronizadas podemos projetar ambientes com luminosidade adequada para o conforto visual dos usuários. Veja como exemplo a norma ABNT NBR 5413 que estabelece os valores de iluminâncias médias mínimas para iluminação artificial em interiores. A seguir mostramos uma tabela com alguns exemplos de valores médios de iluminânica:

  

Aplicação

Para fins didáticos e em sistemas de controle de iluminação automático ou apenas circuitos para medição da luz ambiente nos mais diversos tipos de projetos robóticos ou de automação residencial. É muito utilizado em sistemas que detectam a luminosidade para um ajuste de eficaz da iluminação, por exemplo.

Componentes necessários

Referência

Componente

Quantidade

Imagem

Observação

Protoboard Protoboard 830 pontos 1 Resultado de imagem para protoboard 830v

No mínimo utilizar protoboard com 830 pontos

Jumpers Kit cabos ligação macho / macho 1  
Módulo Sensor de Luminisidade

Módulo Sensor de Luz GY-30 ou GY-0302

1

Especificações:

Módulo sensor de luminosidade GY-302 ou GY-30

CI BH1750FVI (datasheet)

Tensão de operação 3 a 5V DC
Faixa de medição 1 à 65.535 Lux
Interface I2C
Conversor AD 16 bits
Dimensões 18,5 x 13,9mm

Arduino UNO R3 Arduino UNO 1

Você poderá utilizar uma placa Arduino UNO original ou similar

Montagem do Circuito (módulo GY-302 e módulo GY-30)

Conecte os componentes no Protoboard como mostra a figura abaixo. Verifique cuidadosamente os cabos de ligação antes de ligar seu Arduino. Lembre-se que o Arduino deve estar totalmente desconectado da energia elétrica enquanto você monta o circuito.

Observação: Mostramos na imagem acima a montagem do módulo GY-302 e do módulo GY-30 com o Arduino. Portanto, na hora da montagem, observe que existe uma diferença entre eles na disposição dos pinos de conexão com o Arduino.

Atenção

1. Veja na imagem abaixo a "pinagem" do módulo GY-302 (à esquerda) e o módulo GY-30, que funcionam com a interface I2C.

 

 2. Observe nas imagens que os módulos GY-302 e Gy-30 possuem os pinos de alimentação Vcc e GND e os pinos de interface I2C: SCL (Clock), SDA (Data) e ADDR (Address).

2.1. Pino Vcc: Deve ser conectado com o pino 3,3V ou 5V do Arduino. O sensor possui tensão de operação de 3 a 5Vcc.

2.2. Pino GND: Deve ser conectado no GND do Arduino.

2.3. Para a interface I2C, vamos usar os pinos SCL, SDA. Faça a conexão dos pinos SCL e SDA com o Arduino da seguinte forma:

Obs.: No nosso exemplo usamos o Arduino Uno.

MICROCONTROLADOR SCL SDA
Arduino Uno A5 A4
Arduino Nano A5 A4
Arduino Mega 21 20
Leonardo/Micro 3 2

2.4. Para o endereçamento I2C vamos utilizar o pino ADDR. Observe que no nosso projeto fizemos a conexão do pino ADDR com o GND do Arduino. Portanto, definimos o endereçamento em um nível lógico baixo (0 ou LOW).

2.4.1. O endereçamento é definido pelo pino ADDR, onde:

a) Nível lógico 0 (LOW): 0x23 (conexão com o GND do Arduino)

b) Nível lógico 1 (HIGH): 0x5c (conexão com o Vcc do Arduino)

Pino ADDR Endereço
Nível lógico 0 (LOW) 0x23
Nível lógico 1 (HIGHT) 0x5c

Obs.: No Arduino devemos expressar um número hexadecimal com o prefixo "0X" e um número binário com o prefixo "B".

2.4.2. A utilização do pino ADDR é necessária nesse projeto para a leitura da luminosidade do ambiente. Também deve ser usado, por exemplo, para ligar dois sensores no mesmo microcontrolador.

Obs.: Quando adicionamos uma biblioteca pronta para calcular o resultado obtido pelo leitura de um sensor BH1750, a utilização do pino ADDR pode ser opcional.

3. O sensor BH1750 possui um conjunto de instruções com o seu respectivo código de operação (opecode). Portanto, para enviar um comando para o sensor, podemos enviar o código de operação acompanhado do endereço, conforme tabela abaixo:

 3.1. Temos portanto, seis modos diferentes para medir a intensidade de iluminação de um ambiente, sendo eles:

Item  Medição Comando Opecode (binário)

Opecode (hexadecimal)

Descrição
1

Medição única

(O sensor fica desativado após a medição)

Modo de baixa resolução 00100011 0X23 Precisão de 4lx, tempo de medição de 16ms 
2  Modo de alta resolução 1 00100000 0X20 Precisão de 1lx, tempo de medição de 120ms   
3 Modo de alta resolução 2  00100001 0C21 Precisão de 0.5lx, tempo de medição de 120ms   
 4  Medição contínua Modo de baixa resolução  00010011 0x13 Precisão de 4lx, tempo de medição de 16ms   
5  Modo de alta resolução 1 00010000 0x10 Precisão de 1lx, tempo de medição de 120ms 
6 Modo de alta resolução 2 00010001 0x11 Precisão de 0.5lx, tempo de medição de 120ms   

4. Com as informações acima, seguem algumas considerações sobre a programação:

4.1. Atribuição para definir os modos de leitura do sensor (opecode).

4.1.1. Definimos as variáveis abaixo com os valores hexadecimais do opecode (códigos de operação) referentes aos modos de leitura que podemos utilizar na programação. Observe que determinamos apenas os modos de leitura para medição contínua (itens 4, 5 e 6 da tabela acima), pois o nosso objetivo é fazer leituras de forma continuada a cada 2 segundos.

// Instruções de modo de leitura do sensor (medição contínua)
byte mode_LowResolution = 0x13;    //Modo de baixa precisão com 4 lux de resolução
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

4.2. Endereço do sensor para identificação (endereçamento I2C).

4.2.1. Como foi mostrado anteriormente, definimos no projeto que o Pino ADDR de endereçamento I2C está conectado no GND do Arduino (nível lógico 0). Portanto, o endereço I2C do sensor foi definido como: 0X23

4.2.2. Veja no exemplo abaixo, onde atribuímos o valor hexadecimal do endereço do sensor à variável BJ1750addr:

//Endereço do sensor BH1750
byte BH1750addr = 0x23; //Pino ADDR em nível lógico 0
//byte BH1750addr = 0x5c; //Pino ADDR em nível lógico 1

Obs.: Caso tenha feito a conexão do Pino ADDR no Vcc do Arduino (3,3V ou 5V), o endereço do sensor passa ser: 0x5C. Portanto, mude o comentário (//) para a linha acima.

4.3. Inicia a comunicação I2C no endereço selecionado para o sensor e faz o envio do opecode desejado (instrução para o modo de leitura)

4.3.1. Para realizar a comunicação via protocolo I2C (comunicação com 2 fios: clock (SCL) e dado (SDA)) podemos utilizar a biblioteca Wire.h que já vem instalada por padrão no IDE do Arduino.

4.3.1.1. A biblioteca Wire.h é responsável por conter as funções necessárias para gerenciar a comunicação entre os dispositivos através do protocolo I2C.

4.3.1.2. Para cada leitura será necessário iniciar a comunicação I2c no endereço selecionado do sensor. Depois, escrevemos qual o modo de resolução queremos e finalmente, finalizamos a comunicação I2C, utilizando sempre as funções da biblioteca Wire.h.

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

4.4. Requisição da leitura do sensor e resposta da leitura

4.4.1. Após o envio do opecode, o programa aguarda o sensor fazer a aquisição do sinal, que pode variar de 16ms (baixa resolução) a 120ms (alta resolução) de tempo de resposta.

4.4.2. Para fazer a requisição do valor lido e obtermos o resultado (leitura do sensor), utilizamos as seguintes instruções:

//Faz a requisição de leitura do sensor, esperando 2 bytes de resposta
Wire.requestFrom(BH1750addr, 2); //
 
//Espera a chegada dos 2 bytes (reslução de 16bits)
if (2 <= Wire.available()) {
  result = Wire.read();
  result = result << 8;
  result = result | Wire.read();
}

 Obs.: Para melhor entendimento do código acima, leia o artigo Operadores Bitwise (Bit-a-Bit) do blog Diogo Matheus (trabalhando com operações em bits)

4.4.3. Pronto, obtemos agora o valor decimal do resultado que poderá ser exibido no Monitor Serial. Esse processo é necessário para que o sensor transforme o valor analógico lido para um valor digital, através do conversor AD de 16 bits que possui.

5. A montagem do nosso exemplo foi realizada em um protoboard com 400 pontos o módulo GY-302. Verifique sempre se o seu protoboard possui linhas de alimentação contínuas ou separadas.

Código do Projeto (Sketch)

1. Faça o download e abra o arquivo projeto103.ino no IDE do Arduino: DOWNLOAD - projeto103.ino

2. Se preferir, copie e cole o código abaixo no IDE do Arduino:

Observação: Caso deseje alterar o modo de leitura do sensor, na função Wire.write(modo) substitua a variável "modo" atual para: mode_LowResolutio, mode_HighResolution_1 ou mode_HighResolution_2, sendo:

mode_LowResolution = 0x13;     //Modo de baixa precisão com 4 lux de resolução
mode_HighResolution_1 = 0x10;  //Modo de alta precisão com 1 lux de resolução
mode_HighResolution_2 = 0x11;  //Modo de alta precisão com 0.5 lux de resolução

/*******************************************************************************

     Projeto 103 - Medir luminosidade em lux sem biblioteca - BH1750
     Autor: Angelo Luis Ferreira
     Data: 28/06/2022
             http://squids.com.br/arduino

*******************************************************************************/
#include <Wire.h>                    // biblioteca requerida para rodar I2C

//Endereço do sensor BH1750
byte BH1750addr = 0x23; //Pino ADDR em nível lógico 0
//byte BH1750addr = 0x5c; //Pino ADDR em nível lógico 1

// Instruções de modo de leitura do sensor (medição contínua)
byte mode_LowResolution = 0x13;     //Modo de baixa precisão com 4 lux de resolução
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

// Variáveis globais iniciais
uint16_t result = 0;        // variável que carrega os valores lidos

void setup() {
  Serial.begin(9600);      // inicializa comunicação serial
  Wire.begin();            // inicializa a biblioteca Wire.h

  Serial.println(F("LUMINOSIDADE COM SENSOR BH1750")); // Texto guardado na memória flash
}

void loop() {
  read_sensor();          // chama a função read_sensor (lê sensor)
  delay(2000);            // espera de 2000ms (2seg)
}

void read_sensor() {
  //Inicia a comunicação I2C no endereço selecionado
  Wire.beginTransmission(BH1750addr);
  //Configura o sensor para o modo de operação
  Wire.write(mode_HighResolution_1);          // altere para o modo de leitura desejado
  //Finaliza a comunicação
  Wire.endTransmission();

  //Faz a requisição de leitura do sensor, esperando 2 bytes de resposta
  Wire.requestFrom(BH1750addr, 2); //
 
  //Espera a chegada dos 2 bytes (reslução de 16bits)
  if (2 <= Wire.available()) {
    result = Wire.read();     
    result = result << 8;     
    result = result | Wire.read();    
  }

  // Exibe resultado no Monitor Serial
  Serial.print(result);
  Serial.println(" lx");
}

Imagem do resultado (Monitor Serial)

Como o projeto deve funcionar

1. Ao rodar o programa, são exibidas as leituras de iluminância sobre o sensor a cada 2 segundos.

Desafios

Com base neste projeto, resolva o seguinte desafio:  Desafio 94

O anúncio abaixo ajuda a manter o Squids Arduino funcionando

Comentários

×

Infomações do site / SEO








×

Adicionar Marcadores