Despertador digital baseado em Arduino

Tempo de leitura: 5 minutes

Este relógio de tempo real baseado em Arduino é um relógio digital para exibir o tempo real usando um RTC IC DS1307 que funciona no protocolo I2C. Relógio em tempo real significa que funciona mesmo após queda de energia. Quando a energia é reconectada, ele exibe o tempo real independentemente da hora e da duração em que esteve desligado. Neste projeto de despertador Arduino, usamos um módulo LCD 16×2 para exibir a hora no formato – “horas, minutos, segundos, data, mês e ano”. Uma opção de alarme também é adicionada e podemos definir a hora do alarme. Uma vez que o tempo do alarme é salvo na EEPROM interna do Arduino, ele permanece salvo mesmo após o reset ou falha elétrica. Relógios em tempo real são comumente usados ​​em nossos computadores, casas, escritórios e dispositivos eletrônicos para mantê-los atualizados com tempo real.

O protocolo I2C é um método para conectar dois ou mais dispositivos usando dois fios a um único sistema e, portanto, esse protocolo também é chamado de protocolo de dois fios. Ele pode ser usado para comunicar 127 dispositivos a um único dispositivo ou processador. A maioria dos dispositivos I2C funciona na frequência de 100 KHz.

Etapas para gravação de dados mestre em escravo (modo de recebimento escravo)

  1. Envia a condição START para o escravo.
  2. Envia o endereço do escravo para o escravo.
  3. Envie o bit de gravação (0) para o escravo.
  4. Recebido bit ACK do escravo.
  5. Envia o endereço das palavras para o escravo.
  6. Recebido bit ACK do escravo.
  7. Envia dados para o escravo.
  8. Recebido bit ACK do escravo.
  9. E por último envia a condição STOP para o escravo.

Etapas para leitura de dados do escravo ao mestre (modo de transmissão escravo)

  1. Envia a condição START para o escravo.
  2. Envia o endereço do escravo para o escravo.
  3. Envie o bit de leitura (1) para o escravo.
  4. Recebido bit ACK do escravo
  5. Dados recebidos do escravo
  6. Recebido bit ACK do escravo.
  7. Envia a condição STOP para o escravo.

Para construir este relógio digital baseado em IC RTC DS1307, usamos aqui o Arduino Pro Mini, mas você também pode usar qualquer outro modelo de Arduino, como Arduino Uno ou Arduino Nano. Junto com a placa Arduino, DS1307 RTC IC, usamos o módulo LCD 16×2 para exibir a hora e a data, um oscilador de cristal, regulador de tensão 7805, um buzzer e alguns transistores e resistores.

Diagrama de Circuito e Descrição

Neste circuito de relógio digital baseado em Arduino, usamos três componentes principais que são IC DS1307, Arduino Pro Mini Board e módulo LCD 16×2.

Aqui, o arduino é usado para ler o tempo de ds1307 e exibi-lo no LCD 16×2. DS1307 envia hora/data usando 2 linhas para o Arduino. Uma campainha também é usada para indicação de alarme, que emite um bipe quando o alarme é ativado. Um diagrama de blocos é mostrado abaixo para entender o funcionamento deste relógio em tempo real.

Como você pode ver no diagrama de circuito, os pinos SDA e SCL do chip DS1307 são conectados aos pinos SDA e SCL do Arduino com resistor pull up que mantém o valor padrão ALTO nas linhas de dados e clock. O oscilador de cristal de 32.768KHz é conectado ao chip DS1307 para gerar um atraso exato de 1 segundo, e uma bateria de 3 volts também é conectada ao pino 3 (BAT) do DS1307 que mantém o tempo funcionando após uma falha de eletricidade. O LCD 16×2 está conectado ao arduino no modo de 4 bits. Os pinos de controle RS, RW e En são conectados diretamente aos pinos 2, GND e 3 do arduino. E o pino de dados D0-D7 está conectado a 4, 5, 6, 7 do arduino. Uma campainha é conectada ao pino arduino número 13 por meio de um transistor NPN BC547 com um resistor de 1 k em sua base.

Três botões definidos, INC e Next são usados ​​para definir o alarme para os pinos 12, 11 e 10 do Arduino no modo ativo baixo. Quando pressionamos definir, o modo de definição de alarme é ativado e agora precisamos definir o alarme usando o botão INC e o botão Avançar é usado para mover para o dígito. A configuração completa do ProtoBoard deste relógio em tempo real com alarme é mostrada na imagem abaixo.

 

Descrição do Programa

Para programar para este relógio de tempo real, usamos algumas bibliotecas para extrair hora/data do DS1307 e para exibir no LCD, que são fornecidas a seguir:

#include <Wire.h>
#include<EEPROM.h>
#include <RTClib.h>
#include <LiquidCrystal.h>

E a inicialização do RTC, LCD e saída de entrada são realizadas no loop de configuração.

void setup()
{
  Wire.begin();
  RTC.begin();
  lcd.begin(16,2);
  pinMode(INC, INPUT);
  pinMode(next, INPUT);
  pinMode(set_mad, INPUT);
  pinMode(buzzer, OUTPUT);
  digitalWrite(next, HIGH);
  digitalWrite(set_mad, HIGH);
  digitalWrite(INC, HIGH);

Resto de coisas como tempo de leitura, configuração de alarme é executado na seção de loop vazio.

lcd.print("Time:");
lcd.setCursor(6,0);
lcd.print(HOUR=now.hour(),DEC); 
lcd.print(":");
lcd.print(MINUT=now.minute(),DEC);
lcd.print(":");
lcd.print(SECOND=now.second(),DEC);

 

Código

/* ----- Programa C para Despertador baseado em Arduino ---- */

#include <Wire.h>
#include<EEPROM.h>
#include <RTClib.h>
#include <LiquidCrystal.h>

LiquidCrystal lcd(3, 2, 4, 5, 6, 7); 
RTC_DS1307 RTC;
int temp,inc,hours1,minut,add=11;

int next=10;    
int INC=11;
int set_mad=12;
#define buzzer 13

int HOUR,MINUT,SECOND;

void setup()
{
 Wire.begin();
 RTC.begin();
 lcd.begin(16,2);
 pinMode(INC, INPUT);
 pinMode(next, INPUT);
 pinMode(set_mad, INPUT);
 pinMode(buzzer, OUTPUT);
 digitalWrite(next, HIGH);
 digitalWrite(set_mad, HIGH);
 digitalWrite(INC, HIGH);
 lcd.setCursor(0,0);
 lcd.print("Relógio de tempo real");
 lcd.setCursor(0,1);
 lcd.print("CAPSistema ");
 delay(2000);
    
 if(!RTC.isrunning())
 {
    RTC.adjust(DateTime(__DATE__,__TIME__));
 }
}
 
void loop()
{
  int temp=0,val=1,temp4;
  DateTime now = RTC.now();
  if(digitalRead(set_mad) == 0)      //definir a hora do alarme
  { 
    lcd.setCursor(0,0);
    lcd.print("  Set Alarm  ");
    delay(2000);
    defualt();
    time();
    delay(1000);
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("  Hora do alarme ");
    lcd.setCursor(0,1);
    lcd.print(" foi definido  ");
    delay(2000);
 }
 lcd.clear();
 lcd.setCursor(0,0);
 lcd.print("Time:");
 lcd.setCursor(6,0);
 lcd.print(HOUR=now.hour(),DEC); 
 lcd.print(":");
 lcd.print(MINUT=now.minute(),DEC);
 lcd.print(":");
 lcd.print(SECOND=now.second(),DEC);
 lcd.setCursor(0,1);
 lcd.print("Date: ");
 lcd.print(now.day(),DEC);
 lcd.print("/");
 lcd.print(now.month(),DEC);
 lcd.print("/");
 lcd.print(now.year(),DEC);
 match();
 delay(200);
}

void defualt()
{
  lcd.setCursor(0,1);
  lcd.print(HOUR);
  lcd.print(":");
  lcd.print(MINUT);
  lcd.print(":");
  lcd.print(SECOND);
}

/*Função para definir a hora do alarme e a hora de alimentação no eeprom interno*/
void time()                             
{
    int temp=1,minuts=0,hours=0,seconds=0;
    while(temp==1)
    {
      if(digitalRead(INC)==0)
      {
        HOUR++;
        if(HOUR==24)
        {
          HOUR=0;
        }
        while(digitalRead(INC)==0);
      }
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("Definir hora do alarme ");
      //lcd.print(x); 
      lcd.setCursor(0,1);
      lcd.print(HOUR);
      lcd.print(":");
      lcd.print(MINUT);
      lcd.print(":");
      lcd.print(SECOND);
      delay(100);
      if(digitalRead(next)==0)
      {
        hours1=HOUR;
        EEPROM.write(add++,hours1);
        temp=2;
        while(digitalRead(next)==0);
      }
    }
    
    while(temp==2)
    {
      if(digitalRead(INC)==0)
      {
        MINUT++;
        if(MINUT==60) {MINUT=0;}
        while(digitalRead(INC)==0);
      }
      // lcd.clear();
      lcd.setCursor(0,1);
      lcd.print(HOUR);
      lcd.print(":");
      lcd.print(MINUT);
      lcd.print(":");
      lcd.print(SECOND);
      delay(100);
      if(digitalRead(next)==0)
      {
        minut=MINUT;
        EEPROM.write(add++, minut);
        temp=0;
        while(digitalRead(next)==0);
      }
    }
    delay(1000);
}

/* Função para verificar o tempo de medicação */
void match()
{
  int tem[17];
  for(int i=11;i<17;i++)
  {
    tem[i]=EEPROM.read(i);
  }
  if(HOUR == tem[11] && MINUT == tem[12]) 
  {
   beep();
   beep();
   beep();
   beep();
   lcd.clear();
   lcd.print("Acordar........");
   lcd.setCursor(0,1);
   lcd.print("Acordar.......");
   beep();
   beep();
   beep();
   beep();
  }
}

/* função para indicação de campainha */
void beep()
{
   digitalWrite(buzzer,HIGH);
   delay(500);
   digitalWrite(buzzer, LOW);
   delay(500);
}