Atire a primeira pedra quem nunca chegou atrasado para um evento, seja ele uma reunião, ou simplesmente a um almoço com os amigos. Então quando se fala em acordar de manhã a horas, a situação pode tornar-se ainda pior! Neste projeto, vamos acabar com esses atrasos matinais de uma forma fácil e divertida, utilizando, claro, a nossa placa microcontroladora Arduino!
Para este projeto, vamos precisar dos seguintes elementos:
| Imagem | Produto | Comprar |
|---|---|---|
![]() |
Arduino (Nano) | |
![]() |
Display LCD 20×4 I2C | |
![]() |
Breadboard 830 Pinos | |
![]() |
4 Botões de Pressão | |
![]() |
Módulo RTC DS1307 I2C | |
![]() |
Buzzer Passivo | |
![]() |
Fios de Ligação Macho-Macho | |
![]() |
Fios de Ligação Macho-Fêmea |
Montagem do Circuito
Recorremos à comunicação I2C entre o Arduino e o módulo RTC e o LCD para minimizar a desorganização do nosso projeto. O buzzer passivo irá garantir o sinal sonoro uma vez ativado o alarme.
Vamos começar por montar o circuito com todos os componentes acima mencionados de acordo com este esquema de montagem:

Preparação do Ambiente e Envio do Código
Vamos começar por transferir as bibliotecas necessárias para o projeto:
Biblioteca LiquidCrytal_I2C.h
Biblioteca RTCLib.h
No nosso ambiente do Arduino IDE, adicionamos as bibliotecas necessárias em “Rascunho” -> “Incluir Biblioteca” -> “Adicionar Biblioteca .ZIP” e selecionando, um por um, os ficheiros .ZIP transferidos.

Após selecionar a respetiva placa microcontroladora a utilizar, basta compilar e carregar o seguinte código:
/*Código para o Projeto: Alarmuino - Relógio Despertador com Arduino
Utilizando os 4 botões de pressão, navegue pelos menus para ativar/desativar o alarme e para definir o mesmo.
Botão Menu ====> Botão conectado ao pino 2, utilizado para aceder ou sair dos menus
Botão Confirmação ====> Botão conectado ao pino 3, utilizado para entrar nos menuns ou confirmar escolhas
Botão Anterior ====> Botão conectado ao pino 4, utilizado para diminuir ou substrair input's do utilizador
Botão Avançar ====> Botão conectado ao pino 5, utilizado para aumentar ou acrescentar input's do utilizador
Conectar um dispositivo de saída ao pino 6 (Buzzer) para resposta sonora ou visual à atuação do alarme
www.electrofun.pt/blog/nunca-mais-chegue-atrasado-relogio-despertador-com-arduino/
Electrofun@2022 ---> www.electrofun.pt
*/
//Inclusão de Bibliotecas
#include <LiquidCrystal_I2C.h>
#include "RTClib.h"
//Definição de pinos
#define pinoBotaoMenu 2
#define pinoBotaoConfirmacao 3
#define pinoBotaoAnterior 4
#define pinoBotaoAvancar 5
#define pinoBuzzer 6
LiquidCrystal_I2C lcd(0x27, 20, 4);
RTC_DS1307 rtc;
//Declaração de variáveis
int debouce = 200; //Esta variável é utilizada apenas para conhecimento do utilizador do motivo da função delay() no pedaço de código
int minutoAtual = 60;
int horaAlarme = 12;
int minutoAlarme = 30;
int estadoBotaoMenu, estadoBotaoConfirmacao, estadoBotaoAnterior, estadoBotaoAvancar;
bool alarmeCancelado;
bool alarmeAtivado = false;
bool idaMenu = false;
//Caracteres Necessários em BitMap
byte simboloSino[] = {
B01110,
B01110,
B11111,
B11111,
B11111,
B11111,
B00000,
B00100
};
byte setaDireita[] = {
B10000,
B11000,
B11100,
B11111,
B11111,
B11110,
B11000,
B10000
};
byte setaEsquerda[] = {
B00001,
B00011,
B00111,
B11111,
B11111,
B01111,
B00011,
B00001
};
void setup() {
pinMode(pinoBotaoMenu, INPUT_PULLUP);
pinMode(pinoBotaoConfirmacao, INPUT_PULLUP);
pinMode(pinoBotaoAnterior, INPUT_PULLUP);
pinMode(pinoBotaoAvancar, INPUT_PULLUP);
pinMode(pinoBuzzer, OUTPUT);
if (! rtc.begin()) {
while (1) delay(10)
;
}
if (! rtc.isrunning()) {
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
lcd.init();
lcd.backlight();
lcd.setCursor(5, 0);
lcd.print("Alarmuino");
lcd.setCursor(0, 1);
lcd.print("Relogio Despertador");
lcd.setCursor(4, 2);
lcd.print("com Arduino");
lcd.setCursor(1, 3);
lcd.print("by Electrofun@2022");
delay(5000);
lcd.clear();
}
void loop() {
DateTime now = rtc.now();
if (minutoAtual != now.minute() || idaMenu == true) {
if (minutoAtual != now.minute()) {
alarmeCancelado = false;
}
idaMenu == false;
lcd.setCursor(0, 0);
lcd.print("Hora Atual:");
if (now.hour() < 10) {
lcd.setCursor(12, 0);
lcd.print("0");
lcd.setCursor(13, 0);
lcd.print(now.hour());
} else {
lcd.setCursor(12, 0);
lcd.print(now.hour());
}
lcd.setCursor(14, 0);
lcd.print(":");
if (now.minute() < 10) {
lcd.setCursor(15, 0);
lcd.print("0");
lcd.setCursor(16, 0);
lcd.print(now.minute());
} else {
lcd.setCursor(15, 0);
lcd.print(now.minute());
}
lcd.setCursor(0, 1);
lcd.print("Data:");
if (now.day() < 10) {
lcd.setCursor(6, 1);
lcd.print("0");
lcd.setCursor(7, 1);
lcd.print(now.day());
} else {
lcd.setCursor(6, 1);
lcd.print(now.day());
}
lcd.setCursor(8, 1);
lcd.print("/");
if (now.month() < 10) {
lcd.setCursor(9, 1);
lcd.print("0");
lcd.setCursor(10, 1);
lcd.print(now.month());
} else {
lcd.setCursor(9, 1);
lcd.print(now.month());
}
lcd.setCursor(11, 1);
lcd.print("/");
lcd.setCursor(12, 1);
lcd.print(now.year());
lcd.setCursor(0, 3);
lcd.print("Alarme:");
if (horaAlarme < 10) {
lcd.setCursor(8, 3);
lcd.print("0");
lcd.setCursor(9, 3);
lcd.print(horaAlarme);
} else {
lcd.setCursor(8, 3);
lcd.print(horaAlarme);
}
lcd.setCursor(10, 3);
lcd.print(":");
if (minutoAlarme < 10) {
lcd.setCursor(11, 3);
lcd.print("0");
lcd.setCursor(12, 3);
lcd.print(minutoAlarme);
} else {
lcd.setCursor(11, 3);
lcd.print(minutoAlarme);
}
if (alarmeAtivado == true) {
lcd.createChar(0, simboloSino);
lcd.setCursor(19, 3);
lcd.write(0);
}
}
if (now.minute() == minutoAlarme && now.hour() == horaAlarme) {
if (alarmeAtivado == true && alarmeCancelado == false) {
tone(pinoBuzzer, 5000);
delay(500);
noTone(pinoBuzzer);
delay(500);
}
}
if (digitalRead(pinoBotaoConfirmacao) == 0 && alarmeAtivado == true) {
noTone(pinoBuzzer);
alarmeCancelado = true;
}
estadoBotaoMenu = digitalRead(pinoBotaoMenu);
if (estadoBotaoMenu == 0) {
delay(debouce);
menu1Alarme();
idaMenu = true;
}
minutoAtual = now.minute();
}
void menu1Alarme() {
lcd.clear();
lcd.setCursor(5, 0);
lcd.print("1 - Alarme");
if (alarmeAtivado == 1) {
lcd.setCursor(7, 2);
lcd.print("Ligado");
} else if (alarmeAtivado == 0) {
lcd.setCursor(5, 2);
lcd.print("Desligado");
}
lcd.createChar(1, setaEsquerda);
lcd.setCursor(0, 3);
lcd.write(1);
lcd.createChar(2, setaDireita);
lcd.setCursor(19, 3);
lcd.write(2);
do {
estadoBotaoMenu = digitalRead(pinoBotaoMenu);
estadoBotaoConfirmacao = digitalRead(pinoBotaoConfirmacao);
estadoBotaoAnterior = digitalRead(pinoBotaoAnterior);
estadoBotaoAvancar = digitalRead(pinoBotaoAvancar);
} while (estadoBotaoMenu == 1 && estadoBotaoConfirmacao == 1 && estadoBotaoAnterior == 1 && estadoBotaoAvancar == 1);
if (estadoBotaoConfirmacao == 0) {
delay(200);
alarmeAtivado = !alarmeAtivado;
menu1Alarme();
} else if (estadoBotaoAnterior == 0) {
delay(debouce);
menu2Alarme();
} else if (estadoBotaoAvancar == 0) {
delay(debouce);
menu2Alarme();
} else if (estadoBotaoMenu == 0) {
delay(debouce);
lcd.clear();
return;
}
}
void menu2Alarme() {
lcd.clear();
lcd.setCursor(1, 0);
lcd.print("2 - Definir Alarme");
if (horaAlarme < 10) {
lcd.setCursor(7, 2);
lcd.print("0");
lcd.setCursor(8, 2);
lcd.print(horaAlarme);
} else {
lcd.setCursor(7, 2);
lcd.print(horaAlarme);
}
lcd.setCursor(9, 2);
lcd.print(":");
if (minutoAlarme < 10) {
lcd.setCursor(10, 2);
lcd.print("0");
lcd.setCursor(11, 2);
lcd.print(minutoAlarme);
} else {
lcd.setCursor(10, 2);
lcd.print(minutoAlarme);
}
lcd.setCursor(0, 3);
lcd.write(1);
lcd.setCursor(19, 3);
lcd.write(2);
do {
estadoBotaoMenu = digitalRead(pinoBotaoMenu);
estadoBotaoConfirmacao = digitalRead(pinoBotaoConfirmacao);
estadoBotaoAnterior = digitalRead(pinoBotaoAnterior);
estadoBotaoAvancar = digitalRead(pinoBotaoAvancar);
} while (estadoBotaoMenu == 1 && estadoBotaoConfirmacao == 1 && estadoBotaoAnterior == 1 && estadoBotaoAvancar == 1);
if (estadoBotaoConfirmacao == 0) {
delay(debouce);
definirAlarme();
} else if (estadoBotaoAnterior == 0) {
delay(debouce);
menu1Alarme();
} else if (estadoBotaoAvancar == 0) {
delay(debouce);
menu1Alarme();
} else if (estadoBotaoMenu == 0) {
delay(debouce);
lcd.clear();
return;
}
}
void definirAlarme() {
lcd.clear();
lcd.setCursor(1, 0);
lcd.print("2 - Definir Alarme");
//Definir Hora Alarme
do {
if (horaAlarme < 10) {
lcd.setCursor(7, 2);
lcd.print("0");
lcd.setCursor(8, 2);
lcd.print(horaAlarme);
} else {
lcd.setCursor(7, 2);
lcd.print(horaAlarme);
}
lcd.setCursor(9, 2);
lcd.print(":");
if (minutoAlarme < 10) { lcd.setCursor(10, 2); lcd.print("0"); lcd.setCursor(11, 2); lcd.print(minutoAlarme); } else { lcd.setCursor(10, 2); lcd.print(minutoAlarme); } estadoBotaoAnterior = digitalRead(pinoBotaoAnterior); estadoBotaoAvancar = digitalRead(pinoBotaoAvancar); if (estadoBotaoAvancar == 0) { delay(debouce); horaAlarme++; if (horaAlarme > 23) {
horaAlarme = 0;
}
} else if (estadoBotaoAnterior == 0) {
delay(debouce);
horaAlarme--;
if (horaAlarme < 0) {
horaAlarme = 23;
}
}
} while (digitalRead(pinoBotaoConfirmacao) == 1);
delay(debouce);
//Definir Minutos Alarme
do {
if (horaAlarme < 10) {
lcd.setCursor(7, 2);
lcd.print("0");
lcd.setCursor(8, 2);
lcd.print(horaAlarme);
} else {
lcd.setCursor(7, 2);
lcd.print(horaAlarme);
}
lcd.setCursor(9, 2);
lcd.print(":");
if (minutoAlarme < 10) { lcd.setCursor(10, 2); lcd.print("0"); lcd.setCursor(11, 2); lcd.print(minutoAlarme); } else { lcd.setCursor(10, 2); lcd.print(minutoAlarme); } estadoBotaoAnterior = digitalRead(pinoBotaoAnterior); estadoBotaoAvancar = digitalRead(pinoBotaoAvancar); if (estadoBotaoAvancar == 0) { delay(debouce); minutoAlarme++; if (minutoAlarme > 59) {
minutoAlarme = 0;
}
} else if (estadoBotaoAnterior == 0) {
delay(debouce);
minutoAlarme--;
if (minutoAlarme < 0) {
minutoAlarme = 59;
}
}
} while (digitalRead(pinoBotaoConfirmacao) == 1);
delay(debouce);
lcd.clear();
}
Funcionamento
A breadboard montada acima conta com 4 botões. Da esquerda para a direita: botão de menu, utilizado para aceder ou sair ao menu das configurações; botão de confirmação, utilizado para entrar ou confirmar uma opção do menu; botão “anterior”, para diminuir valores na definição da hora do alarme; e botão “avançar”, para aumentar os mesmos valores.
Por definição, o despertador está desligado e a hora pré-definida é 12:30. Para utilizar o alarme, prima o botão de menu e, no menu “1 – Alarme”, pressionar o botão de confirmação. Pode ser confirmado o passo anterior pelo surgimento de um pequeno sino no LCD.
Seguidamente, prima o botão de menu novamente, pressione o botão “avançar” para ir ao menu “2 – Definir Alarme” e prima o botão de confirmação. Utilizando os botões “avançar” e “anterior”, defina a hora do alarme. Volte a pressionar o botão de confirmação para inserir os minutos do alarme. Uma vez terminado, pressione o botão de confirmação e o alarme encontra-se definido.
Para desativar o alarme, repita o primeiro passo. O desaparecimento do sino no LCD confirma a alteração.

Não se esqueçam de ver o nosso vídeo sobre este artigo no nosso canal do YouTube:
Para mais projetos, percorram o nosso blog, onde podem encontrar vários artigos interessantes relacionados com eletrónica, robótica e muito mais! Visitem também o nosso site, onde encontram tudo para eletrónica e robótica!









