#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
#include <Wire.h>
#include <RTClib.h>
// Definições do display TFT ILI9341
#define TFT_CS 5
#define TFT_DC 15
#define TFT_RST 4
#define TFT_MOSI 23
#define TFT_CLK 18
#define TFT_MISO 19
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);
// Definições do relé
#define RELE_PIN 2
// Definições dos botões
#define BUTTON_HOUR 16
#define BUTTON_MINUTE 17
// Inicializa o RTC
RTC_DS3231 rtc;
DateTime now; // Para armazenar a hora atual
int setHour = 00; // Hora inicial de acionamento
int setMinute = 00; // Minuto inicial de acionamento
void setup() {
Serial.begin(115200);
// Inicializa o display TFT
tft.begin();
tft.setRotation(1); // Ajusta a rotação conforme especificado (1)
tft.fillScreen(ILI9341_BLACK); // Limpa a tela
tft.setTextSize(2);
tft.setTextColor(ILI9341_WHITE);
// Inicializa o relé
pinMode(RELE_PIN, OUTPUT);
digitalWrite(RELE_PIN, LOW); // Relé desligado inicialmente
// Inicializa os botões
pinMode(BUTTON_HOUR, INPUT_PULLUP);
pinMode(BUTTON_MINUTE, INPUT_PULLUP);
// Inicializa o RTC
if (!rtc.begin()) {
Serial.println("Não foi possível encontrar o RTC");
tft.setCursor(10, 30);
tft.print("Erro: RTC nao encontrado");
while (1);
}
if (rtc.lostPower()) {
Serial.println("O RTC perdeu energia, ajustando para o tempo de compilação!");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
}
void loop() {
now = rtc.now(); // Obtém a hora atual do RTC
// Ajuste de hora e minuto do acionamento com os botões
if (digitalRead(BUTTON_HOUR) == LOW) {
setHour = (setHour + 1) % 24; // Incrementa a hora, volta para 0 se passar de 23
delay(300); // Debounce simples
}
if (digitalRead(BUTTON_MINUTE) == LOW) {
setMinute = (setMinute + 1) % 60; // Incrementa o minuto, volta para 0 se passar de 59
delay(300); // Debounce simples
}
// Exibe a hora atual no display
tft.fillRect(10, 30, 220, 40, ILI9341_BLACK); // Limpa a área da hora atual
tft.setCursor(10, 30);
tft.print("Hora atual: ");
tft.print(now.hour(), DEC);
tft.print(":");
tft.print(now.minute(), DEC);
//tft.print(":");
//tft.print(now.second(), DEC);
// Exibe a hora de acionamento no display
tft.fillRect(10, 70, 220, 40, ILI9341_BLACK); // Limpa a área da hora de acionamento
tft.setCursor(10, 70);
tft.print("Hora acion.: ");
tft.print(setHour, DEC);
tft.print(":");
tft.print(setMinute, DEC);
//tft.print(":00"); // Segundos sempre 00
// Verifica se a hora atual é igual à hora de acionamento
if (now.hour() == setHour && now.minute() == setMinute && now.second() == 0) {
digitalWrite(RELE_PIN, HIGH); // Aciona o relé
tft.fillRect(10, 110, 220, 40, ILI9341_BLACK); // Limpa a área de status
tft.setCursor(10, 110);
tft.print("Relé ACIONADO!");
delay(1000); // Mantém o relé acionado por 1 segundo (ajustável)
digitalWrite(RELE_PIN, LOW); // Desliga o relé
} else {
tft.fillRect(10, 110, 220, 40, ILI9341_BLACK); // Limpa a área de status
tft.setCursor(10, 110);
tft.print("Relé DESLIGADO");
}
delay(1000); // Atualiza a cada segundo
}