⏰ Construindo um Relógio Digital com Arduino e Display de 7 Segmentos

Os projetos com Arduino se tornam ainda mais interessantes quando passamos a trabalhar com tempo. Hoje vamos aprender a criar um Relógio Digital que exibe horas e minutos em um display de 4 dígitos e ainda conta com função de alarme programável.

Este projeto é uma ótima forma de aprender sobre manipulação de tempo, interação com botões e controle de exibição em displays de 7 segmentos.


🛠 Materiais Necessários

  • 1 Arduino Uno

  • 1 Display de 4 dígitos com 7 segmentos (comum cátodo)

  • 3 Botões (ajustar hora, ajustar minuto, ativar/desativar alarme)

  • 1 Buzzer ou alto-falante pequeno

  • Resistores de 10kΩ (para os botões)

  • Protoboard

  • Jumpers para ligação


🔌 Montagem do Circuito

A ligação do circuito envolve conectar cada dígito e segmento do display ao Arduino, além de configurar os botões para ajuste de hora, minuto e ativação do alarme.

  • Botão 1 (A0) → Ajusta as horas

  • Botão 2 (A1) → Ajusta os minutos

  • Botão 3 (A2) → Liga/desliga o alarme

  • Buzzer (A3) → Toca o alarme

  • Pino 13 → Controle do separador de horas (os dois pontos piscando)



💻 Código Completo


/* Arduino Digital Alarm Clock Copyright (C) 2020, Uri Shaked. Released under the MIT License. */ #include <SevSeg.h> #include "Button.h" #include "AlarmTone.h" #include "Clock.h" #include "config.h" const int COLON_PIN = 13; const int SPEAKER_PIN = A3; Button hourButton(A0); Button minuteButton(A1); Button alarmButton(A2); AlarmTone alarmTone; Clock clock; SevSeg sevseg; enum DisplayState { DisplayClock, DisplayAlarmStatus, DisplayAlarmTime, DisplayAlarmActive, DisplaySnooze, }; DisplayState displayState = DisplayClock; long lastStateChange = 0; void changeDisplayState(DisplayState newValue) { displayState = newValue; lastStateChange = millis(); } long millisSinceStateChange() { return millis() - lastStateChange; } void setColon(bool value) { digitalWrite(COLON_PIN, value ? LOW : HIGH); } void displayTime() { DateTime now = clock.now(); bool blinkState = now.second() % 2 == 0; sevseg.setNumber(now.hour() * 100 + now.minute()); setColon(blinkState); } void clockState() { displayTime(); if (alarmButton.read() == Button::RELEASED && clock.alarmActive()) { alarmButton.has_changed(); changeDisplayState(DisplayAlarmActive); return; } if (hourButton.pressed()) { clock.incrementHour(); } if (minuteButton.pressed()) { clock.incrementMinute(); } if (alarmButton.pressed()) { clock.toggleAlarm(); changeDisplayState(DisplayAlarmStatus); } } void alarmStatusState() { setColon(false); sevseg.setChars(clock.alarmEnabled() ? " on" : " off"); if (millisSinceStateChange() > ALARM_STATUS_DISPLAY_TIME) { changeDisplayState(clock.alarmEnabled() ? DisplayAlarmTime : DisplayClock); return; } } void alarmTimeState() { DateTime alarm = clock.alarmTime(); sevseg.setNumber(alarm.hour() * 100 + alarm.minute(), -1); if (millisSinceStateChange() > ALARM_HOUR_DISPLAY_TIME || alarmButton.pressed()) { changeDisplayState(DisplayClock); return; } if (hourButton.pressed()) { clock.incrementAlarmHour(); lastStateChange = millis(); } if (minuteButton.pressed()) { clock.incrementAlarmMinute(); lastStateChange = millis(); } if (alarmButton.pressed()) { changeDisplayState(DisplayClock); } } void alarmState() { displayTime(); if (alarmButton.read() == Button::RELEASED) { alarmTone.play(); } if (alarmButton.pressed()) { alarmTone.stop(); } if (alarmButton.released()) { alarmTone.stop(); bool longPress = alarmButton.repeat_count() > 0; if (longPress) { clock.stopAlarm(); changeDisplayState(DisplayClock); } else { clock.snooze(); changeDisplayState(DisplaySnooze); } } } void snoozeState() { sevseg.setChars("****"); if (millisSinceStateChange() > SNOOZE_DISPLAY_TIME) { changeDisplayState(DisplayClock); return; } } void setup() { Serial.begin(115200); clock.begin(); hourButton.begin(); hourButton.set_repeat(500, 200); minuteButton.begin(); minuteButton.set_repeat(500, 200); alarmButton.begin(); alarmButton.set_repeat(1000, -1); alarmTone.begin(SPEAKER_PIN); pinMode(COLON_PIN, OUTPUT); byte digits = 4; byte digitPins[] = {2, 3, 4, 5}; byte segmentPins[] = {6, 7, 8, 9, 10, 11, 12}; bool resistorsOnSegments = false; bool updateWithDelays = false; bool leadingZeros = true; bool disableDecPoint = true; sevseg.begin(DISPLAY_TYPE, digits, digitPins, segmentPins, resistorsOnSegments, updateWithDelays, leadingZeros, disableDecPoint); sevseg.setBrightness(90); } void loop() { sevseg.refreshDisplay(); switch (displayState) { case DisplayClock: clockState(); break; case DisplayAlarmStatus: alarmStatusState(); break; case DisplayAlarmTime: alarmTimeState(); break; case DisplayAlarmActive: alarmState(); break; case DisplaySnooze: snoozeState(); break; } }

📖 Como o Projeto Funciona

  • Leitura e ajuste da hora → Dois botões permitem incrementar as horas e minutos.

  • Função de alarme → Um botão liga/desliga o alarme e permite configurar o horário.

  • Indicação visual → O display exibe horas e minutos, com os dois pontos piscando a cada segundo.

  • Alarme sonoro → Um buzzer toca quando o horário programado é atingido.

  • Função soneca → Possível ativar um atraso antes de tocar novamente.


🔧 Possíveis Melhorias

  • Adicionar um módulo RTC DS3231 para manter a hora mesmo sem energia.

  • Usar um display LCD para mostrar mais informações.

  • Implementar um alarme múltiplo com diferentes horários programáveis.


🏁 Conclusão

Este relógio digital com Arduino é um ótimo exemplo de como combinar controle de hardware, interface com botões e exibição de informações. É um passo essencial para quem quer dominar projetos mais complexos de automação e IoT.

Comentários

Postar um comentário

Faça seu comentário referente a este assunto

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