#include <RTClib.h> // Biblioteca para o RTC
#include <RCSwitch.h> // Biblioteca para RF
#include <Wire.h> // Biblioteca I2C
RTC_DS3231 rtc; // Cria uma instância do RTC
RCSwitch mySwitch = RCSwitch(); // Instância para comunicação RF
// Definindo as portas
#define alarmPin 11 // Porta de saída para o alarme
// Variáveis
int currentHour;
int currentMinute;
int Ultimahora = -1; // Inicializa com um valor fora do intervalo normal de horas
int rfCode = 1234567; // Código RF para acionar o alarme
int rfCode2 = 7654321; // Código RF para desacionar o alarme
bool alarmState = false; // Variável para verificar o estado do alarme
void setup() {
Serial.begin(9600);
pinMode(alarmPin, OUTPUT);
digitalWrite(alarmPin, HIGH); // Alarme desacionado inicialmente
// Inicializa o RTC
if (!rtc.begin()) {
//Serial.println("RTC não encontrado");
while (1);
}
// Se a hora do RTC não estiver configurada, defina a hora aqui (apenas na primeira vez)
//rtc.adjust(DateTime(F(DATE), F(TIME)));
// Inicializa o receptor RF
mySwitch.enableReceive(0); // Recebe no pino 0
}
void loop() {
// -------- LOOP DO RF ---------------------------- LOOP DO RF -----------------------------------------------------------------
if (mySwitch.available()) {
int value = mySwitch.getReceivedValue();
if (value == rfCode) { // Se o código do controle RF for o esperado (para acionar o alarme)
if (!alarmState) { // Se o alarme não estiver acionado
//Serial.println("Alarme acionado via controle RF");
digitalWrite(alarmPin, LOW); // Aciona o alarme
alarmState = true; // Atualiza o estado do alarme
}
}
else if (value == rfCode2) { // Se o código do controle RF for o esperado (para desacionar o alarme)
if (alarmState) { // Se o alarme estiver acionado
//Serial.println("Alarme desacionado via controle RF");
digitalWrite(alarmPin, HIGH); // Desaciona o alarme
alarmState = false; // Atualiza o estado do alarme
}
}
else if (value == 0) {
//Serial.println("Código desconhecido");
}
//Serial.print("Código RF recebido: ");
//Serial.println(value); // Exibe no monitor serial o código recebido
mySwitch.resetAvailable();
}
// ------------------------------------------------------------------------------------------------------------------------------
// Verifica se há dados no Serial para configurar a hora
if (Serial.available() > 0) {
int year = Serial.parseInt();
int month = Serial.parseInt();
int day = Serial.parseInt();
int hour = Serial.parseInt();
int minute = Serial.parseInt();
int second = Serial.parseInt();
// Ajusta o RTC com a hora fornecida
rtc.adjust(DateTime(year, month, day, hour, minute, second));
//Serial.println("Hora ajustada com sucesso!");
}
// Obtém a hora atual do RTC
DateTime now = rtc.now();
currentHour = now.hour();
currentMinute = now.minute();
int currentSecond = now.second();
/* Exibe a data e hora no Serial Monitor
Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), DEC);
Serial.print(" ");
Serial.print(currentHour);
Serial.print(':');
Serial.print(currentMinute);
Serial.print(':');
Serial.print(currentSecond);
Serial.println();
*/
// Lógica de ativação do alarme de segunda a quinta-feira
if (Ultimahora != currentHour) {
if (dayOfWeek() >= 1 && dayOfWeek() <= 4) { // Segunda a Quinta-feira
if (currentHour == 8 || currentHour == 12 || currentHour == 13 || currentHour == 18) {
digitalWrite(alarmPin, LOW);
delay(6000);
digitalWrite(alarmPin, HIGH);
Ultimahora = currentHour;
} else if (currentHour == 10) {
digitalWrite(alarmPin, LOW);
delay(1000);
digitalWrite(alarmPin, HIGH);
delay(1000);
digitalWrite(alarmPin, LOW);
delay(1000);
digitalWrite(alarmPin, HIGH);
delay(1000);
digitalWrite(alarmPin, LOW);
delay(1000);
digitalWrite(alarmPin, HIGH);
Ultimahora = currentHour;
}
}
// Lógica de ativação do alarme para sexta-feira
if (dayOfWeek() == 5) { // Sexta-feira
if (currentHour == 8 || currentHour == 12 || currentHour == 13 || currentHour == 17) {
digitalWrite(alarmPin, LOW);
delay(6000);
digitalWrite(alarmPin, HIGH);
Ultimahora = currentHour;
} else if (currentHour == 10) {
digitalWrite(alarmPin, LOW);
delay(1000);
digitalWrite(alarmPin, HIGH);
delay(1000);
digitalWrite(alarmPin, LOW);
delay(1000);
digitalWrite(alarmPin, HIGH);
delay(1000);
digitalWrite(alarmPin, LOW);
delay(1000);
digitalWrite(alarmPin, HIGH);
Ultimahora = currentHour;
}
}
}
}
// Função para obter o dia da semana
int dayOfWeek() {
DateTime now = rtc.now();
return now.dayOfTheWeek();
}