Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Construa um Relógio Despertador Confiável com RTC DS1302 e Arduino UNO

Componentes e Materiais

Módulo Real Time Clock (RTC) DS1302 1
Buzzer (módulo ou piezo de 2 pinos) 1
Display LCD I2C 16x2 (branco sobre azul) 1
Arduino UNO (ou compatível) 1
Teclado Matricial 4x4 1

Sobre o Projeto

Olá a todos! Neste projeto, vamos construir um relógio despertador simples usando uma placa Arduino UNO. Este projeto combina vários módulos que utilizei anteriormente; se tiver dificuldades em alguma etapa, consulte os tutoriais individuais de cada módulo no site, pois costumo trabalhar assim: testo cada parte separadamente e depois as integro.

Bibliotecas Necessárias

Ligação (Wiring)

Siga o diagrama esquemático abaixo para conectar todos os componentes. O RTC DS1302 utiliza os pinos CLK, DAT e RST (conectados aos pinos 2, 3 e 4 do Arduino, respectivamente). O teclado matricial usa os pinos 9 a 12 (linhas) e 5 a 8 (colunas). O buzzer fica no pino 13. O display LCD I2C conecta-se via I2C (A4/SDA, A5/SCL).

Construa um Relógio Despertador Confiável com RTC DS1302 e Arduino UNO

Funcionamento do Código

Após a ligação, o LCD mostrará a data e hora padrão ou a última configurada. Pressione "*" para ajustar a data e hora no RTC DS1302. O display exibirá o dia e a hora atuais. Para configurar o alarme, pressione "A" e defina hora e minuto. O alarme pode ser desativado pressionando "B" antes da hora programada ou qualquer tecla enquanto estiver tocando.

Código Fonte

O código completo está disponível para download. Abaixo, apresentamos o sketch principal com comentários explicativos.

// Relógio despertador com DS1302 RTC + Teclado 4x4 + LCD I2C + Arduino + Buzzer
// Após a ligação, o LCD mostra a data/hora padrão ou a configurada anteriormente
// Objetivo: configurar o RTC pelo teclado, armazenar permanentemente, exibir na tela e configurar alarme.
// Referência: Surtrtech.com ou canal SurtrTech no YouTube

#include <Keypad.h>
#include <Wire.h>
#include <virtuabotixRTC.h>
#include <LiquidCrystal_I2C.h>

#define I2C_ADDR 0x27
#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 7

LiquidCrystal_I2C lcd(I2C_ADDR, En_pin, Rw_pin, Rs_pin, D4_pin, D5_pin, D6_pin, D7_pin);
virtuabotixRTC myRTC(2, 3, 4); // CLK, DAT, RST

const byte numRows = 4;
const byte numCols = 4;
char keymap[numRows][numCols] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[numRows] = {12, 11, 10, 9};
byte colPins[numCols] = {8, 7, 6, 5};

int i1,i2,i3,i4;
char c1,c2,c3,c4;
char keypressed, keypressedx;
int A_hour = -1;
int A_minute = -1;
int AlarmIsActive = 0;
int buzzer = 13;

Keypad myKeypad = Keypad(makeKeymap(keymap), rowPins, colPins, numRows, numCols);

void setup() {
  Serial.begin(9600);
  lcd.begin(16, 2);
  lcd.setBacklightPin(BACKLIGHT_PIN, POSITIVE);
  lcd.setBacklight(HIGH);
  lcd.home();
}

void loop() {
  while (keypressed == NO_KEY) {
    keypressed = myKeypad.getKey();
    lcd.clear();
    myRTC.updateTime();

    // Verifica alarme
    if (myRTC.hours == A_hour && myRTC.minutes == A_minute && AlarmIsActive == 1 && myRTC.seconds >= 0 && myRTC.seconds <= 2) {
      while (keypressedx == NO_KEY) {
        tone(buzzer, 1000);
        delay(100);
        tone(buzzer, 2000);
        delay(100);
        lcd.clear();
        lcd.print("Hora de acordar!");
        keypressedx = myKeypad.getKey();
      }
    }
    keypressedx = NO_KEY;
    noTone(buzzer);

    // Exibe data e hora
    lcd.setCursor(0, 0);
    lcd.print(myRTC.dayofmonth);
    lcd.print("/");
    lcd.print(myRTC.month);
    lcd.print("/");
    lcd.print(myRTC.year);
    lcd.setCursor(0, 1);
    lcd.print(myRTC.hours);
    lcd.print(":");
    lcd.print(myRTC.minutes);
    lcd.print(":");
    lcd.print(myRTC.seconds);
    delay(100);
  }

  // Configuração de data/hora (tecla *)
  if (keypressed == '*') {
    lcd.clear();
    lcd.print(" Configuracao");
    delay(1000);
    lcd.clear();
    // Ano (4 dígitos)
    lcd.print("Ano (4 digitos)");
    char keypressed2 = myKeypad.waitForKey();
    if (isDigit(keypressed2)) { c1 = keypressed2; lcd.setCursor(0,1); lcd.print(c1); }
    char keypressed3 = myKeypad.waitForKey();
    if (isDigit(keypressed3)) { c2 = keypressed3; lcd.setCursor(1,1); lcd.print(c2); }
    char keypressed4 = myKeypad.waitForKey();
    if (isDigit(keypressed4)) { c3 = keypressed4; lcd.setCursor(2,1); lcd.print(c3); }
    char keypressed5 = myKeypad.waitForKey();
    if (isDigit(keypressed5)) { c4 = keypressed5; lcd.setCursor(3,1); lcd.print(c4); }
    i1 = (c1 - '0') * 1000;
    i2 = (c2 - '0') * 100;
    i3 = (c3 - '0') * 10;
    i4 = c4 - '0';
    int N_year = i1 + i2 + i3 + i4;
    delay(500);
    lcd.clear();

    // Mês (2 dígitos)
    lcd.print("Mes (2 digitos)");
    char keypressed6 = myKeypad.waitForKey();
    if (isDigit(keypressed6)) { c1 = keypressed6; lcd.setCursor(0,1); lcd.print(c1); }
    char keypressed7 = myKeypad.waitForKey();
    if (isDigit(keypressed7)) { c2 = keypressed7; lcd.setCursor(1,1); lcd.print(c2); }
    i1 = (c1 - '0') * 10;
    i2 = c2 - '0';
    int N_month = i1 + i2;
    delay(500);
    lcd.clear();

    // Dia (2 dígitos)
    lcd.print("Dia (2 digitos)");
    char keypressed8 = myKeypad.waitForKey();
    if (isDigit(keypressed8)) { c1 = keypressed8; lcd.setCursor(0,1); lcd.print(c1); }
    char keypressed9 = myKeypad.waitForKey();
    if (isDigit(keypressed9)) { c2 = keypressed9; lcd.setCursor(1,1); lcd.print(c2); }
    i1 = (c1 - '0') * 10;
    i2 = c2 - '0';
    int N_day = i1 + i2;
    delay(500);
    lcd.clear();

    // Hora (2 dígitos)
    lcd.print("Hora (2 digitos)");
    char keypressed10 = myKeypad.waitForKey();
    if (isDigit(keypressed10)) { c1 = keypressed10; lcd.setCursor(0,1); lcd.print(c1); }
    char keypressed11 = myKeypad.waitForKey();
    if (isDigit(keypressed11)) { c2 = keypressed11; lcd.setCursor(1,1); lcd.print(c2); }
    i1 = (c1 - '0') * 10;
    i2 = c2 - '0';
    int N_hour = i1 + i2;
    delay(500);
    lcd.clear();

    // Minutos (2 dígitos)
    lcd.print("Minutos (2 digitos)");
    char keypressed12 = myKeypad.waitForKey();
    if (isDigit(keypressed12)) { c1 = keypressed12; lcd.setCursor(0,1); lcd.print(c1); }
    char keypressed13 = myKeypad.waitForKey();
    if (isDigit(keypressed13)) { c2 = keypressed13; lcd.setCursor(1,1); lcd.print(c2); }
    i1 = (c1 - '0') * 10;
    i2 = c2 - '0';
    int N_minutes = i1 + i2;
    delay(500);
    lcd.clear();

    // Grava no RTC (segundos fixos em 0, dia da semana = 1)
    myRTC.setDS1302Time(0, N_minutes, N_hour, 1, N_day, N_month, N_year);
    keypressed = NO_KEY;
  }

  // Configuração do alarme (tecla A)
  if (keypressed == 'A') {
    lcd.clear();
    lcd.print(" Config Alarme");
    delay(1000);
    lcd.clear();
    lcd.print("Hora alarme (2 dig)");
    char keypressed14 = myKeypad.waitForKey();
    if (isDigit(keypressed14)) { c1 = keypressed14; lcd.setCursor(0,1); lcd.print(c1); }
    char keypressed15 = myKeypad.waitForKey();
    if (isDigit(keypressed15)) { c2 = keypressed15; lcd.setCursor(1,1); lcd.print(c2); }
    i1 = (c1 - '0') * 10;
    i2 = c2 - '0';
    A_hour = i1 + i2;
    delay(500);
    lcd.clear();
    lcd.print("Min alarme (2 dig)");
    char keypressed16 = myKeypad.waitForKey();
    if (isDigit(keypressed16)) { c1 = keypressed16; lcd.setCursor(0,1); lcd.print(c1); }
    char keypressed17 = myKeypad.waitForKey();
    if (isDigit(keypressed17)) { c2 = keypressed17; lcd.setCursor(1,1); lcd.print(c2); }
    i1 = (c1 - '0') * 10;
    i2 = c2 - '0';
    A_minute = i1 + i2;
    delay(500);
    lcd.clear();
    AlarmIsActive = 1;
    keypressed = NO_KEY;
  }

  // Desativar alarme (tecla B)
  if (keypressed == 'B') {
    lcd.clear();
    lcd.print("Alarme desativado");
    AlarmIsActive = 0;
    keypressed = NO_KEY;
    delay(500);
  } else {
    myRTC.updateTime();
    keypressed = NO_KEY;
  }
}

Esquemático

Construa um Relógio Despertador Confiável com RTC DS1302 e Arduino UNO

Espero que gostem! Qualquer dúvida, entre em contato.

Processo de manufatura

  1. Painel de Controle para Flight Simulator 2020 com Arduino Nano – Display LCD e CDI
  2. Relógio POV com Arduino: Construa um Display LED de Persistência de Visão
  3. Construa um Relógio Retrô Numitron com Arduino: Simples, Confiável e Eficiente
  4. Relógio de Palavras DIY com Arduino – Construa um Display Elegante de Tempo Real
  5. Relógio em Tempo Real com Arduino para Horários de Oração Islâmica
  6. Construa um Relógio Mestre LED Personalizado com Alarme – Visível a 12 Metros
  7. Monitor de Temperatura e Relógio Tempo Real com Arduino Due e Display TFT 3.2"
  8. Construa um Sensor de Obstáculos Simples com Arduino – Tutorial Fácil com LED IR e Fotodiodo
  9. Relógio Digital TM1637 com Configuração de Hora e Alarme – Prototipo Arduino Nano
  10. Como Exibir Imagens em LCD TFT 1.17" com Arduino UNO