Início Atividade 3
3
INTERMEDIÁRIO

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).

🌡️ Analogia: É como um termômetro: ao invés de só dizer "quente" ou "frio", ele diz exatamente quantos graus!

map(valor, deMin, deMax, paraMin, paraMax)

Converte um valor de uma escala para outra. Muito útil para transformar 0-4095 em 0-100%!

// Transforma 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.

// Garante que nunca seja menor que 0 ou maior que 100
porcentagem = constrain(porcentagem, 0, 100);

🔧 Hardware

☀️

Sensor LDR

Conectado ao GPIO 15

V1

Leitura Básica (Valor Bruto)

ldr_basico.ino
/*
 * 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.

V2

Leitura em Porcentagem (%)

Agora vamos converter o valor bruto para porcentagem, corrigindo a lógica invertida!

ldr_porcentagem.ino
/*
 * 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); 
}
V3

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_flash.ino
/*
 * 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...