Projetos de circuito eletrônicoProjetos de engenharia do ArduinoRelógio digital Arduino usando o módulo RTC

Relógio digital Arduino usando o módulo RTC

Relacionados

Neste post vamos construir um relógio digital usando o módulo RTC ou Real Time Clock. Vamos entender o que é o módulo “RTC”, como fazer a interface com o Arduino e o que ele faz.

De:

O módulo RTC é um circuito que mantém o controle do tempo atual com precisão. Ele tem duas funções, ele se comunica com microcontroladores e microprocessadores para dar tempo de corrente e atuar como circuito de backup para manter o tempo em caso de falta de energia, pois possui sistema de backup de bateria embutido.

Podemos encontrar RTC em qualquer dispositivo eletrônico onde o tempo é uma função importante do gadget.

Por exemplo, nosso computador ou laptop mantém seu tempo mesmo depois que a energia é desligada ou a bateria é removida. Na placa-mãe de qualquer computador podemos encontrar uma bateria CMOS, que alimenta o circuito RTC.

Tipo semelhante de circuito que vamos usar neste projeto.

O módulo RTC é um dispositivo barato que pode ser encontrado em qualquer site de comércio eletrônico e nas lojas de projetos eletrônicos locais.

Ilustração do módulo RTC típico DS1307:

IMG 6243837FD3C77

IMG 62438380867EE

A maioria dos módulos RTC vem com bateria (CR2032) no momento da compra. Existem diferentes tamanhos e modelos, o ilustrado acima pode não ser o mesmo para você. Mas certifique-se de que o número do modelo é DS1307. O código escrito neste post é compatível apenas com DS1307.

Agora você sabe algo sobre RTCs. Agora vamos passar para o design do relógio digital. Antes de prosseguir com este projeto, você precisa baixar a biblioteca dos links a seguir e instalar em seu IDE:

• DS1307RTC.h

Link: github.com/PaulStoffregen/DS1307RTC

• TimeLib.h

Link: github.com/PaulSoffregen/Time

Outras duas bibliotecas teriam sido pré-instaladas no Arduino IDE, se você estiver na versão mais recente.

• LiquidCrystal.h

• Fio.h

O circuito:

IMG 62438380B4B7E

A conexão do circuito entre o arduino e o display LCD é padrão, que podemos encontrar conexão semelhante em outros projetos baseados em LCD. O único componente adicional é o RTC.

Para reduzir o congestionamento de fios durante o protótipo, o RTC pode ser inserido nos pinos analógicos diretamente do arduino. Solde o SCl, SDA, Vcc e GND com pinos machos e insira os pinos A2 a A5 conforme mostrado no protótipo.

Protótipo do autor:

IMG 62438380F136E

Como inserir corretamente o RTC no Arduino:

IMG 624383814340F

Se o seu RTC tiver locais de pinos diferentes e não puder replicar conforme ilustrado acima, você sempre poderá usar fios para conexão. Agora que sua configuração de hardware está completa, vamos para a parte de software do projeto.

Como definir o tempo:

Uma vez programado o módulo RTC, ele mantém o tempo mesmo sendo removido do arduino. A bateria deve durar pelo menos alguns anos.

Não há botão para ajustar o tempo; o programa a seguir definirá a hora no RTC. A hora é sincronizada automaticamente com a hora do seu computador, durante a compilação do código, portanto, certifique-se de que seu computador esteja configurado para a hora correta, antes de fazer o upload dos programas.
Carregue este código “SetTime” para definir a hora com o RTC conectado:

#include 

#include 

#include 

int P=A3; //Assign power pins for RTC

int N=A2;

const char *monthName[12] = {

"Jan", "Feb", "Mar", "Apr", "May", "Jun",

"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"

};

tmElements_t tm;

void setup() {

pinMode(P,OUTPUT);

pinMode(N,OUTPUT);

digitalWrite(P,HIGH);

digitalWrite(N,LOW);

bool parse=false;

bool config=false;

// get the date and time the compiler was run

if (getDate(__DATE__) && getTime(__TIME__)) {

parse = true;

// and configure the RTC with this info

if (RTC.write(tm)) {

config = true;

}

}

Serial.begin(9600);

while (!Serial) ; // wait for Arduino Serial Monitor

delay(200);

if (parse && config) {

Serial.print("DS1307 configured Time=");

Serial.print(__TIME__);

Serial.print(", Date=");

Serial.println(__DATE__);

} else if (parse) {

Serial.println("DS1307 Communication Error :-{");

Serial.println("Please check your circuitry");

} else {

Serial.print("Could not parse info from the compiler, Time=\"");

Serial.print(__TIME__);

Serial.print("\", Date=\"");

Serial.print(__DATE__);

Serial.println("\"");

}

}

void loop() {

}

bool getTime(const char *str)

{

int Hour, Min, Sec;

if (sscanf(str, "%d:%d:%d", &Hour, &Min, &Sec) != 3) return false;

tm.Hour = Hour;

tm.Minute = Min;

tm.Second = Sec;

return true;

}

bool getDate(const char *str)

{

char Month[12];

int Day, Year;

uint8_t monthIndex;

if (sscanf(str, "%s %d %d", Month, &Day, &Year) != 3) return false;

for (monthIndex = 0; monthIndex < 12; monthIndex++) {

if (strcmp(Month, monthName[monthIndex]) == 0) break;

}

if (monthIndex >= 12) return false;

tm.Day = Day;

tm.Month = monthIndex + 1;

tm.Year = CalendarYrToTm(Year);

return true;

}

Uma vez que este código é carregado, abra o monitor serial e uma mensagem de sucesso deve aparecer dizendo que o tempo foi definido.

Isso significa que sua conexão entre o RTC e o arduino está correta e a hora está definida.

Agora carregue o seguinte código para exibir a hora no LCD.

//------------Program Developed by R.Girish-------//

#include 

#include 

#include 

#include 

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

int P=A3;

int N=A2;

void setup() {

lcd.begin(16,2);

pinMode(P,OUTPUT);

pinMode(N,OUTPUT);

digitalWrite(P,HIGH);

digitalWrite(N,LOW);

}

void loop() {

tmElements_t tm;

lcd.clear();

if (RTC.read(tm))

{

if(tm.Hour>=12)

{

lcd.setCursor(14,0);

lcd.print("PM");

}

if(tm.Hour<12)

{

lcd.setCursor(14,0);

lcd.print("AM");

}

lcd.setCursor(0,0);

lcd.print("TIME:");

if(tm.Hour>12) //24Hrs to 12 Hrs conversion//

{

if(tm.Hour==13) lcd.print("01");

if(tm.Hour==14) lcd.print("02");

if(tm.Hour==15) lcd.print("03");

if(tm.Hour==16) lcd.print("04");

if(tm.Hour==17) lcd.print("05");

if(tm.Hour==18) lcd.print("06");

if(tm.Hour==19) lcd.print("07");

if(tm.Hour==20) lcd.print("08");

if(tm.Hour==21) lcd.print("09");

if(tm.Hour==22) lcd.print("10");

if(tm.Hour==23) lcd.print("11");

}

else

{

lcd.print(tm.Hour);

}

lcd.print(":");

lcd.print(tm.Minute);

lcd.print(":");

lcd.print(tm.Second);

lcd.setCursor(0,1);

lcd.print("DATE:");

lcd.print(tm.Day);

lcd.print("/");

lcd.print(tm.Month);

lcd.print("/");

lcd.print(tmYearToCalendar(tm.Year));

} else {

if (RTC.chipPresent()) {

lcd.setCursor(0,0);

lcd.print("RTC stopped!!!");

lcd.setCursor(0,1);

lcd.print("Run SetTime code");

} else {

lcd.clear();

lcd.setCursor(0,0);

lcd.print("Read error!");

lcd.setCursor(0,1);

lcd.print("Check circuitry!");

}

delay(500);

}

delay(500);

}


//------------Program Developed by R.Girish-------//

Feito isso, você deverá ver a hora e a data exibidas no LCD e funcionando.

Observação: O código “SetTime” é modificado a partir do código de exemplo do DS1307RTC para otimizar as conexões de fio para o módulo RTC, o carregamento do código original não definirá o tempo.

Despertador digital usando Arduino

Neste acima aprendemos como construir o relógio básico do Arduino usando o módulo RTC, na seção seguinte investigamos como isso pode ser atualizado em um circuito de despertador digital usando o Arduino.

Tem gente que não precisa de despertador, acorda naturalmente e tem gente que acorda depois que o despertador toca poucas vezes e tem gente que aperta o botão soneca várias vezes e vai para a faculdade/trabalho até tarde com algumas desculpas.

O divertido projeto de despertador proposto pode enfrentar o problema da preguiça durante a vigília matinal. A maioria dos despertadores tem um botão de soneca e um tempo de corte pré-determinado para alarme se o usuário não responder.

Projetamos este despertador sem um botão preguiçoso (botão soneca) e o alarme não será desligado até que o usuário pressione um botão.

Este relógio pode mostrar a hora no formato de 12 horas e a data no formato DD/MM/AAAA.

A hora e a data serão exibidas no display LCD 16 x 2. Um módulo de tempo RTC ou relógio de tempo real cuidará do rastreamento do tempo e pode reter o tempo correto mesmo após um longo corte de energia.

Existem 5 botões fornecidos cuja função será explicada em breve. O cérebro do projeto Arduino pode ser qualquer modelo de sua escolha, recomendamos o Arduino pro mini ou o Arduino nano devido ao seu tamanho compacto.

Agora vamos mergulhar nos esquemas.

IMG 624383817740D

O esquema acima é para o Arduino para exibir a conexão, ajuste o contraste da tela girando o potenciômetro de 10K.

Abaixo segue o resto do circuito:

O circuito pode ser alimentado por adaptador de parede de 9V 500mA.

IMG 62438381A78A9

Funções de 5 botões:

S1 – Serve para parar o alarme (também é botão de reset).
S2 – É usado para configurar alarme. Ao pressionar S2 longamente, você chegará ao menu de configuração de alarme.
S3 – É utilizado para incrementar horas.
S4 – é usado para incrementar minutos.
S5 – É usado para alternar o status do alarme. Se “*” existir no visor LCD no canto inferior direito, o alarme está LIGADO, se o “*” não existir, as estatísticas do alarme estão DESLIGADAS.

Mais detalhes sobre como definir o alarme são explicados na parte inferior do artigo.

Baixe os arquivos da biblioteca abaixo:

Link1: github.com/PaulStoffregen/DS1307RTC
Link2: github.com/PaulStoffregen/Time

Agora, temos que definir a hora para o módulo RTC, a hora será sincronizada do seu PC para o módulo RTC.

Carregue o código abaixo para definir a hora e abrir o monitor Serial:

//------------------------------------------------//
#include 
#include 
#include 
const char *monthName[12] = {
"Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
};
tmElements_t tm;
void setup() {
bool parse=false;
bool config=false;
// get the date and time the compiler was run
if (getDate(__DATE__) && getTime(__TIME__)) {
parse = true;
// and configure the RTC with this info
if (RTC.write(tm)) {
config = true;
}
}
Serial.begin(9600);
while (!Serial) ; // wait for Arduino Serial Monitor
delay(200);
if (parse && config) {
Serial.print("DS1307 configured Time=");
Serial.print(__TIME__);
Serial.print(", Date=");
Serial.println(__DATE__);
} else if (parse) {
Serial.println("DS1307 Communication Error :-{");
Serial.println("Please check your circuitry");
} else {
Serial.print("Could not parse info from the compiler, Time=\"");
Serial.print(__TIME__);
Serial.print("\", Date=\"");
Serial.print(__DATE__);
Serial.println("\"");
}
}
void loop() {
}
bool getTime(const char *str)
{
int Hour, Min, Sec;
if (sscanf(str, "%d:%d:%d", &Hour, &Min, &Sec) != 3) return false;
tm.Hour = Hour;
tm.Minute = Min;
tm.Second = Sec;
return true;
}
bool getDate(const char *str)
{
char Month[12];
int Day, Year;
uint8_t monthIndex;
if (sscanf(str, "%s %d %d", Month, &Day, &Year) != 3) return false;
for (monthIndex = 0; monthIndex < 12; monthIndex++) {
if (strcmp(Month, monthName[monthIndex]) == 0) break;
}
if (monthIndex >= 12) return false;
tm.Day = Day;
tm.Month = monthIndex + 1;
tm.Year = CalendarYrToTm(Year);
return true;
}
//----------------------------------------//

Agora você definiu com sucesso o tempo para RTC
Em seguida, você precisa fazer o upload do seguinte código principal:

//------------Program Developed by R.Girish-------//
#include 
#include 
#include 
#include 
#include 
const int rs = 7;
const int en = 6;
const int d4 = 5;
const int d5 = 4;
const int d6 = 3;
const int d7 = 2;
const int buzzer = 8;
boolean alarm = false;
boolean outloop = true;
const int setAlarm = A0;
const int Hrs = A1;
const int Min = A2;
const int ok = A3;
const int HrsADD = 0;
const int MinADD = 1;
const int ALsave = 2;
int HrsVal = 0;
int MinVal = 0;
int H = 0;
int M = 0;
int S = 0;
int i = 0;
int j = 0;
int k = 0;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
void setup()
{
Serial.begin(9600);
lcd.begin(16, 2);
pinMode(buzzer, OUTPUT);
pinMode(setAlarm, INPUT);
pinMode(Hrs, INPUT);
pinMode(Min, INPUT);
pinMode(ok, INPUT);
digitalWrite(setAlarm, HIGH);
digitalWrite(Hrs, HIGH);
digitalWrite(Min, HIGH);
digitalWrite(ok, HIGH);
}
void loop()
{
tmElements_t tm;
lcd.clear();
if (EEPROM.read(ALsave) == false)
{
lcd.setCursor(15, 1);
lcd.print("");
}
if (EEPROM.read(ALsave) == true)
{
lcd.setCursor(15, 1);
lcd.print(F("*"));
}
if (RTC.read(tm))
{
if (tm.Hour >= 12)
{
lcd.setCursor(14, 0);
lcd.print("PM");
}
if (tm.Hour < 12)
{
lcd.setCursor(14, 0);
lcd.print("AM");
}
lcd.setCursor(0, 0);
lcd.print("TIME:");
H = tm.Hour;
if (tm.Hour > 12)
{
if (tm.Hour == 13)
{
lcd.print("01");
}
if (tm.Hour == 14)
{
lcd.print("02");
}
if (tm.Hour == 15)
{
lcd.print("03");
}
if (tm.Hour == 16)
{
lcd.print("04");
}
if (tm.Hour == 17)
{
lcd.print("05");
}
if (tm.Hour == 18)
{
lcd.print("06");
}
if (tm.Hour == 19)
{
lcd.print("07");
}
if (tm.Hour == 20)
{
lcd.print("08");
}
if (tm.Hour == 21)
{
lcd.print("09");
}
if (tm.Hour == 22)
{
lcd.print("10");
}
if (tm.Hour == 23)
{
lcd.print("11");
}
}
else
{
lcd.print(tm.Hour);
}
M = tm.Minute;
S = tm.Second;
lcd.print(":");
lcd.print(tm.Minute);
lcd.print(":");
lcd.print(tm.Second);
lcd.setCursor(0, 1);
lcd.print("DATE:");
lcd.print(tm.Day);
lcd.print("/");
lcd.print(tm.Month);
lcd.print("/");
lcd.print(tmYearToCalendar(tm.Year));
} else {
if (RTC.chipPresent())
{
lcd.setCursor(0, 0);
lcd.print("RTC stopped!!!");
lcd.setCursor(0, 1);
lcd.print("Run SetTime code");
} else {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Read error!");
lcd.setCursor(0, 1);
lcd.print("Check circuitry!");
}
}
if (digitalRead(setAlarm) == LOW)
{
setALARM();
}
if (H == EEPROM.read(HrsADD) && M == EEPROM.read(MinADD) && S == 0)
{
if (EEPROM.read(ALsave) == true)
{
sound();
}
}
if (digitalRead(ok) == LOW)
{
if (EEPROM.read(ALsave) == true) 
{
EEPROM.write(ALsave, 0);
alarm = false;
delay(1000);
return;
}
if (EEPROM.read(ALsave) == false)
{
EEPROM.write(ALsave, 1);
alarm = true;
delay(1000);
return;
}
}
delay(1000);
}
void setALARM()
{
HrsVal = EEPROM.read(HrsADD);
MinVal = EEPROM.read(MinADD);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(F(">>>>SET ALARM<<<"));
lcd.setCursor(0, 1);
lcd.print(F("Hrs:"));
lcd.print(EEPROM.read(HrsADD));
lcd.print(F(" Min:"));
lcd.print(EEPROM.read(MinADD));
delay(600);
while (outloop)
{
if (HrsVal > 23)
{
HrsVal = 0;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(F(">>>>SET ALARM<<<"));
lcd.setCursor(0, 1);
lcd.print(F("Hrs:"));
lcd.print(HrsVal);
lcd.print(F(" Min:"));
lcd.print(MinVal);
}
if (MinVal > 59)
{
MinVal = 0;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(F(">>>>SET ALARM<<<"));
lcd.setCursor(0, 1);
lcd.print(F("Hrs:"));
lcd.print(HrsVal);
lcd.print(F(" Min:"));
lcd.print(MinVal);
}
if (digitalRead(Hrs) == LOW)
{
HrsVal = HrsVal + 1;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(F(">>>>SET ALARM<<<"));
lcd.setCursor(0, 1);
lcd.print(F("Hrs:"));
lcd.print(HrsVal);
lcd.print(F(" Min:"));
lcd.print(MinVal);
delay(250);
}
if (digitalRead(Min) == LOW)
{
MinVal = MinVal + 1;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(F(">>>>SET ALARM<<<"));
lcd.setCursor(0, 1);
lcd.print(F("Hrs:"));
lcd.print(HrsVal);
lcd.print(F(" Min:"));
lcd.print(MinVal);
delay(250);
}
if (digitalRead(setAlarm) == LOW)
{
EEPROM.write(HrsADD, HrsVal);
EEPROM.write(MinADD, MinVal);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(F("Alarm is Set for"));
lcd.setCursor(0, 1);
lcd.print(EEPROM.read(HrsADD));
lcd.print(F(":"));
lcd.print(EEPROM.read(MinADD));
lcd.print(F(" Hrs"));
delay(1000);
outloop = false;
}
}
outloop = true;
}
void sound()
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Wakey Wakey !!!");
lcd.setCursor(0, 1);
lcd.print("Its Time now.....");
for (j = 0; j < 10; j++)
{
for (i = 0; i < 2 ; i++)
{
digitalWrite(buzzer, HIGH);
delay(150);
digitalWrite(buzzer, LOW);
delay(150);
}
delay(400);
}
for (k = 0; k < 10; k++)
{
for (i = 0; i < 4 ; i++)
{
digitalWrite(buzzer, HIGH);
delay(150);
digitalWrite(buzzer, LOW);
delay(150);
}
delay(250);
}
while (true)
{
digitalWrite(buzzer, HIGH);
delay(150);
digitalWrite(buzzer, LOW);
delay(150);
}
}
//------------Program Developed by R.Girish-------//

Depois de fazer o upload do código acima, você deve ver a hora e a data corretas em execução no visor.

Agora vamos ver como definir o alarme:
• Pressione e segure S2 até ver o menu Alarme.
• Pressione S3 e S4 para ajustar horas e minutos respectivamente.
• Após o ajuste do tempo desejado, pressione S2 novamente. Ele dirá “O alarme está definido para xx:xx horas”.
• Se o alarme estiver LIGADO você pode ver o símbolo “*” no display, se o alarme estiver DESLIGADO não haverá o símbolo “*”.
• Você pode ligar/desligar o alarme pressionando S5 por meio segundo. Não pressione e segure até que “*” desapareça (ele volta novamente), apenas pressione meio segundo para alternar o status do alarme.

NOTA IMPORTANTE:

O erro mais comum ao definir um alarme em qualquer relógio é alternar involuntariamente AM / PM, o que resulta em não tocar o alarme no horário desejado.

Para combater esse problema, a configuração do despertador proposta foi projetada no formato de relógio de 24 horas.

A hora exibida no LCD será de 12 horas no formato AM/PM mas, quando você definir um alarme com este projeto, deverá definir no formato 24 horas de 0 a 23 horas.

Por exemplo: se você deseja definir o alarme às 21h, deve definir 21 horas e 0 minutos. Para, 5 da manhã: 5 horas e 0 minutos e assim por diante.

Protótipo do autor:

IMG 62438381EC71F

Você gosta deste projeto? Tem alguma dúvida sobre este projeto, sinta-se à vontade para expressar no comentário, você pode receber uma resposta rápida.

Videoclipe:

YouTube video

Hashtags: #Relógio #digital #Arduino #usando #módulo #RTC
 

FONTE


Nota: Este conteúdo foi traduzido do Inglês para português (auto)
Pode conter erros de tradução

Olá, se tiver algum erro de tradução (AUTO), falta de link para download etc…
Veja na FONTE até ser revisado o conteúdo.
Status (Ok Até agora)


Se tiver algum erro coloque nos comentários

Mas se gostou compartilhe!!!

Relacionados

Relacionados