Sensor de Luminosidade ☀️
Leia a intensidade da luz ambiente com o sensor LDR e aprenda leitura analógica
🎯 O que você vai aprender
Esta atividade possui 3 versões progressivas:
1️⃣ Leitura básica (valor bruto)
2️⃣ Leitura em porcentagem (%)
3️⃣ Detector de lanterna/flash
📚 O que é um LDR?
LDR significa Light Dependent Resistor (Resistor Dependente de Luz). É um componente cuja resistência elétrica muda conforme a luz que incide sobre ele.
☀️ Muita luz
Resistência BAIXA → Mais corrente passa → Valor MENOR lido
🌑 Pouca luz
Resistência ALTA → Menos corrente passa → Valor MAIOR lido
⚠️ Atenção: No kit RoboCore, a lógica é invertida! Valor alto (4095) = escuro, valor baixo (~1500) = muita luz. Vamos corrigir isso com código!
🧮 Novos Conceitos
analogRead(pino)
Diferente do digitalRead que só lê 0 ou 1,
o analogRead lê valores contínuos de 0 a 4095
(12 bits de resolução no ESP32).
map(valor, deMin, deMax, paraMin, paraMax)
Converte um valor de uma escala para outra. Muito útil para transformar 0-4095 em 0-100%!
int porcentagem = map(valor, 0, 4095, 0, 100);
constrain(valor, min, max)
"Trava" o valor entre um mínimo e máximo. Se o valor passar, ele é cortado.
porcentagem = constrain(porcentagem, 0, 100);
🔧 Hardware
Sensor LDR
Conectado ao GPIO 15
Leitura Básica (Valor Bruto)
/*
* TESTE DO SENSOR DE LUMINOSIDADE (LDR)
* Placa: RoboCore IoT DevKit
* Pino do Sensor: GPIO 15
*/
const int PINO_LDR = 15;
void setup() {
Serial.begin(115200);
Serial.println("Iniciando leitura do LDR...");
}
void loop() {
// Lemos o valor do sensor (varia de 0 a 4095)
int valorLuz = analogRead(PINO_LDR);
Serial.print("Nível de Luz: ");
Serial.println(valorLuz);
delay(500);
}
💡 Teste: Abra o Monitor Serial e cubra o sensor com a mão. O valor deve subir! Aponte uma lanterna e o valor desce.
Leitura em Porcentagem (%)
Agora vamos converter o valor bruto para porcentagem, corrigindo a lógica invertida!
/*
* SENSOR LDR - CALIBRADO EM %
* Lógica: 4095 = Escuro (0%), ~1500 = Luz forte (100%)
*/
const int PINO_LDR = 15;
// Calibração baseada em testes práticos
const int VALOR_MAX_ESCURO = 4095; // Escuro
const int VALOR_MIN_CLARO = 1500; // Luz forte
void setup() {
Serial.begin(115200);
Serial.println("Iniciando leitura Calibrada...");
}
void loop() {
// 1. Leitura Bruta
int leituraBruta = analogRead(PINO_LDR);
// 2. Mapeamento (invertido para corrigir a lógica)
int porcentagem = map(leituraBruta, VALOR_MAX_ESCURO, VALOR_MIN_CLARO, 0, 100);
// 3. Trava de Segurança
porcentagem = constrain(porcentagem, 0, 100);
Serial.print("Bruto: ");
Serial.print(leituraBruta);
Serial.print(" | Luz: ");
Serial.print(porcentagem);
Serial.println("%");
delay(500);
}
Detector de Flash/Lanterna 📸
Versão divertida: detecta quando você aponta uma lanterna diretamente para o sensor! Inclui uma barra de progresso visual no terminal.
/*
* DETECTOR DE LANTERNA / FLASH
* Mede a intensidade de luz DIRECIONADA ao sensor
*/
const int PINO_LDR = 15;
const int BASE_AMBIENTE = 4095;
const int ALVO_FLASH = 1700;
void setup() {
Serial.begin(115200);
Serial.println("Iniciando Detector de Lanterna...");
}
void loop() {
int leitura = analogRead(PINO_LDR);
int potencia = map(leitura, BASE_AMBIENTE, ALVO_FLASH, 0, 100);
potencia = constrain(potencia, 0, 100);
Serial.print("Leitura: ");
Serial.print(leitura);
Serial.print(" | Intensidade: ");
Serial.print(potencia);
Serial.println("%");
// Barra de progresso visual!
Serial.print("[");
for(int i=0; i<potencia; i+=5) {
Serial.print("#");
}
Serial.println("]");
delay(200);
}
📱 Experimente: Use o flash do celular e aproxime do sensor! A barra deve encher de # conforme você aproxima.
📝 Teste seus Conhecimentos
Quiz Gamificado
Responda às perguntas para ganhar XP e desbloquear a próxima atividade!
Carregando quiz...