Luz automática ao anoitecer (fotocélula com LDR, Arduino e relé)
Automação · Iniciante · Tempo: 1 hora e 30 minutos
Um LDR (resistor que varia com a luz) e duas faixas de luminosidade com atraso fazem uma fotocélula mais estável que as comuns.
Como funciona
O LDR e um resistor de 10 kΩ formam um divisor de tensão: com mais luz a leitura do pino A0 sobe; no escuro, desce.
Para não piscar no crepúsculo, há histerese (liga abaixo de LIMIAR_LIGA, só desliga acima de LIMIAR_DESLIGA) e atraso: a condição precisa durar 60 s. O farol de um carro à noite ou uma nuvem durante o dia não mudam nada.
Para calibrar, abra o Monitor Serial ao entardecer e anote o valor no momento em que você acharia bom acender.
Posicione o LDR voltado para o céu e longe da lâmpada que ele controla — senão a própria luz o apaga.
Esquema de ligações
Vermelho = alimentação (+), preto = terra (GND/−). As etiquetas indicam ligação com a fonte ou bateria; os números correspondem à tabela abaixo.
| # | De | Para | Observação |
|---|---|---|---|
| 1 | LDR: A | Arduino: 5V | |
| 2 | LDR: B | Arduino: A0 | divisor de tensão |
| 3 | Resistor 10k: A | Arduino: A0 | |
| 4 | Resistor 10k: B | Arduino: GND | |
| 5 | Módulo relé: VCC | Arduino: 5V | |
| 6 | Módulo relé: GND | Arduino: GND | |
| 7 | Módulo relé: IN | Arduino: D7 | |
| 8 | Rede: Fase | Módulo relé: COM | disjuntor desligado! |
| 9 | Módulo relé: NA | Lâmpada: A | |
| 10 | Lâmpada: B | Rede: Neutro |
Código-fonte Arduino (C/C++)
// Fotocélula com histerese e atraso: liga no escuro, desliga no claro
const int LDR = A0;
const int RELE = 7;
const bool RELE_ATIVO_BAIXO = true;
const int LIMIAR_LIGA = 300; // abaixo disto é noite (calibre pelo Monitor Serial)
const int LIMIAR_DESLIGA = 450; // acima disto é dia
const unsigned long ATRASO = 60000; // a condição precisa durar 60 s
bool ligada = false;
unsigned long desde = 0;
void aplicar(bool ligar) {
ligada = ligar;
digitalWrite(RELE, (ligar ^ RELE_ATIVO_BAIXO) ? HIGH : LOW);
Serial.println(ligar ? "Luz LIGADA" : "Luz desligada");
}
void setup() {
Serial.begin(9600);
pinMode(RELE, OUTPUT);
aplicar(false);
}
void loop() {
int luz = analogRead(LDR);
Serial.print("Luz: "); Serial.println(luz);
bool querMudar = (!ligada && luz < LIMIAR_LIGA) || (ligada && luz > LIMIAR_DESLIGA);
if (!querMudar) desde = millis(); // condição interrompida: zera o atraso
else if (millis() - desde > ATRASO) aplicar(!ligada);
delay(500);
}
Referências
Circuito baseado na documentação oficial dos fabricantes e bibliotecas:
Montagem
- LDR entre 5V e A0; resistor de 10 kΩ entre A0 e GND.
- Módulo relé: VCC 5V, GND, IN no pino 7.
- Carregue o código e observe as leituras no Monitor Serial (9600 baud); cubra o LDR com a mão para simular a noite (o atraso de 60 s vale também no teste).
- Ajuste os limiares, desligue o disjuntor e ligue a lâmpada no COM/NA do relé.
- Proteja o LDR da chuva com uma tampa transparente.
Ferramentas
Computador com Arduino IDE
Cabo USB
Chave de fenda
