SENSOR LUZ LED — Sensor de iluminação inverso

SENSOR LUZ LED — Sensor de iluminação inverso

Aprenda a acender um LED quando a luz do ambiente apagar com Arduino: montagem, código e explicação passo a passo.

Tutorial: Como funciona o código com LDR, LED e histerese no Arduino

Este tutorial explica de forma simples como funciona o código que lê um sensor LDR, suaviza os valores usando uma média móvel e controla um LED com histerese para evitar oscilações.


1. Declaração dos pinos

int ldrPin = A0;
int ledPin = 9;

ldrPin: Entrada analógica onde o LDR está ligado.
ledPin: Saída digital que controla o LED.

2. Buffer para média móvel

const int N = 6;
int buffer[N];
int idx = 0;
long sum = 0;

Aqui criamos uma média dos últimos 6 valores lidos, para evitar variações rápidas do LDR.
buffer[] armazena os últimos valores.
sum mantém a soma de todos os valores.
idx indica onde o próximo valor será guardado.

3. Limites da histerese

int lim_on = 150;
int lim_off = 250;

Esses valores impedem que o LED fique ligando e desligando rapidamente:
• O LED liga quando a média fica abaixo de 150.
• O LED desliga quando a média fica acima de 250.

4. Setup inicial

void setup() {
  pinMode(ledPin, OUTPUT);
  Serial.begin(9600);

  for (int i = 0; i < N; i++) buffer[i] = 300;
  sum = 300L * N;
}

Inicialmente o buffer é preenchido com 300 para evitar picos nos primeiros segundos da leitura.

5. Loop principal

a) Leitura do LDR

int leitura = analogRead(ldrPin);

b) Atualização da média móvel

sum -= buffer[idx];
buffer[idx] = leitura;
sum += buffer[idx];
idx = (idx + 1) % N;
int media = sum / N;

Remove o valor antigo da soma, adiciona o novo e calcula a média.

c) Impressão no Serial Monitor

Serial.print('linha: ');
Serial.print(leitura);
Serial.print('med: ');
Serial.println(media);

d) Controle do LED com histerese

static bool ledOn = false;

if (!ledOn && media < lim_on) {
  ledOn = true;
  digitalWrite(ledPin, HIGH);
} 
else if (ledOn && media > lim_off) {
  ledOn = false;
  digitalWrite(ledPin, LOW);
}

Se o LED estiver apagado e a média estiver baixa, acende.
Se estiver aceso e a média subir muito, apaga.
Isso evita ‘piscar’ em valores de transição.

6. Atraso final

delay(120);

Ajuda a estabilizar a leitura e suavizar o comportamento.


📌 Código completo (copiável)

int ldrPin = A0;   
int ledPin = 9;                  

const int N = 6;   
int buffer[N];
int idx = 0;
long sum = 0;

int lim_on = 150;   
int lim_off = 250;  

void setup() {
  pinMode(ledPin, OUTPUT);
  Serial.begin(9600);

  for (int i = 0; i < N; i++) buffer[i] = 300;
  sum = 300L * N;
}

void loop() {
  int leitura = analogRead(ldrPin);

  sum -= buffer[idx];
  buffer[idx] = leitura;
  sum += buffer[idx];
  idx = (idx + 1) % N;
  int media = sum / N;

  Serial.print('linha: ');
  Serial.print(leitura);
  Serial.print('med: ');
  Serial.println(media);

  static bool ledOn = false;
  if (!ledOn && media < lim_on) {
    ledOn = true;
    digitalWrite(ledPin, HIGH);
  } 
  else if (ledOn && media > lim_off) {
    ledOn = false;
    digitalWrite(ledPin, LOW);
  }

  delay(120);
}