Lux Meter – Medidor de intensidade de luz com Arduino e sensor TSL2561
O ambiente onde estou está sendo iluminado adequadamente ? Tenho bastante luz para trabalhar ou estudar ? Essas e outras questões podem ser respondidas com a ajuda do Sensor de luz TSL2561 lux luminosidade, que vamos utilizar juntamente com o Arduino e display Oled para montar um medidor de luz.
O sensor de luminosidade TSL2561 (datasheet) é um sensor avançado que detecta não só a faixa de luz normal, captada pelo olho humano, como também a luz infravermelha, em uma faixa de 0.1 à 40.000 lux. É um módulo extremamente econômico em termos de energia, consumindo apenas 0,5mA quando está recebendo luz, e 15µA em modo de espera (standby).
O que o sensor TSL2561 faz ?
Já falamos aqui do LDR (no post Controle de Luz utilizando LDR), que é um componente cuja resistência varia de acordo com a incidência de luz. Apesar de conseguirmos realizar algum tipo de medição com ele, não temos precisão na leitura.
O módulo TSL2561, por sua vez, é muito mais preciso, podendo detectar luz desde a faixa do infravermelho até a faixa total de luz (espectro) percebida pelo olho humano. Com o TSL2561, é possível calcular a quantidade exata de luz que atinge um certo ponto (lux), já que ele é um conversor que transforma a intensidade de luz em um sinal digital que pode ser interpretado por um microcontrolador.
Saber a quantidade de luz em um ponto/ambiente é importante pois, segundo os especialistas, luz demais causa uma sensação de desconforto, e pouca luz pode prejudicar (e geralmente prejudica) não só a sua visão mas também atrapalhar o desempenho das suas tarefas diárias. Assim, temos a seguinte recomendação de iluminância nos ambiente mais comuns, segundo as normas da ABNT:
- Escritório e biblioteca – 300 lux
- Cozinha e banheiro – 200 lux
- Sala estar, jantar e dormitório – 150 lux
- Hall, escada, despensa e garagem – 100 lux
Utilizando o módulo TSL2561 ligado em um Arduino, você pode conferir se as especificações de luminosidade na sua casa ou escritório estão corretas.
Pinagem do módulo TSL2561
Abaixo podemos ver a disposição dos pinos do módulo, tanto de alimentação e sinal, como também da seleção de endereço I2C (Addr). Se você preferir, pode setar o endereço I2C de forma permanente, soldando os terminais na parte de trás da placa.
- Vcc – Alimentação 3.3 ou 5V
- GND – GND
- 3vo – Saída 3.3V do regulador de tensão do módulo. Suporta até 100mA
- Addr – Seleção do endereço I2C: 0x29 (pino em nível 0), 0x49 (nível 1) ou 0x39 (desligado / floating)
- Int – Interrupt Output – é um pino específico, acionado quando a luminosidade alcança um determinado nível (threshold)
- SDA – I2C – Data
- SCL – I2C – Clock
Conexão do sensor ao Arduino
Para ligar o TSL2561 ao Arduino Uno vamos utilizar somente os pinos de alimentação e interface I2C (portas analógicas A4 e A5), deixando o pino ADDR sem conexão (floating), utilizando assim o endereço 0x39.
O módulo pode ser ligado diretamente aos pinos SCL e SDA do Arduino, pois ele é compatível tanto com nível de sinal de 3.3V como de 5V.
O display que usamos é um display OLED 0.96″ com interface I2C, ligado em 3.3V assim como o módulo TSL2561. Esse display tem uma pequena faixa na parte superior com os pixels em amarelo, e o restante do display tem os pixels na cor azul.
Programa módulo sensor de luz TSL2561 com arduino
Para esse programa vamos precisar de 3 bibliotecas, sendo duas para o sensor de luz e uma para o display Oled:
Adafruit TSL2561 V2 (download)
Adafruit Sensor Library (download)
U8Glib (download)
Baixe as três bibliotecas, descompacte e coloque-as na pasta LIBRARIES da IDE do Arduino.
O programa utiliza como base o programa de exemplo sensorapi da biblioteca Adafruit TSL2561 para ler os dados do sensor e converter em lux. Essas informações são exibidas no display Oled utilizando as funções da biblioteca gráfica U8Glib.
Na linha 13 do programa você define qual endereço I2C usar, substituindo TSL2561_ADDR_FLOAT por TSL2561_ADDR_HIGH (para o endereço 0x49) ou TSL2561_ADDR_LOW (para o endereço 0x29). Não se esqueça, claro, de enviar o sinal adequado para o pino ADDR.
//Programa: Medidor de Luminosidade Lux com sensor TSL2561 //Autor: Arduino e Cia #include <Wire.h> #include <Adafruit_Sensor.h> #include <Adafruit_TSL2561_U.h> #include <U8glib.h> //Definicoes do display Oled U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NO_ACK); //Definicoes do sensor TSL2561 Adafruit_TSL2561_Unified tsl=Adafruit_TSL2561_Unified(TSL2561_ADDR_FLOAT,12345); int valor = 0; String str; int tamanho; void draw() { //Comandos graficos para o display devem ser colocados aqui u8g.drawRFrame(0, 16, 128, 48, 4); u8g.drawRFrame(0, 0, 128, 16, 4); u8g.setFont(u8g_font_8x13B); u8g.setColorIndex(0); u8g.setColorIndex(1); u8g.drawStr( 30, 13, "Lux Meter"); u8g.setFont(u8g_font_fur25); str = String(valor); tamanho = str.length(); u8g.setPrintPos(64-(tamanho*10), 53); u8g.print(valor); } void displaySensorDetails(void) { //Informacoes basicas do sensor TSL2561 sensor_t sensor; tsl.getSensor(&sensor); Serial.println("------------------------------------"); Serial.print ("Sensor: "); Serial.println(sensor.name); Serial.print ("Driver Ver: "); Serial.println(sensor.version); Serial.print ("Unique ID: "); Serial.println(sensor.sensor_id); Serial.print ("Max Value: "); Serial.print(sensor.max_value); Serial.println(" lux"); Serial.print ("Min Value: "); Serial.print(sensor.min_value); Serial.println(" lux"); Serial.print ("Resolution: "); Serial.print(sensor.resolution); Serial.println(" lux"); Serial.println("----------------------------------"); Serial.println(""); delay(500); } /**************************************************************************/ /* Configures the gain and integration time for the TSL2561 */ /**************************************************************************/ void configureSensor(void) { /* You can also manually set the gain or enable auto-gain support */ /* No gain. use in bright light to avoid sensor saturation */ // tsl.setGain(TSL2561_GAIN_1X); /* 16x gain. use in low light to boost sensitivity */ // tsl.setGain(TSL2561_GAIN_16X); /* Auto-gain. switches automatically between 1x and 16x */ tsl.enableAutoRange(true); /* Changing the integration time gives you better sensor resolution (402ms = 16-bit data) */ /* fast but low resolution */ tsl.setIntegrationTime(TSL2561_INTEGRATIONTIME_13MS); /* medium resolution and speed */ // tsl.setIntegrationTime(TSL2561_INTEGRATIONTIME_101MS); /* 16-bit data but slowest conversions */ // tsl.setIntegrationTime(TSL2561_INTEGRATIONTIME_402MS); /* Update these values depending on what you've set above! */ Serial.println("------------------------------------"); Serial.print ("Gain: "); Serial.println("Auto"); Serial.print ("Timing: "); Serial.println("13 ms"); Serial.println("------------------------------------"); } void setup(void) { Serial.begin(9600); Serial.println("Light Sensor Test"); Serial.println(""); //Inicializa o sensor TSL if (!tsl.begin()) { Serial.print("TSL2561 nao detectado,verifique a conexao e o endereco I2C"); while (1); } //Exibe as informacoes basicas do sensor TSL displaySensorDetails(); //Configura o sensor TSL configureSensor(); Serial.println(""); if ( u8g.getMode() == U8G_MODE_R3G3B2 ) { u8g.setColorIndex(255); // white } else if ( u8g.getMode() == U8G_MODE_GRAY2BIT ) { u8g.setColorIndex(3); // max intensity } else if ( u8g.getMode() == U8G_MODE_BW ) { u8g.setColorIndex(1); // pixel on } else if ( u8g.getMode() == U8G_MODE_HICOLOR ) { u8g.setHiColorByRGB(255, 255, 255); } } void loop(void) { Calcula_Lux(); //Chama a rotina de desenho na tela u8g.firstPage(); do { draw(); } while ( u8g.nextPage() ); delay(150); } void Calcula_Lux() { sensors_event_t event; tsl.getEvent(&event); //Mostra os resultados no serial monitor //Intensidade da Luz medida em Lux if (event.light) { valor = event.light; Serial.print(event.light); Serial.println(" lux"); } else { Serial.println("Sensor overload"); } delay(250); }
Caso você não possua ou não queira utilizar o display, pode conferir a medição da luminosidade e também outras informações do sensor, como ganho (gain) e nível de resolução, no Serial Monitor:
Abaixo você confere um vídeo do circuito em funcionamento:
Se você gostou deste post do sensor TSL2561 com Arduino, dê uma olhada nos outros posts utilizando módulos aqui mesmo no Arduino e Cia!
poderia ser montado 7 tsl2531 em um Arduíno mega com 1 lcd?
Oi Leonardo,
Infelizmente não, pq esse módulo só aceita 3 endereços I2C, logo esse é o número máximo de sensores em apenas um Arduino.
Abraço!
Este módulo só oferece três endereços por i2c. Então você deve usar outra i2c ou um multiplicador de i2c, como um pcf8574.
olá, poderia fazer uma experiencia com esses sensores para comparação de luminosidade? me ajudaria muito em um projeto que estou fazendo, mas não sei como fazer, se puder me ajudar, ficarei grato.
Bom dia,
Que tipo de projeto/programação vc precisa ? Se preferir, entre em contato utilizando o formulário de contato no lado direito da página. Combinamos por email.
Abraço!
olá, pode ser usado um sensor BH1750 no lugar do TSL2561? obg
Boa noite,
Eu já usei o BH1750, mas não com essa biblioteca. Tente essa:
https://github.com/claws/BH1750
Abraço!
qual é mais preciso, o sensor BH1750 ou o TSL2561?
Boa tarde !
Muda muito eu usando um display LCD 16×2 ?
Como ficaria o Sketch ?
Sou muito novo, nesse trabalho com Arduino, mas pelo menos o meu display já esta funcionando.
Agradeço a ajuda.
Abraço
Oi Ferraz,
Muda bastante, mas fica até mais fácil, porque no final basta você imprimir o valor da variável event.light.
Coloque no programa os parâmetros para utilização do display LCD que você já usou (include, lcd.begin, etc), depois, dentro do loop, coloque o comando abaixo:
lcd.print(valor);
É mais ou menos isso. veja se consegue adaptar.
Abraço!
Olá,
Estou querendo fazer este projeto sem o display,oq mudaria na programação?
Oi Nelson,
Mande os dados para o serial monitor usando o Serial.print(valor).
Abraço!
Adilson
Boa tarde. Como utiliza-lo (TSL 2561) para medição de IR? Qual o alcance?
Obrigado?
Boa tarde. Gostaria de saber se esse módulo (TSL2561) pode ser usado para medir IR. Onde eu consigo maiores informações sobre isso?
Oi Marcos,
Utilize este:
https://cdn-learn.adafruit.com/downloads/pdf/ir-sensor.pdf
Abraços,
WS
Boa noite! Estou tentando ligar um tsl2561 no arduino mega, apenas para testar o sensor… mas a única resposta é "65.536lux". Tentei no arduino uno também, mas sem sucesso. Alguém poderia me ajudar, por favor?
Olá, como calcular o lux manualmente com a fórmula? estou fazendo um experimento e não consigo
Oi Renato,
Não sei se é isso que vc precisa, mas dê uma olhada neste link, por favor: http://www.startecimport.com.br/blog/post/calculo-iluminancia-de-ambientes
Abraço!
Adilson
Como faria no caso de usar um valor padrão no qual abaixo dele a luz se acende, e acima desse valor, a luz se apaga?
Bom dia, como eu faria se em vez de eu usar o display oled eu usasse o display nokia 5110? você poderia me ajudar?
Boa noite,
Vamos lá. Você chegou a tentar montar com o display Nokia?
abraço!
Adilson
Bom dia.
somente encontrei o sensor TSL2561 sem as pinagens:
3vo
Addr
Ainda assim é possível utilizar a sketch?
Abraço!
Felippe.
Oi Felippe!
É possível sim. Ele é da Adafruit ou é um compatível?
Abraço!
Adilson
Boa Tarde; toda vez que tento copilar o programa aparece a mensagem
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NO_ACK);
o que pode ser?
Obrigado
Oi André,
Vc instalou a biblioteca dos links do post ou direto pela IDE do Arduino?
Adilson
Ola, eu consigo medir a intensidade de um laser com esse circuito? ou adicionar um modulo receptor laser?
Oi Leonardo,
Nunca testamos com laser, mas a principio não vejo problemas do TSL2561 funcionar com laser. Vamos testar. 🙂
Abraço!
Adilson