⏰ Relógio com LCD I2C (16×2) + Alarme Programável e Animações
Hoje vamos turbinar o nosso relógio no LCD I2C 16×2: além de marcar horas:minutos:segundos, ele traz alarme programável (LED e buzzer) e uma animação elegante sempre que a hora muda. Projeto simples, útil e com aquele toque de capricho visual.
🎯 Objetivo
-
Exibir o horário em tempo real no LCD I2C.
-
Ajustar hora e minuto por botões.
-
Ativar/desativar alarme por botão.
-
Rodar animação no display quando muda a hora.
🛠 Materiais
-
Arduino Uno (ou compatível)
-
LCD 16×2 com interface I2C (endereço padrão 0x27)
-
3 × botões tácteis
-
(Opcional) 1 × buzzer passivo no pino 12
-
Jumpers e protoboard
🔌 Ligações
LCD I2C → Arduino Uno
-
VCC → 5V
-
GND → GND
-
SDA → A4
-
SCL → A5
Botões (com INPUT_PULLUP)
-
BTN_HORA → D2 → botão para GND
-
BTN_MINUTO → D3 → botão para GND
-
BTN_RESET (alarme) → D4 → botão para GND
Sinalização
⚙️ Funcionamento
-
D2 incrementa horas (0–23)
-
D3 incrementa minutos (0–59)
-
D4 alterna alarme ON/OFF
-
Alarme dispara quando hora:minuto coincidem com alarmHora e alarmMinuto
-
Animação “deslizar” aparece sempre que as horas mudam
💻 Código Completo (Arduino)

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
const int LED_PIN = 13;
const int BUZZER_PIN = 12;
// Botões
#define BTN_HORA 2
#define BTN_MINUTO 3
#define BTN_RESET 4
LiquidCrystal_I2C lcd(0x27, 16, 2);
int segundos = 0;
int minutos = 0;
int horas = 0;
// Variáveis do alarme
int alarmHora = 6;
int alarmMinuto = 30;
bool alarmAtivo = false;
unsigned long lastMillis = 0;
unsigned long lastDebounceHora = 0;
unsigned long lastDebounceMin = 0;
unsigned long lastDebounceReset = 0;
const unsigned long debounceDelay = 200;
void setup() {
pinMode(LED_PIN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(BTN_HORA, INPUT_PULLUP);
pinMode(BTN_MINUTO, INPUT_PULLUP);
pinMode(BTN_RESET, INPUT_PULLUP);
lcd.init();
lcd.backlight();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("HORAS:");
mostrarRelogio();
}
void loop() {
unsigned long currentMillis = millis();
// Incrementa o relógio
if (currentMillis - lastMillis >= 1000) {
lastMillis = currentMillis;
segundos++;
if (segundos >= 60) {
segundos = 0;
minutos++;
}
if (minutos >= 60) {
minutos = 0;
horas++;
animacaoTrocaHora();
}
if (horas >= 24) {
horas = 0;
}
mostrarRelogio();
verificarAlarme();
}
// Ajuste de horas
if (digitalRead(BTN_HORA) == LOW && (millis() - lastDebounceHora) > debounceDelay) {
lastDebounceHora = millis();
horas = (horas + 1) % 24;
mostrarRelogio();
}
// Ajuste de minutos
if (digitalRead(BTN_MINUTO) == LOW && (millis() - lastDebounceMin) > debounceDelay) {
lastDebounceMin = millis();
minutos = (minutos + 1) % 60;
mostrarRelogio();
}
// Reset / Ajuste de alarme
if (digitalRead(BTN_RESET) == LOW && (millis() - lastDebounceReset) > debounceDelay) {
lastDebounceReset = millis();
// Alterna entre ativar/desativar o alarme
alarmAtivo = !alarmAtivo;
lcd.setCursor(0, 0);
if (alarmAtivo) {
lcd.print("ALARME ATIVO ");
} else {
lcd.print("ALARME DESAT. ");
}
delay(1000);
lcd.setCursor(0, 0);
lcd.print("HORAS: ");
mostrarRelogio();
}
}
void mostrarRelogio() {
lcd.setCursor(0, 1);
if (horas < 10) lcd.print("0");
lcd.print(horas);
lcd.print(":");
if (minutos < 10) lcd.print("0");
lcd.print(minutos);
lcd.print(":");
if (segundos < 10) lcd.print("0");
lcd.print(segundos);
lcd.print(" ");
}
void verificarAlarme() {
if (alarmAtivo && horas == alarmHora && minutos == alarmMinuto && segundos == 0) {
for (int i = 0; i < 10; i++) {
digitalWrite(LED_PIN, HIGH);
tone(BUZZER_PIN, 1000);
delay(200);
digitalWrite(LED_PIN, LOW);
noTone(BUZZER_PIN);
delay(200);
}
}
}
void animacaoTrocaHora() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Mudando Hora");
for (int i = 0; i < 16; i++) {
lcd.scrollDisplayLeft();
delay(100);
}
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("HORAS:");
}
Comentários
Postar um comentário
Faça seu comentário referente a este assunto