⏰ 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

  • LED do Arduino (D13) pisca como “marcador” de segundo

  • (Opcional) Buzzer no D12 (e GND) para toque do alarme

⚙️ 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

Postagens mais visitadas deste blog

contador 9999 com pic 16f628

CNC fotos cordenadas x y z dicas

codigo assembler braço mecanico para 5 motores