Despertador simples com DS1302 RTC
Componentes e suprimentos
![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
![]() |
| × | 1 |
Sobre este projeto
Olá a todos, neste projeto vamos tentar fazer um despertador fácil com a placa Arduino UNO. Este projeto é uma mistura de diferentes módulos que usei antes, se você estiver preso em algo, pode verificar no site do tutorial do módulo, porque é assim que eu normalmente trabalho:fazer as coisas separadamente e depois começar a mixar. :D
Para este projeto, vamos precisar de:
- placa Arduino UNO, ou você pode usar o que mais lhe convier:
- Módulo DS1302 RTC:
- Módulo de teclado de matriz 4 * 4:
- Tela LCD I2C:
- Módulo de campainha ou a campainha de 2 pinos:
Caso você esteja preso em algo, pode verificar estes tutoriais anteriores sobre os módulos acima:
Como configurar o módulo DS1302 RTC com teclado + Arduino + LCD
Como usar simplesmente o módulo DS1302 RTC com placa Arduino e tela LCD
Arduino LCD I2C de uso simples e gravação direta de monitor serialArduino LCD I2C de uso simples e gravação direta de monitor serial
Arduino uno + Matriz de teclado 4 × 4 + tela LCD i2c
Como usar um alto-falante buzzer / piezo com Arduino
Fiação:

Bibliotecas e código:
Biblioteca LCD i2c Você pode escolher esta ou baixar a sua própria
Biblioteca do teclado Ou você pode baixá-lo do Arduino IDE
Biblioteca virtuabotix RTC DS1302
Código:
Baixar código
O funcionamento do código é muito simples, depois de conectar o módulo, você pode pressionar “*” para definir a hora e a data no DS1302 RTC, o display mostrará o dia e a hora atuais se você quiser definir o alarme, pressione “A” e você pode definir a hora e o minuto, e você pode desativá-lo pressionando “B” antes da hora ou pressionando qualquer botão enquanto toca.
Espero que gostem, qualquer problema pode entrar em contato comigo.
Código
- RTC_alarm_clock_LCD.ino
RTC_alarm_clock_LCD.ino Arduino
Funciona com UNO + RTC DS1302 + LCD i2c + teclado 4x4(Principais alterações feitas em 04/12/18 para resolver alguns problemas)
// Este código deve ser usado com o módulo DS1302 RTC + teclado 4 * 4 + LCD i2c + Arduino + Buzzer // Após conectar os módulos, o LCD irá mostre a data e hora padrão ou aquela configurada antes // O objetivo deste projeto é que você possa configurar o módulo RTC a partir do teclado, e ter certeza que ficará armazenado // Em seguida, mostre-o na tela e depois você pode configurar seu alarm.//Consulte o canal Surtrtech.com ou SurtrTech no YouTube para obter mais informações # include// Bibliotecas necessárias # include #include #include #define I2C_ADDR 0x27 // LCD i2c stuff # define BACKLIGHT_PIN 3 # define En_pin 2 # define Rw_pin 1 # define Rs_pin 0 # define D4_pin 4 # define D5_pin 5 # define D6_pin 6 # define D7_pin 7LiquidCrystal_I2C lcd (I2C_ADDR_pin_pin, Rwpin_pin, Rwpin, Dwpin 4 , D5_pin, D6_pin, D7_pin); virtuabotixRTC myRTC (2, 3, 4); // Fiação do RTC (CLK, DAT, RST) // Se você mudar a fiação, troque os pinos aqui também pelo byte numRows =4; // número de linhas no tecladoconst byte numCols =4; // número de colunas no teclado // mapa de teclado define a tecla pressionada de acordo com a linha e colunas, assim como aparece no mapa de teclado do teclado numérico [numRows] [numCols] ={{'1', '2', '3', ' A '}, {' 4 ',' 5 ',' 6 ',' B '}, {' 7 ',' 8 ',' 9 ',' C '}, {' * ',' 0 ',' # ',' D '}}; byte rowPins [numRows] ={12,11,10,9}; // Linhas 0 a 3 // se você modificar seus pinos, você deve modificar este toobyte colPins [numCols] ={8,7,6,5}; // Colunas 0 a 3int i1, i2, i3, i4; char c1, c2, c3, c4; char keypressed, keypressedx; int A_hour =NULL; int A_minute =NULL; int AlarmIsActive =NULL; int buzzer =13; Keypad myKeypad =Teclado (makeKeymap (mapa de teclado), rowPins, colPins, numRows, numCols); void setup () {Serial.begin (9600); lcd.begin (16,2); // Inicializa o LCD lcd.setBacklightPin (BACKLIGHT_PIN, POSITIVE); lcd.setBacklight (HIGH); lcd.home (); } void loop () {while (keypressed ==NO_KEY) {// Enquanto nenhuma tecla for pressionada, continuamos exibindo a data e a hora, sou obrigado a limpar a tela todas as vezes para que os números não se confundam // E devo adicionar esse pequeno atraso para que a tela seja exibida corretamente, caso contrário, não funcionou para mim keypressed =myKeypad.getKey (); lcd.clear (); // Aqui, após limpar o LCD, pegamos o tempo do módulo e o imprimimos na tela com as funções normais do LCD myRTC.updateTime (); if (myRTC.hours ==A_hour &&myRTC.minutes ==A_minute &&AlarmIsActive ==1 &&myRTC.seconds> =0 &&myRTC.seconds <=2) {while (keypressedx ==NO_KEY) {tone (buzzer, 1000); // Você pode modificar o tom ou fazer seu próprio atraso de som (100); tom (campainha, 2000); atraso (100); lcd.clear (); lcd.print ("Levante-se !!!"); // Mensagem para mostrar quando o alarme está tocando keypressedx =myKeypad.getKey (); }} keypressedx =NO_KEY; noTone (campainha); lcd.setCursor (0,0); lcd.print (myRTC.dayofmonth); lcd.print ("/"); lcd.print (myRTC.month); lcd.print ("/"); lcd.print (myRTC.ano); lcd.setCursor (0,1); lcd.print (myRTC.hours); lcd.print (":"); lcd.print (myRTC.minutos); lcd.print (":"); lcd.print (myRTC.segundos); atraso (100); } if (keypressed =='*') // Como sempre verificamos a tecla pressionada, só procedemos à configuração se pressionarmos "*" {lcd.clear (); lcd.print ("Configuração"); atraso (1000); lcd.clear (); lcd.print ("ano de instalação"); // Para que você possa entender como isso funciona, primeiro ele nos mostra "configuração" e depois imprime "ano de configuração" e agora você pode escrever seu ano normalmente (2-0-1-8) // Passa automaticamente para configurar o mês ... até que termine // As chaves do teclado são todas consideradas caracteres (c), então devemos convertê-las para int foi o que eu fiz e então as armazenamos (i) // Fazemos algumas contas e obtemos o ano, mês ... como int para que possamos injetá-los no RTC, caso contrário, não será compilado // Meses como abril você deve escrever 04, 03 para março ... caso contrário, não passará para o próximo parâmetro // O virtuabotix do RTC a biblioteca já está configurada para não aceitar hora e datas estranhas (45/17/1990) (58:90:70), e sim datas antigas são consideradas como erros char keypressed2 =myKeypad.waitForKey (); if (keypressed2! =NO_KEY &&keypressed2! ='*' &&keypressed2! ='#' &&keypressed2! ='A' &&keypressed2! ='B' &&keypressed2! ='C' &&keypressed2! ='D') { c1 =pressionado 2; lcd.setCursor (0, 1); lcd.print (c1); } char keypressed3 =myKeypad.waitForKey (); if (keypressed3! =NO_KEY &&keypressed3! ='*' &&keypressed3! ='#' &&keypressed3! ='A' &&keypressed3! ='B' &&keypressed3! ='C' &&keypressed3! ='D') { c2 =pressionado 3; lcd.setCursor (1, 1); lcd.print (c2); } char keypressed4 =myKeypad.waitForKey (); if (keypressed4! =NO_KEY &&keypressed4! ='*' &&keypressed4! ='#' &&keypressed4! ='A' &&keypressed4! ='B' &&keypressed4! ='C' &&keypressed4! ='D') { c3 =pressionado 4; lcd.setCursor (2, 1); lcd.print (c3); } char keypressed5 =myKeypad.waitForKey (); if (keypressed5! =NO_KEY &&keypressed5! ='*' &&keypressed5! ='#' &&keypressed5! ='A' &&keypressed5! ='B' &&keypressed5! ='C' &&keypressed5! ='D') { c4 =pressionado 5; lcd.setCursor (3, 1); lcd.print (c4); } i1 =(c1-48) * 1000; // as teclas pressionadas são armazenadas em caracteres, eu as converto para int e, em seguida, multipliquei para obter o código como um int de xxxx i2 =(c2-48) * 100; i3 =(c3-48) * 10; i4 =c4-48; int N_ano =i1 + i2 + i3 + i4; atraso (500); lcd.clear (); lcd.print ("Setup month"); ////////////////////////////////////////// //////////////////////////// char keypressed6 =myKeypad.waitForKey (); // aqui todos os programas são interrompidos até que você insira os quatro dígitos, então ele é comparado ao código acima if (keypressed6! =NO_KEY &&keypressed6! ='*' &&keypressed6! ='#' &&keypressed6! ='A' &&keypressed6 ! ='B' &&keypressed6! ='C' &&keypressed6! ='D') {c1 =keypressed6; lcd.setCursor (0, 1); lcd.print (c1); } char keypressed7 =myKeypad.waitForKey (); if (keypressed7! =NO_KEY &&keypressed7! ='*' &&keypressed7! ='#' &&keypressed7! ='A' &&keypressed7! ='B' &&keypressed7! ='C' &&keypressed7! ='D') { c2 =pressionado 7; lcd.setCursor (1, 1); lcd.print (c2); } i1 =(c1-48) * 10; i2 =c2-48; int N_mês =i1 + i2; atraso (500); lcd.clear (); lcd.print ("Dia de configuração"); //////////////////////////////////////////////////////// ////////////// char keypressed8 =myKeypad.waitForKey (); // aqui todos os programas são interrompidos até que você insira os quatro dígitos, então ele é comparado ao código acima if (keypressed8! =NO_KEY &&keypressed8! ='*' &&keypressed8! ='#' &&keypressed8! ='A' &&keypressed8 ! ='B' &&keypressed8! ='C' &&keypressed8! ='D') {c1 =keypressed8; lcd.setCursor (0, 1); lcd.print (c1); } char keypressed9 =myKeypad.waitForKey (); if (keypressed9! =NO_KEY &&keypressed9! ='*' &&keypressed9! ='#' &&keypressed9! ='A' &&keypressed9! ='B' &&keypressed9! ='C' &&keypressed9! ='D') { c2 =pressionado 9; lcd.setCursor (1, 1); lcd.print (c2); } i1 =(c1-48) * 10; i2 =c2-48; int N_day =i1 + i2; atraso (500); lcd.clear (); lcd.print ("Setup hour"); ////////////////////////////////////////// //////////////////////////////////////////////////:char keypressed10 =myKeypad. waitForKey (); // aqui todos os programas são interrompidos até que você insira os quatro dígitos, então ele é comparado ao código acima if (keypressed10! =NO_KEY &&keypressed10! ='*' &&keypressed10! ='#' &&keypressed10! ='A' &&keypressed10 ! ='B' &&keypressed10! ='C' &&keypressed10! ='D') {c1 =keypressed10; lcd.setCursor (0, 1); lcd.print (c1); } char keypressed11 =myKeypad.waitForKey (); if (keypressed11! =NO_KEY &&keypressed11! ='*' &&keypressed11! ='#' &&keypressed11! ='A' &&keypressed11! ='B' &&keypressed11! ='C' &&keypressed11! ='D') { c2 =pressionado 11; lcd.setCursor (1, 1); lcd.print (c2); } i1 =(c1-48) * 10; i2 =c2-48; int N_hour =i1 + i2; atraso (500); lcd.clear (); lcd.print ("minutos de configuração"); ////////////////////////////////////////// ////////////////////////////////////////////////:char keypressed12 =myKeypad. waitForKey (); // aqui todos os programas são interrompidos até que você insira os quatro dígitos, então ele é comparado ao código acima if (keypressed12! =NO_KEY &&keypressed12! ='*' &&keypressed12! ='#' &&keypressed12! ='A' &&keypressed12 ! ='B' &&keypressed12! ='C' &&keypressed12! ='D') {c1 =keypressed12; lcd.setCursor (0, 1); lcd.print (c1); } char keypressed13 =myKeypad.waitForKey (); if (keypressed13! =NO_KEY &&keypressed13! ='*' &&keypressed13! ='#' &&keypressed13! ='A' &&keypressed13! ='B' &&keypressed13! ='C' &&keypressed13! ='D') { c2 =pressionado 13; lcd.setCursor (1, 1); lcd.print (c2); } i1 =(c1-48) * 10; i2 =c2-48; int N_minutos =i1 + i2; atraso (500); lcd.clear (); myRTC.setDS1302Time (22, N_minutos, N_horas, 1, N_dia, N_mês, N_ano); // assim que terminarmos de definir a data e hora que transferimos para os valores do módulo RTC // o 22 significa segundos, você também pode adicionar uma configuração para ele se quiser // o 1 significa o dia da semana, como longo Eu não mostro isso na tela Eu não mudo keypressed =NO_KEY; // a chave "*" é armazenada em "pressionado", então eu removo esse valor dela, caso contrário, ele me colocará na configuração novamente} //////////////////// ///////////////////////// Alarme setup ///////////////////////////// ////// if (keypressed =='A') {lcd.clear (); lcd.print ("Configuração de alarme"); atraso (1000); lcd.clear (); lcd.print ("Definir hora do alarme"); char keypressed14 =myKeypad.waitForKey (); // aqui todos os programas são interrompidos até que você insira os quatro dígitos, então ele é comparado ao código acima if (keypressed14! =NO_KEY &&keypressed14! ='*' &&keypressed14! ='#' &&keypressed14! ='A' &&keypressed14 ! ='B' &&keypressed14! ='C' &&keypressed14! ='D') {c1 =keypressed14; lcd.setCursor (0, 1); lcd.print (c1); } char keypressed15 =myKeypad.waitForKey (); if (keypressed15! =NO_KEY &&keypressed15! ='*' &&keypressed15! ='#' &&keypressed15! ='A' &&keypressed15! ='B' &&keypressed15! ='C' &&keypressed15! ='D') { c2 =pressionado 15; lcd.setCursor (1, 1); lcd.print (c2); } i1 =(c1-48) * 10; i2 =c2-48; A_hour =i1 + i2; atraso (500); lcd.clear (); lcd.print ("Definir minutos de alarme"); char keypressed16 =myKeypad.waitForKey (); // aqui todos os programas são interrompidos até que você insira os quatro dígitos, em seguida, ele é comparado ao código acima if (keypressed16! =NO_KEY &&keypressed16! ='*' &&keypressed16! ='#' &&keypressed16! ='A' &&keypressed16 ! ='B' &&keypressed16! ='C' &&keypressed16! ='D') {c1 =keypressed16; lcd.setCursor (0, 1); lcd.print (c1); } char keypressed17 =myKeypad.waitForKey (); if (keypressed17! =NO_KEY &&keypressed17! ='*' &&keypressed17! ='#' &&keypressed17! ='A' &&keypressed17! ='B' &&keypressed17! ='C' &&keypressed17! ='D') { c2 =pressionado 17; lcd.setCursor (1, 1); lcd.print (c2); } i1 =(c1-48) * 10; i2 =c2-48; A_minuto =i1 + i2; atraso (500); lcd.clear (); AlarmIsActive =1; pressionado =NO_KEY; } if (keypressed =='B') {lcd.clear (); lcd.print ("Alarme desativado"); AlarmIsActive =0; pressionado =NO_KEY; atraso (500); } else {myRTC.updateTime (); pressionado =NO_KEY; }}
Esquemas

Processo de manufatura
- Painel LCD com Arduino para o simulador de vôo
- Relógio de visão pov do Arduino
- DIY mais simples relógio IV9 Numitron com Arduino
- Simple Word Clock (Arduino)
- Relógio Arduino com horas de oração islâmica
- Relógio mestre
- Arduino Temp. Monitor e relógio em tempo real com tela 3.2
- Sensor de obstáculo simples com Arduino
- Relógio digital TM1637 com configuração de hora e funcionalidade de alarme
- Exibindo uma imagem em uma tela LCD TFT com o Arduino UNO!