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!