Início
/
Projetos Arduino
/
Projetos Squids
/
Básico
/
Projeto105 - Como usar dois sensores BH1750 em um único Arduino
Projeto105 - Como usar dois sensores BH1750 em um único Arduino
Angelo Luis Ferreira | 22/08/2022
Acessos: 1.720
Básico - Projeto 105
Medindo a iluminância em 2 pontos com sensores BH1750FVI e Arduino
Objetivo
O objetivo deste projeto é mostrar como utilizar dois sensores de luz BH1750FVI junto com um único Arduino para medir simultaneamente a quantidade de luz (iluminância) em 2 pontos distintos de um ambiente. Os resultados deverão ser apresentados em um display LCD. Para isso, vamos utilizar um módulo GY-302 e um módulo GY-30 dispostos em locais de leitura diferentes. Utilizaremos também a biblioteca BH1750 para facilitar a determinação dos valores resultantes para cada módulo.
Obs.: No projeto usamos 2 módulos diferentes, mas se desejar, poderá utilizar 2 módulos iguais GY-302 ou 2 módulos iguais GY-30, desde que se observe a disposição dos pinos de cada módulo durante a montagem do circuito.
Obs.: Geralmente os módulos GY-30 e GY-302 não são fornecidos com os pinos soldados.
Definições
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. Os módulos possuem interface I2C de comunicação, facilitando a montagem e a conexão com o Arduino.
4. 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) .
5. 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:
Referências
Projeto103 - Como usar o sensor BH1750 com Arduino sem auxílio de biblioteca específica
Projeto104 - Como medir a iluminação ambiente com o sensor BH1750 e Arduino
Projeto 48 - Como controlar um display LCD com o módulo I2C
Projeto 38 - Controlando um display LCD (instalação e comandos básicos) (Caso não possua um módulo I2C e queria adaptar o projeto para usar o display LCD)
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 |
|
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
|
2 |
|
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
|
Display LCD
|
Display LCD 16X2 (com pinos soldados) |
1 |
|
LCD que utilize o controlador HD44780 (veja na descrição ou datasheet do componente)
O display poderá ser de qualquer cor (fundo verde, azul ou vermelho)
|
Módulo I2C para display LCD
|
Módulo I2C com CI PCF8574 |
1 |
|
O módulo I2C poderá vir separado ou já soldado no display LCD
(datasheet)
Se você não possui um módulo I2C para display LCD, poderá adaptar o projeto para o display LCD sem o adaptador.
|
Arduino UNO R3 |
Arduino UNO |
1 |
|
Você poderá utilizar uma placa Arduino UNO original ou similar
|
Montagem do Circuito
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 força enquanto você monta o circuito.
Observação: O módulo BH1750 poderá ser conectado no Arduino nas fontes de energia 3.3V ou 5V (Vcc), pois de acordo com o seu datasheet, o módulo funciona perfeitamente em ambas tensões. É importante lembrar também que o display LCD opera somente na tensão de 5V.
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.
Arduino Uno |
A5 |
A4 |
Arduino Nano |
A5 |
A4 |
Arduino Mega |
21 |
20 |
Leonardo/Micro |
3 |
2 |
2.4. O pino ADDR deve ser usado para ligar dois sensores no mesmo microcontrolador, como em nosso projeto. Você poderá usá-lo também quando empregar o módulo sem uma biblioteca específica.
2.4.1. Quando o pino ADDR estiver conectado em nível baixo (GND), a conexão I2C opera no enderço 0x23 (no projeto conectamos o módulo à esquerda).
2.4.2. Quando o pino ADDR estiver conectado em nível alto (Vcc), a conexão I2C opera no endereço 0x5C (no projeto conectamos o módulo à direita)
3. No projeto, vamos utilizar também um display LCD 16x2 com controlador HD44780, que se adapta aos mais diversos projetos com vários modelos de placas e microcontroladores. Este display possui 16 colunas por 2 linhas com backlight (luz de fundo) verde, azul ou vermelha e tem 16 pinos para a conexão.
4. Para a montagem do display com adaptador, entenda a estrutura do módulo I2C para display LCD 16x2 / 20X4:
4.1. Na lateral do adaptador encontramos 4 pinos, sendo: 2 pinos para alimentação (Vcc e GND) e 2 pinos para conexão com a interface I2C (SDA e SCL) que deverão estar conectados nos pinos analógicos A4 (SDA) e A5 (SCL) do Arduino Uno ou nos pinos A20 (SDA) e A21 (SCL) do Arduino Mega 2560. Veja a tabela abaixo com onde temos as principais placas Arduino e suas conexões com o I2C.
4.2. Para controlar o contraste do display, utilize o potenciômetro de ajuste de contraste. O jumper lateral, quando utilizado, permite que a luz do fundo (backlight) seja controlada pelo programa ou permaneça apagada.
4.3. Para saber mais sobre a montagem e utilização de display LCD com módulo I2C leia: Projeto 48 - Como controlar um display LCD com o módulo I2C.
5. A montagem do nosso exemplo foi realizada em um protoboard com 400 pontos e com um display LCD com comunicação via protocolo I2C. Verifique sempre se o seu protoboard possui linhas de alimentação contínuas ou separadas.
Incluindo a biblioteca BH1750
Para utilizarmos o módulo BH1750 incluiremos a biblioteca BH1750, que obtém a leitura da intensidade luminosa do ambiente de forma facilitada, sem precisamos conhecer mais profundamente alguns detalhes do sensor.
Instalação da biblioteca
1. No IDE do Arduino, acesse a aba Sketch, selecione [Incluir Biblioteca] e depois [Gerenciar Bibliotecas...].
2. No campo de pesquisa digite BH1750. Localizada a biblioteca BH1750 (by Christopher Laws) clique no botão [Instalar].
Para saber detalhes desta biblioteca clique aqui.
3. Após a instalação, observe que aparecerá a informação que a biblioteca foi instalada.
Incluindo a biblioteca LiquidCrystal_I2C
Atenção: Caso você opte pela utilização do display de LCD sem o módulo I2C, siga os procedimentos do Projeto 38 - Controlando um display LCD (instalação e comandos básicos) e não instale a biblioteca abaixo.
1. Para que o módulo I2C funcione corretamente é necessário adicionarmos a biblioteca LiquidCrystal_I2C no IDE do Arduino. Uma das grandes vantagens das placas Arduino é a diversidade de bibliotecas disponíveis que podem ser utilizadas em seus programas. Estas bibliotecas podem ser criadas para a linguagem "C" ou especificamente para o Arduino, reduzindo drasticamente o tempo gasto com programação. Veja a tabela Coletânea de bibliotecas para módulos.
Download dos arquivos da biblioteca LiquidCrystal_I2C
DOWNLOAD - NewliquidCrystal_1.3.4.zip
Para saber detalhes desta biblioteca clique aqui.
2. Após fazer o download do arquivo NewliquidCrystal_1.3.4.zip com todos os arquivos da biblioteca compactados no formato zip, abra o IDE do Arduino e siga o tutorial: Como incluir uma biblioteca no IDE do Arduino..
Biblioteca Wire
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.
2. 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.
3. Muitas bibliotecas específicas para módulos e sensores com comunicação I2C já tem incluído a biblioteca Wire no seu escopo. Entretanto, é recomendável utilizar sempre essa biblioteca quando utilizarmos a comunicação via protocolo I2C, afim de evitarmos possíveis erros de comunicação.
Código do Projeto (Sketch)
1. Faça o download e abra o arquivo projeto105.ino no IDE do Arduino: DOWNLOAD - projeto105.ino
Obs. 1: Nos casos em que módulo I2C estiver configurado com um endereço diferente do endereço 0X27, altere a alinha de programação -> LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3, POSITIVE); com o endereço correto. - Veja o tutorial Projeto 48 - Como controlar um display LCD com o módulo I2C
Obs. 2: Se estiver utilizando um display de LCD 20 X 4, altere o comando de inicialização para lcd.begin (20,4);
Obs.3: Se não possuir o módulo I2C utilize apenas o display LCD conforme Projeto 38 - Controlando um display LCD (instalação e comandos básicos) .
2. Se preferir, copie e cole o código abaixo no IDE do Arduino:
/*******************************************************************************
*
* 105 - Usando dois módulos BH1750 para medir a iluminação ambiente em lux
* Autor: Angelo Luis Ferreira
* 22/08/2022
* http://squids.com.br/arduino
*
*******************************************************************************/
#include <Wire.h> // biblioteca para comunicação I2C
#include <BH1750.h> // biblioteca para sensor BH1750
#include <LiquidCrystal_I2C.h> // biblioteca para o display LCD I2C
// objetos (conforme bibliotecas)
BH1750 sensorLeft; // cria a instância sensorLeft
BH1750 sensorRight; // cria a instância sensorRight
LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3, POSITIVE); // cria a instância lcd
void setup() {
// inicializações
Wire.begin(); // inicializa a biblioteca Wire.h (a biblioteca BH1750 não faz isso automaticamente)
Serial.begin(9600); // inicializa a comunicação serial
sensorLeft.begin(BH1750::CONTINUOUS_HIGH_RES_MODE, 0x23, &Wire); // incializa o BH1750 (sensorLeft) / Pino ADDR em nível lógico 0
sensorRight.begin(BH1750::CONTINUOUS_HIGH_RES_MODE, 0x5c, &Wire); // incializa o BH1750 (sensorRight) / Pino ADDR em nível lógico 1
lcd.begin(16,2); // inicializa o lcd 16X2 com I2C
}
void loop() {
showLux();
delay(300);
}
void showLux() {
// le os valores do sensor de lux
uint16_t luxLeft = sensorLeft.readLightLevel(); // faz a leitura do sensorLeft
uint16_t luxRight = sensorRight.readLightLevel(); // faz a leitura do sensorRight
// mostra as informacoes no LCD
lcd.setCursor(0, 0);
lcd.print(" Left");
lcd.setCursor(10, 0);
lcd.print(" Right");
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.print(luxLeft);
lcd.print(" ");
lcd.setCursor(10, 1);
lcd.print(" ");
lcd.print(luxRight);
lcd.print(" ");
}
Vídeo
Como o projeto deve funcionar
1. Ao rodar o programa, será exibido no display LCD a quantidade de luz (iluminância) medida em LUX nos pontos onde se encontram os módulos BH750 posicionados à esquerda (GY-302) e a direita (Gy-30) em relação ao protoboard. A exibição apresentará os dois valores de iluminância, em lux, simultaneamente.
2. Com esse projeto você poderá conferir se as especificações de luminosidade nos ambientes da sua casa estão corretos.
3. Para melhorar a estabilidade nas leituras, aumente o tempo de delay para que a leitura seja realizada a cada 1.000ms (1seg) ou a cada 2.000ms (2seg). Para isso, altere a linha 29 do sketch.
O anúncio abaixo ajuda a manter o Squids Arduino funcionando
Comentários