/* ----- Código em C para Relógio Despertador baseado em Arduino ----- */
#include <Wire.h>
#include <EEPROM.h>
#include <RTClib.h>
#include <LiquidCrystal.h>
// Definições dos pinos do LCD
const int pinoRS = 8;
const int pinoEN = 9;
const int pinoD4 = 10;
const int pinoD5 = 11;
const int pinoD6 = 12;
const int pinoD7 = 13;
// Inicializa o LCD
LiquidCrystal lcd(pinoRS, pinoEN, pinoD4, pinoD5, pinoD6, pinoD7);
// Inicializa o RTC (Relógio de Tempo Real)
RTC_DS1307 rtc;
// Variáveis globais de hora e alarme
int horaAtual, minutoAtual, segundoAtual;
int horaAlarme, minutoAlarme;
int horaInicial, minutoInicial;
// Endereço de EEPROM para armazenar o alarme
int enderecoEEPROM = 11;
// Definição dos botões
const int botaoVerde = 7; // Avança as opções
const int botaoVermelho= 6; // Aumenta Hora/Minuto valores
const int botaoAmarelo = 5; // Configura o alarme
// --------------------------------------------------------------------
void setup() {
Wire.begin();
rtc.begin();
lcd.begin(16, 2);
DateTime agora = rtc.now();
horaInicial = agora.hour();
minutoInicial = agora.minute();
EEPROM.write(enderecoEEPROM, horaInicial);
EEPROM.write(enderecoEEPROM+1, minutoInicial);
pinMode(botaoVerde, INPUT_PULLUP);
pinMode(botaoVermelho, INPUT_PULLUP);
pinMode(botaoAmarelo, INPUT_PULLUP);
// Mensagem inicial
lcd.setCursor(0, 0);
lcd.print("Relogio Digital");
lcd.setCursor(0, 1);
lcd.print("No Arduino");
delay(3000);
lcd.clear();
// Ajusta o RTC caso não esteja rodando
if (!rtc.isrunning()) {
rtc.adjust(DateTime(__DATE__, __TIME__));
}
// Lê o horário de alarme previamente salvo na EEPROM
horaAlarme = EEPROM.read(enderecoEEPROM);
minutoAlarme = EEPROM.read(enderecoEEPROM + 1);
}
void loop() {
// Captura a data e hora atuais
DateTime agora = rtc.now();
horaAtual = agora.hour();
minutoAtual = agora.minute();
segundoAtual= agora.second();
// Se o botão amarelo for pressionado, configura o alarme
if (digitalRead(botaoAmarelo) == LOW) {
configurarAlarme();
}
// Exibe hora e data no LCD
exibirRelogio(agora);
// Verifica se o alarme deve tocar
verificarAlarme();
delay(200);
}
// --------------------------------------------------------------------
// Função para exibir Relógio (hora:minuto:segundo e data)
void exibirRelogio(DateTime agora) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Hora: ");
if (horaAtual < 10) lcd.print("0");
lcd.print(horaAtual);
lcd.print(":");
if (minutoAtual < 10) lcd.print("0");
lcd.print(minutoAtual);
lcd.print(":");
if (segundoAtual < 10) lcd.print("0");
lcd.print(segundoAtual);
lcd.setCursor(0, 1);
lcd.print("Data: ");
lcd.print(agora.day());
lcd.print("/");
lcd.print(agora.month());
lcd.print("/");
lcd.print(agora.year());
}
// --------------------------------------------------------------------
// Função para configurar o alarme usando os três botões
void configurarAlarme() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Config. Alarme");
lcd.setCursor(0, 1);
lcd.print("Hora: ");
delay(1000);
// Ajuste da Hora do Alarme
while (true) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Ajuste Hora");
lcd.setCursor(0, 1);
lcd.print("Hora: ");
if (horaAlarme < 10) lcd.print("0");
lcd.print(horaAlarme);
// Se o botão vermelho for pressionado, incrementa a hora
if (digitalRead(botaoVermelho) == LOW) {
horaAlarme++;
if (horaAlarme >= 24) {
horaAlarme = 0;
}
// Para evitar múltiplos incrementos
while (digitalRead(botaoVermelho) == LOW) {}
}
// Se o botão verde for pressionado, avançamos para ajustar o minuto
if (digitalRead(botaoVerde) == LOW) {
while (digitalRead(botaoVerde) == LOW) {}
break;
}
delay(200);
}
// Ajuste do Minuto do Alarme
while (true) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Ajuste Min Alarme");
lcd.setCursor(0, 1);
lcd.print("Min: ");
if (minutoAlarme < 10) lcd.print("0");
lcd.print(minutoAlarme);
// Se o botão vermelho for pressionado, incrementa o minuto
if (digitalRead(botaoVermelho) == LOW) {
minutoAlarme++;
if (minutoAlarme >= 60) {
minutoAlarme = 0;
}
// Para evitar múltiplos incrementos
while (digitalRead(botaoVermelho) == LOW) {}
}
// Se o botão verde for pressionado, salvamos e saímos
if (digitalRead(botaoVerde) == LOW) {
while (digitalRead(botaoVerde) == LOW) {}
break;
}
delay(200);
}
// Salva os valores ajustados na EEPROM
EEPROM.write(enderecoEEPROM, horaAlarme);
EEPROM.write(enderecoEEPROM + 1, minutoAlarme);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Alarme Definido!");
delay(1500);
lcd.clear();
}
// --------------------------------------------------------------------
// Verifica se é hora de tocar o alarme
void verificarAlarme() {
if (horaAtual == horaAlarme &&
minutoAtual == minutoAlarme &&
segundoAtual < 2) // Para evitar que toque por 1 minuto inteiro
{
// Mensagem de alarme
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Alarme: Acorde!");
lcd.setCursor(0, 1);
lcd.print("Pressione verde..");
// Espera pressionar o botão verde para parar
while (digitalRead(botaoVerde) == HIGH) {
delay(1000);
}
// Ao pressionar o botão verde, sai do alarme
lcd.clear();
lcd.print("Alarme parado");
delay(1000);
}
}