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);
}