Programador horário com relógio DS3231 (bomba de aquário, irrigação, luz de jardim)
Automação · Intermediário · Tempo: 2 horas
O módulo DS3231 tem bateria e cristal compensado por temperatura: atrasa ou adianta poucos segundos por mês.
Como funciona
Os horários ficam na tabela PROGRAMAS (hora e minuto de ligar e de desligar). O programa converte tudo em "minutos do dia" e mantém o relé ligado enquanto o horário atual estiver dentro de algum intervalo — funciona também em intervalos que passam da meia-noite, como 22:00 às 02:00.
Como a decisão é recalculada a cada segundo, se faltar energia no meio de um intervalo o aparelho volta ao estado certo quando a energia retorna.
Na primeira gravação (ou se a bateria acabar) o relógio é acertado com a data e hora da compilação. Para acertar de novo, digite no Monitor Serial H 14:30.
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 | DS3231: VCC | Arduino: 5V | |
| 2 | DS3231: GND | Arduino: GND | |
| 3 | DS3231: SDA | Arduino: A4 | I2C |
| 4 | DS3231: SCL | Arduino: A5 | I2C |
| 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 | Aparelho: A | |
| 10 | Aparelho: B | Rede: Neutro |
Código-fonte Arduino (C/C++)
// Programador horário com DS3231 — vários intervalos por dia
#include <RTClib.h>
const int RELE = 7;
const bool RELE_ATIVO_BAIXO = true;
struct Programa { byte hLiga, mLiga, hDesliga, mDesliga; };
const Programa PROGRAMAS[] = {
{ 6, 30, 7, 0}, // 06:30 às 07:00 (ex.: irrigação da manhã)
{18, 0, 18, 20}, // 18:00 às 18:20
{22, 0, 2, 0}, // 22:00 às 02:00 (passa da meia-noite)
};
const int QTD = sizeof(PROGRAMAS) / sizeof(PROGRAMAS[0]);
RTC_DS3231 rtc;
bool dentro(int agora, int ini, int fim) {
return ini <= fim ? (agora >= ini && agora < fim) : (agora >= ini || agora < fim);
}
void setup() {
Serial.begin(9600);
pinMode(RELE, OUTPUT);
digitalWrite(RELE, RELE_ATIVO_BAIXO ? HIGH : LOW);
if (!rtc.begin()) {
Serial.println("DS3231 nao encontrado — confira SDA/SCL");
while (true) delay(1000);
}
if (rtc.lostPower()) rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
void loop() {
// acerto manual pelo Monitor Serial: "H 14:30"
if (Serial.available() && Serial.read() == 'H') {
int h = Serial.parseInt(), m = Serial.parseInt();
DateTime d = rtc.now();
rtc.adjust(DateTime(d.year(), d.month(), d.day(), h, m, 0));
}
DateTime t = rtc.now();
int agora = t.hour() * 60 + t.minute();
bool ligar = false;
for (int i = 0; i < QTD; i++)
if (dentro(agora, PROGRAMAS[i].hLiga * 60 + PROGRAMAS[i].mLiga, PROGRAMAS[i].hDesliga * 60 + PROGRAMAS[i].mDesliga)) ligar = true;
digitalWrite(RELE, (ligar ^ RELE_ATIVO_BAIXO) ? HIGH : LOW);
char buf[24];
snprintf(buf, sizeof(buf), "%02d:%02d:%02d rele %s", t.hour(), t.minute(), t.second(), ligar ? "ON" : "off");
Serial.println(buf);
delay(1000);
}
Referências
Circuito baseado na documentação oficial dos fabricantes e bibliotecas:
Montagem
- Instale a biblioteca RTClib (Adafruit) pelo Gerenciador de Bibliotecas.
- DS3231: VCC 5V, GND, SDA no A4 e SCL no A5. Coloque a bateria CR2032.
- Módulo relé no pino 7.
- Edite a tabela PROGRAMAS e carregue o código; confira a hora no Monitor Serial (9600 baud).
- Com o disjuntor desligado, ligue o aparelho no COM/NA do relé.
Ferramentas
Computador com Arduino IDE
Cabo USB
