Led´s são bacanas, mas apenas fazê-los piscar é chato!
Então, vamos utilizar um sensor para ler dados do ambiente, nesse caso um Light Dependent Resistor (LDR), ou resistor dependente de luz.
Um LDR é um sensor que aumenta ou diminui a resistência da corrente, de acordo com a luminosidade que inside sobre a superfície do compomente.
A idéia é que possamos controlar a intensidade de um LED de acordo com a leitura de luz que inside dobre o LDR, a exemplo do sensor de luminosidade dos teclados retroiluminados dos Mac´s ou de algumas telas de smartphones que vemos por aí.
Não se deixe enganar pela minha bagunça de fios nas imagens, pois a montagem é mais simples do que parece. Eu não tinha os fios adequados e fiz alguns jumpers (fios de ligação) com restos dos pares de fios de um cabo de rede e as experiências foram se sucedendo sem muito controle!
Você pode reproduzir esse experimento utilizando os seguintes componentes:
- LED – 5mm
- resistor 330Ω x 1/4 watt
- resistor 10kΩx 1/4 watt
- LDR 5mm
Monte o experimento de acordo com o seguinte esquema:

E utilize o código a seguir para controlar o LED de acordo com a intensidade de luz que inside sobre o LDR:
int lightSensor = 0; // sensor de luz LDR
int luz = 11; // saída digital
int rate = 0; // taxa de leitura analógica
void setup(){
pinMode(luz, OUTPUT);
// Serial.begin(9600);
}
void loop(){
rate = analogRead(lightSensor);
analogWrite(luz, map(rate,25,400,255,0));
// Serial.println(rate);
}
O exemplo pode ser visto abaixo:
Arduino LDR Fade from Rafael Donelli on Vimeo.
Você deverá fazer alguns ajustes no seu programa dependendo da intensidade de luz existente no ambiente. Para isso explore a função map, realizando os ajustes necessários, ou substitua o valor do resistor ligado ao LDR.
Nesse exemplo há duas linhas comentadas que você pode descomentar e utilizar juntamente com o monitoramento serial. A linha Serial.begin(9600); dentro da função setup() é responsável por estabelecer a comuniação serial do Arduino e a função Serial.println(rate); da função loop() envia o valor da variável “rate” para a saída serial. Faça o upload do programa com as linhas descomentadas e habilite na IDE de programação o monitor serial utilizando CTRL+SHIFT+M ou através do menu Tools -> Serial monitor.
Assim você pode verificar a faixa de valores lida pelo LDR a fim de calibrar a função “map”.
Comentários das linhas de código:
1. “rate = analogRead(lightSensor);”
Essa linha é responsável por ler o valor do LDR, definido aqui pela variável “lightSensor”, que aponta a porta utilizada. A leitura analógica acontece em incrementos discretos, de 0 (0 volts) a 1023 (5 volts), ou seja, quando o valor retornado for 511 teremos aproximadamente 2,5 volts.
Mais sobre analogRead.
2. “analogWrite(luz, map(rate,25,400,255,0));”
Aqui temos um par de funções. A primeira é “analogWrite”, responsável por escrever um valor “analógico”, utilizando PWM em uma saída digital específica e a função “map”, responsável por remapear um valor de entrada para uma nova classe de valores.
Assim, o que a função map faz é pegar o valor de leitura do LDR, registrado na variável “rate”, que pode ser entre 0 e 1023 e remapear essa classe de valores para um valor adequado para ser utilizado na função analogWrite, cuja classe de valores deve ser entre 0 e 255, sendo 0 (0 volt) e 255 (5 volts).
Mais sobre analogWrite e map
Um abraço!