Neste tutorial, vamos explorar como detectar luz usando um Arduino. A deteção de luz é um aspeto fundamental de muitos projetos, desde interruptores automáticos de luz a sistemas de iluminação regulada. Ao compreender os princípios por trás da deteção de luz, pode criar aplicações inovadoras que respondem a mudanças nos níveis de luz.
Usando uma placa Arduino, podemos facilmente interligar vários sensores e componentes para detectar luz. Um dos sensores mais usados para deteção de luz é o fotoresistor, também conhecido como resistor dependente de luz (LDR). Ao medir a resistência do fotoresistor, podemos determinar a intensidade da luz que incide sobre ele.
Neste artigo, vamos guiá-lo no processo de construção de um detector de luz usando um Arduino e um fotoresistor. Também exploraremos como expandir esta configuração básica para criar projetos mais avançados, como um interruptor automático de luz, iluminação regulada e até um servo controlado por luz.
Quer seja um principiante ou um entusiasta experiente de Arduino, este tutorial fornecerá o conhecimento necessário para começar a trabalhar com deteção de luz. Então, vamos começar!
Peças Necessárias
Abaixo encontrará os componentes necessários para construir este projeto. Se já tiver resistores, LEDs e trimmers, obviamente não precisará dos kits listados. Caso contrário, vale a pena comprá-los, pois será mais barato do que comprar peças individuais.

Arduino Uno

Conjunto de Fios Dupont

Breadboard

Cabo USB para Arduino UNO

Kit de Resistores & LED

Conjunto de Resistores Variáveis

Conjunto de Fotoresistores

Servo Posicional

Arduino IDE
Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.
O que é um Fotoresistor ou LDR
Um fotoresistor, também conhecido como resistor dependente de luz (LDR), é um tipo de resistor cuja resistência varia consoante a quantidade de luz a que está exposto. É um componente passivo amplamente usado em várias aplicações de deteção e controlo de luz. A imagem abaixo mostra um fotoresistor típico.

Note que não há polaridade para os dois fios. Como é apenas um resistor, pode usá-lo em qualquer orientação. Para o Arduino, também pode encontrar módulos com circuitos integrados adicionais. Estes permitem ajustar a sensibilidade do sensor, mas vamos construir isso nós próprios.
Como funciona um Fotoresistor?
Um fotoresistor é feito de um material semicondutor fotocondutor. Quando a luz incide na superfície do fotoresistor, os fotões da energia luminosa excitam os eletrões no material semicondutor, fazendo com que se movam mais livremente. Este movimento de eletrões reduz a resistência do fotoresistor.
Por outro lado, quando não há luz ou a intensidade da luz é baixa, o material semicondutor apresenta uma resistência mais alta. Esta característica torna os fotoresistores ideais para detectar níveis de luz.
Divisor de Tensão
Para medir a resistência de um fotoresistor e convertê-la numa tensão mensurável, um voltage divider circuito é comumente usado. Consiste em dois resistores ligados em série, sendo um deles o fotoresistor. O outro é frequentemente um potenciômetro ou trimmer para ajustar a sensibilidade ou o limiar do circuito. No entanto, também encontrará circuitos mais simples que usam um resistor de valor fixo em vez de um trimmer.
A imagem abaixo mostra o esquema do divisor de tensão que usaremos nas secções seguintes.

Pode ver que o fotoresistor (R1) e o trimmer (R2) estão ligados em série entre a fonte de alimentação (5V) e o terra (GND). O ponto de junção entre o fotoresistor (R1) e o trimmer está ligado a um pino de entrada analógica (A0) do Arduino. À medida que a resistência do fotoresistor varia com a intensidade da luz, afeta a tensão no ponto de junção.
A fórmula para calcular a tensão de saída de um circuito divisor de tensão é:
V_A0 = Vin * (R1 / (R1 + R2))
Onde:
- V_A0 é a tensão de saída
- Vin (+5V) é a tensão de entrada
- R1 é a resistência do fotoresistor
- R2 é a resistência do trimmer
Na próxima secção, aprenderá como construir um detector de luz usando este circuito e um Arduino
Construindo um Detector de Luz
Nesta secção mostro como ligar um LDR a um Arduino e apresentar as intensidades de luz medidas no Monitor Serial.
Construindo o Divisor de Tensão
O diagrama seguinte mostra como ligar as peças para construir o divisor de tensão que discutimos acima. Primeiro ligamos 5V ao trilho positivo de alimentação da breadboard com um fio vermelho. Depois ligamos o terra (GND) ao trilho negativo de alimentação usando um fio azul.

Agora o divisor de tensão. Ligue um pino do fotoresistor (LDR) ao trilho positivo de alimentação (fio vermelho). O outro pino deve ser ligado ao pino central do trimmer. Certifique-se de ligar corretamente, caso contrário o ajuste não funcionará.
Para o trimmer escolhemos um valor de resistência aproximadamente igual à resistência do LDR em condições normais de luz. No meu caso, cerca de 20K Ohms. O valor exato não é muito crítico.
Depois ligamos o ponto de junção entre o trimmer e o fotoresistor com um fio amarelo à entrada analógica A0 do Arduino.
A última ligação é entre um dos outros pinos do trimmer e o trilho negativo de alimentação (fio azul). Qualquer pino serve para isso. Finalmente, rode o trimmer para a posição intermédia e depois começamos a escrever o software.
Código para o Detector de Luz
O software para o detector de luz é muito simples. Definimos uma constante ldrPin para o pino ao qual o LDR está ligado e uma variável ldrValue para armazenar o brilho detetado.
const int ldrPin = A0;
int ldrValue = 0;
void setup() {
Serial.begin(9600);
pinMode(ldrPin, INPUT);
}
void loop() {
ldrValue = analogRead(ldrPin);
Serial.print("LDR:");
Serial.println(ldrValue);
delay(100);
}
Na setup() função, iniciamos a Serial comunicação e depois definimos o modo do ldrPin para INPUT, pois vamos ler dele.
Na função l oop(), lemos o valor do LDR via analogRead() e depois imprimimo-lo no Monitor Serial. Agora abra o Serial Plotter e mova a mão sobre o LDR para alterar a quantidade de luz que recebe. Deve ver uma curva oscilante semelhante à da imagem abaixo.

Se não obtiver sinal (linha plana), verifique o circuito e certifique-se de que o trimmer está na posição intermédia.
A entrada analógica retorna valores na faixa entre 0 e 1023 num Arduino UNO. No entanto, normalmente não veremos toda a gama, desde que o sensor não esteja exposto a escuridão total ou brilho extremo.
Para obter boa sensibilidade do sensor, experimente diferentes níveis de brilho/escuridão e ajuste o trimmer para não atingir o valor mínimo (0) ou máximo (1023). Note que estes valores não são calibrados de forma alguma. Por exemplo, se quiser medir a intensidade luminosa em Lux, precisaria de uma fonte de luz com intensidade conhecida para calibrar as leituras.
Construindo um Interruptor Automático de Luz
Agora que podemos detetar luz, podemos construir um interruptor automático de luz. Sempre que escurecer, ligamos a luz. Para este exemplo, adicionamos um LED com um resistor ao circuito.

Mantemos o divisor de tensão como está. Apenas adicionamos o LED e um resistor de 220 Ohm à breadboard como mostrado acima. Depois ligamos o pino longo do LED com um fio laranja ao Pino 9 do Arduino. Finalmente, ligamos o pino do resistor com um fio azul ao trilho negativo de alimentação da breadboard. Pronto!
Estender o código também é muito fácil. Basta adicionar uma constante adicional ledPin para o pino de saída ao qual o LED está ligado e definir o pinMode para OUTPUT na função setup().
const int ldrPin = A0;
const int ledPin = 9;
int ldrValue = 0;
void setup() {
Serial.begin(9600);
pinMode(ldrPin, INPUT);
pinMode(ledPin, OUTPUT);
}
void loop() {
ldrValue = analogRead(ldrPin);
digitalWrite(ledPin, ldrValue > 500 ? HIGH: LOW);
delay(1000);
}
Na função loop() lemos o ldrValue como antes. Mas depois, dependendo do valor, ligamos ou desligamos o LED usando digitalWrite. Se o ldrValue for maior que 500, está bastante claro, e desligamos o LED (LOW). Se o valor for menor, está escuro, e ligamos o LED (HIGH).
E está feito! Agora tem uma luz automática que liga quando escurece. Pode ajustar o limiar para ligar alterando o valor 500 para um valor mais alto ou mais baixo (na faixa de 0 a 1023). Se quiser ligar luzes mais potentes, pode substituir o LED por um relé e controlar as luzes da sua divisão, por exemplo.
Construindo uma Luz Regulada ou Dimmer
Na secção anterior, construímos um interruptor automático de luz que liga ou desliga completamente o LED. Nesta secção, mostro como pode regular suavemente o brilho do LED, dependendo da luminosidade. Em vez de ligar/desligar o LED, vamos atenuá-lo.
Aqui está o código para isso. Começamos por adicionar uma variável brightness mas deixamos a função setup() inalterada.
const int ldrPin = A0;
const int ledPin = 9;
int ldrValue = 0;
int brightness = 0;
void setup() {
Serial.begin(9600);
pinMode(ldrPin, INPUT);
pinMode(ledPin, OUTPUT);
}
void loop() {
ldrValue = analogRead(ldrPin);
brightness = map(ldrValue, 50, 300, 255, 0);
brightness = constrain(brightness, 0, 255);
analogWrite(ledPin, brightness);
delay(10);
}
Na função loop() lemos o ldrValue como antes, mas depois map o seu valor para o intervalo de 255 a 0. Note que o intervalo está invertido (255 a 0, em vez de 0 a 255). Isto porque queremos que o LED fique mais brilhante quanto mais escuro estiver o ambiente.
O ldrValue tem um intervalo possível de 0 a 1023. Mas usamos apenas o intervalo de 50 a 300 no código acima. Assim, o LED reage a mudanças relativamente pequenas nas condições de iluminação. Caso contrário, teria de estar muito claro ou escuro para ver alguma alteração no brilho do LED.
No entanto, isto causa um pequeno problema. A função map não garante que o valor de saída esteja realmente no intervalo de 255 a 0. Se ficar mais claro ou mais escuro do que 50 ou 300 no intervalo de entrada, o valor de saída será menor ou maior que 0 ou 255. Mas a função analogWrite() suporta apenas o intervalo de 0 a 255. Por isso usamos constrain() para garantir este intervalo.
A função analogWrite() usa PWM (Modulação por Largura de Pulso) para controlar o brilho do LED. Se quiser saber mais, veja o nosso tutorial sobre How use Arduino to control an LED with a Potentiometer.
E está feito! Agora tem uma luz regulada que fica mais brilhante quanto mais escuro estiver o ambiente. Se quiser menos ou mais sensibilidade, experimente os valores do intervalo de entrada (50, 300).
Construindo um Detector de Direção da Luz
Podemos facilmente modificar o nosso circuito de deteção de luz para fazer um Detector de Direção da Luz. Para isso, substituímos o trimmer por um segundo LDR. Como pode ver abaixo, o novo circuito continua a ser um Divisor de Tensão, mas com dois LDRs.

Dependendo de qual dos LDRs recebe mais luz, a tensão em A0 aumentará ou diminuirá. Note que não importa quanta luz os LDRs recebem. Claro ou escuro, a tensão em A0 será aproximadamente a mesma. O que importa é a proporção. Quanto maior a diferença de luz recebida pelos LDRs, mais A0 se afastará do valor médio de cerca de 2,5 V.
Vamos construir este circuito na breadboard. Como é essencialmente o mesmo circuito de antes, apenas removemos o trimmer e substituímo-lo por um LDR.

A corrente flui do trilho positivo de alimentação através da disposição em série dos dois LDRs até ao trilho negativo de alimentação. Como antes, retiramos o sinal (fio amarelo) do ponto de junção e ligamo-lo ao Pino A0 do Arduino.
Abaixo pode ver o código que vamos usar.
const int ldrPin = A0;
const int midValue = 500;
const int midRange = 10;
int ldrValue = 0;
void setup() {
Serial.begin(9600);
pinMode(ldrPin, INPUT);
}
void loop() {
ldrValue = analogRead(ldrPin);
Serial.print("LDR:");
Serial.println(ldrValue);
if (ldrValue > midValue + midRange) {
Serial.println("Left");
} else if (ldrValue < midValue - midRange) {
Serial.println("Right");
} else {
Serial.println("Middle");
}
delay(100);
}
Estendemos o código simples do detector de luz anterior adicionando duas variáveis. midValue é o valor que esperamos ler de A0 quando ambos os LDRs estão expostos à mesma quantidade de luz. Em teoria, esse valor deveria ser 1023/2 = 512 (metade do intervalo de entrada). Na prática, a resistência dos dois LDRs nunca é perfeitamente idêntica e o valor real será ligeiramente diferente.
const int midValue = 500; const int midRange = 10;
Para encontrar esse ponto médio, aproxime ambos os LDRs de uma luz com o mesmo ângulo e distância e leia o ldrValue no Monitor Serial. Este será o seu valor para midValue. No meu caso, li cerca de 500, que é bastante próximo do valor teórico.
A constante midRange define a quantidade de desvio que esperamos de midValue até considerarmos uma direção. Define uma margem ou tolerância. Para qualquer valor dentro desse intervalo, imprimiremos que a luz está na posição central – nem à esquerda nem à direita.
A função setup() permanece inalterada. Apenas iniciamos o Monitor Serial e definimos o modo do pino.
Na função loop() lemos ldrValue como antes e depois comparamos com o midValue.
if (ldrValue > midValue + midRange) {
Serial.println("Left");
} else if (ldrValue < midValue - midRange) {
Serial.println("Right");
} else {
Serial.println("Middle");
}
Se o valor do sensor for maior que o valor médio mais a tolerância, sabemos que o LDR esquerdo recebeu mais luz e imprimimos “Esquerda”. Se o valor for menor que o valor médio menos a tolerância, imprimimos “Direita”. No caso restante, ambos os LDRs recebem aproximadamente a mesma luz e imprimimos “Centro”. Note que “esquerda” e “direita” dependem da orientação do seu circuito.
Uma nota final: pode melhorar dramaticamente a sensibilidade direcional colocando os LDRs em tubos para que recebam apenas luz direcional. Abaixo está uma foto do meu truque barato para testar isso:

Ao adicionar os tubos, consigo detetar com precisão a direção de onde vem a luz e na próxima secção mostrarei como controlar um servo com isso.
Construindo um Servo Controlado por Luz
Servos posicionais são projetados para rodar até um ângulo específico dado. Isso faz deles uma escolha natural para experimentar o nosso detector de direção da luz. Poderemos controlar o ângulo do servo e fazê-lo apontar para a direção de onde vem a luz.
Primeiro, adicione o servo ligando a sua alimentação aos trilhos de energia (castanho é negativo e vermelho é positivo). Depois ligue a entrada de sinal do servo (amarelo) com um fio laranja ao Pino 9 do Arduino. Pronto!

Abaixo encontrará o código para controlar o servo. É uma pequena extensão do código acima. Se tiver dificuldades em entender o código e a sua explicação, veja o nosso tutorial sobre How to Control Servo Motors with Arduino, que fornece mais detalhes sobre servos.
#include "Servo.h"
#define IR_RECEIVE_PIN 8
const int ldrPin = A0;
const int servoPin = 9;
const int range = 780;
const int mid = 1600;
const int midValue = 500;
const int midRange = 10;
int ldrValue = 0;
int angle = 0;
Servo servo;
void rotate(int angle) {
angle = map(angle, 0, 180, mid - range, mid + range);
servo.writeMicroseconds(angle);
}
void setup() {
Serial.begin(9600);
pinMode(ldrPin, INPUT);
servo.attach(servoPin);
}
void loop() {
ldrValue = analogRead(ldrPin);
int angle = (ldrValue - midValue) * 0.8;
angle = constrain(angle, -90, +90);
if (angle > midRange) {
rotate(90 + angle);
} else if (angle < -midRange) {
rotate(90 + angle);
} else {
rotate(90);
}
delay(100);
}
O código tem algumas constantes adicionais como range e mid que são usadas na função rotate(), que roda o servo para um ângulo dado. Além das constantes e funções relacionadas com o servo, o restante do código é muito semelhante ao que viu acima.
O interessante acontece todo na função loop(). Lá convertemos o ldrValue num ângulo subtraindo o midValue de ldrValue e multiplicando por um fator de 0,8.
int angle = (ldrValue - midValue) * 0.8;
O fator 0,8 é algo que precisa ajustar com base nas dimensões/física do seu sistema; especificamente na distância entre os LDRs. Como antes, não há garantia de que o valor do ângulo esteja no intervalo de -90 a +90 graus. Por isso, restringimo-lo:
angle = constrain(angle, -90, +90);
Finalmente, decidimos se giramos o servo para a esquerda ou direita dependendo do ângulo detetado. Se a mudança de ângulo for pequena (-midRange… +midRange), mantemos o servo a 90 graus.
if (angle > midRange) {
rotate(90 + angle);
} else if (angle < -midRange) {
rotate(90 + angle);
} else {
rotate(90);
}
Com este circuito e código, pode agora controlar o ângulo do servo dependendo da direção da luz. Poderia usar isto para construir um carro que se dirige para a luz. Com dois destes detectores de direção da luz em orientação perpendicular, poderia construir um painel solar que segue os movimentos do sol para desempenho ótimo.
No entanto, para aplicações de seguimento de luz, deve preferir um servo contínuo em vez do servo posicional usado aqui. Isso permitiria rodar o servo em direção negativa ou positiva até atingir o ponto médio. Para mais detalhes, leia o nosso tutorial sobre as diferenças dos Positional versus Continuous Servos.
Algumas outras aplicações de detectores de luz são descritas abaixo.
Aplicações
Automação Doméstica
Usando um detector de luz, pode automatizar várias tarefas em sua casa. Por exemplo, pode programar o Arduino para ligar as luzes quando detetar escuridão e desligá-las quando detetar luz. Isto pode ajudar a poupar energia e proporcionar conveniência.
Sistemas de Segurança
Detectores de luz podem ser usados em sistemas de segurança para ativar alarmes ou câmaras quando há uma mudança súbita na intensidade da luz. Isto pode ajudar a detetar intrusos ou atividades incomuns numa área específica.
Monitorização de Plantas
A luz é crucial para o crescimento das plantas. Usando um detector de luz, pode monitorizar a quantidade de luz recebida pelas suas plantas e garantir que têm as condições ótimas para crescer. Isto é particularmente útil para jardinagem interior ou estufas.
Estações Meteorológicas
Detectores de luz também podem ser usados em estações meteorológicas para medir a intensidade da luz solar. Esta informação pode ser usada para analisar padrões meteorológicos, calcular radiação solar ou até prever condições climáticas.
Instalações Artísticas
Detectores de luz podem ser incorporados em instalações artísticas interativas para criar efeitos de iluminação dinâmicos e responsivos. Ao detetar mudanças na luz ambiente, o Arduino pode controlar o brilho, cor ou padrão das luzes, criando uma experiência imersiva para os espectadores.
Estes são apenas alguns exemplos das muitas aplicações da deteção de luz usando um Arduino. A versatilidade do Arduino e a sua compatibilidade com vários sensores fazem dele uma excelente escolha para implementar projetos baseados em luz.
Resumo
Neste tutorial, aprendemos como detetar luz usando um Arduino e explorámos várias aplicações de sensores de luz em projetos maker. Usando um fotoresistor, podemos facilmente medir a intensidade da luz no nosso ambiente.
Começámos por entender o conceito básico de um fotoresistor e como ele funciona. Um fotoresistor é um tipo de resistor que altera a sua resistência consoante a quantidade de luz que incide sobre ele. Esta propriedade torna-o um componente ideal para deteção de luz.
Depois construímos um detector de luz simples usando um Arduino e um fotoresistor. Ligando o fotoresistor a um pino analógico do Arduino, conseguimos ler o valor da resistência e convertê-lo num valor correspondente de intensidade luminosa. Isto permitiu criar um sistema básico de deteção de luz.
De seguida, explorámos aplicações mais avançadas de sensores de luz. Construímos um interruptor automático de luz que liga ou desliga uma fonte luminosa com base nas condições de luz ambiente. Isto pode ser útil para poupar energia controlando automaticamente a iluminação de uma divisão.
Também construímos um sistema de luz regulada, onde a intensidade de uma fonte luminosa é ajustada com base nas condições de luz envolventes. Isto pode ajudar a manter um nível consistente de iluminação numa área específica.
Por fim, construímos um sistema de servo controlado por luz. Usando os valores de intensidade luminosa do fotoresistor, conseguimos controlar o movimento de um motor servo. Isto abre possibilidades para criar projetos interativos que respondem a mudanças na luz.
Esperamos que este tutorial lhe tenha dado uma base sólida para trabalhar com sensores de luz e Arduino. Sinta-se à vontade para explorar as várias aplicações aqui mencionadas e deixe a sua criatividade brilhar!
Perguntas Frequentes
Aqui estão algumas perguntas frequentes sobre deteção de luz usando um Arduino:
Posso usar uma placa microcontroladora diferente em vez de um Arduino?
Sim, pode usar outras placas microcontroladoras como ESP32, Raspberry Pi ou STM32 para deteção de luz. Os princípios e técnicas discutidos neste artigo podem ser aplicados a qualquer placa microcontroladora que suporte entrada analógica.
Como determino a polaridade de um fotoresistor?
Fotoresistores, também conhecidos como resistores dependentes de luz (LDRs), são componentes não polarizados. Isto significa que não têm um terminal positivo ou negativo específico. Pode ligá-los em qualquer orientação sem se preocupar com a polaridade.
Qual é a faixa de resistência de um fotoresistor?
A resistência de um fotoresistor varia com a intensidade da luz que incide sobre ele. Em luz forte, a resistência diminui, e na escuridão, a resistência aumenta. A faixa de resistência varia tipicamente de algumas centenas de ohms em luz forte a vários megaohms na escuridão. É importante escolher os valores adequados de resistores no seu circuito para garantir uma deteção de luz precisa.
Como posso calibrar o circuito de deteção de luz?
Para calibrar o circuito de deteção de luz, pode ajustar os valores dos resistores no circuito divisor de tensão ligado ao fotoresistor. Medindo a tensão de saída do divisor de tensão em diferentes níveis de luz, pode determinar os valores de limiar para a deteção de luz. Este processo de calibração garante que o circuito responde com precisão aos níveis de luz desejados.
Posso usar vários fotoresistores num único projeto?
Sim, pode usar vários fotoresistores num único projeto. Ligando múltiplos fotoresistores a diferentes pinos de entrada analógica do Arduino ou outros microcontroladores, pode monitorizar níveis de luz de várias localizações ou direções. Isto pode ser útil em aplicações como sistemas de segurança, iluminação automatizada ou monitorização ambiental.
Posso usar um módulo sensor de luz em vez de um fotoresistor?
Sim, pode usar módulos sensores de luz que vêm com fotoresistores integrados ou outros sensores de luz. Estes módulos frequentemente oferecem funcionalidades adicionais como sensibilidade ajustável ou sinais de saída digitais. Ao usar um módulo sensor de luz, consulte a sua folha de dados ou documentação para entender o seu pinout e características de funcionamento.
Como diferem os fotoresistores dos sensores de movimento PIR?
Fotoresistores e sensores de movimento infravermelhos passivos (PIR) são ambos usados para detetar mudanças ambientais, mas funcionam com princípios diferentes. Os primeiros detetam mudanças na intensidade da luz, enquanto os segundos detetam mudanças na radiação infravermelha causadas por objetos em movimento. Fotoresistores são adequados para aplicações onde os níveis de luz precisam ser monitorizados, enquanto sensores PIR são ideais para detetar movimento humano ou animal.
Se tiver mais perguntas ou precisar de ajuda adicional, sinta-se à vontade para perguntar na secção de comentários abaixo.
Links
Abaixo alguns links úteis para leitura adicional
- Light Sensor (Photoresistor) With Arduino in Tinkercad
- How to Use Photoresistors to Detect Light on an Arduino
- Arduino Photo Resistor Tutorial (Step by Step) – YouTube
- Understanding this photoresistor circuit – General Electronics
- How to Use a Photoresistor (or Photocell) – Arduino Tutorial
- photoresistor how to use it – General Electronics
- Photoresistor: Basics and Arduino Tutorial


