Relógio digital Arduino usando módulo RTC

Experimente Nosso Instrumento Para Eliminar Problemas





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 controla a hora atual com precisão. Desempenha duas funções, comunica-se com microcontroladores e microprocessadores para dar a hora atual e atua como circuito reserva para manter a hora em caso de falha de energia, pois possui sistema de reserva de bateria integrado.

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 de circuito semelhante 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 lojas de projetos eletrônicos locais.

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

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 seja DS1307. O código escrito nesta postagem é compatível apenas com o 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 seguintes links e instalar em seu IDE:

• DS1307RTC.h

Link: github.com/PaulStoffregen/DS1307RTC

• TimeLib.h

Link: github.com/PaulStoffregen/Time

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

• LiquidCrystal.h

• Wire.h

O circuito:

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 do fio 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 de cabeçote macho e insira os pinos A2 a A5 conforme mostrado no protótipo.

Protótipo do autor:

Como inserir corretamente o RTC no Arduino:

Se o seu RTC tiver localizações de pinos diferentes e não puder replicar como ilustrado acima, você sempre pode usar fios para conexão. Agora que sua configuração de hardware está concluída, vamos passar para a parte de software do projeto.

Como definir a hora:

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

Não há nenhum botão para ajustar a hora que o programa seguinte definirá a hora em RTC. A hora é sincronizada automaticamente com a hora do seu computador, durante a compilação do código, portanto, certifique-se de que o computador esteja configurado para a hora correta antes de enviar os programas.
Carregue este código “SetTime” para definir a hora com 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 } 

Assim que este código for carregado, abra o monitor serial e uma mensagem de sucesso deve aparecer dizendo que a hora foi definida.

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-------// 

Depois de fazer isso, você verá que a hora e a data são exibidas no LCD e funcionando.

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

Despertador digital usando Arduino

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 para um circuito de despertador digital usando o Arduino.

Há algumas pessoas que não precisam de despertador, acordam naturalmente e há algumas pessoas que acordam depois que o despertador toca poucas vezes e há algumas pessoas que apertam o botão de soneca várias vezes e vão para a faculdade / trabalho até tarde com algumas desculpas.

O projeto do pequeno e divertido despertador proposto pode confrontar o problema com a preguiça durante o despertar matinal. A maioria dos despertadores tem um botão de soneca e hora limite pré-determinada para o 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 desligará até que o usuário aperte 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 mostradas no display LCD 16 x 2. Um RTC ou módulo de relógio de tempo real cuidará de rastrear a hora e pode reter a hora correta 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 consegue qualquer modelo de sua escolha, recomendamos o Arduino pro mini ou o Arduino nano por causa de seu tamanho compacto.

Agora vamos mergulhar nos esquemas.

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

A seguir está o resto do circuito:

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

Funções de 5 botões:

S1 - É usado para parar o alarme (também é botão de reset).
S2 - É usado para definir o alarme. Ao pressionar longamente S2, 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 “*” não existir, as estatísticas de alarme estão DESLIGADAS.

Mais detalhes sobre como definir o alarme são explicados no final 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.

Faça upload do 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ê configurou com sucesso a hora para RTC
Em seguida, você precisa fazer 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 no visor.

Agora vamos ver como definir o alarme:
• Pressione longamente S2 até que você possa ver o menu Alarme.
• Pressione S3 e S4 para ajustar as horas e minutos, respectivamente.
• Depois de definir o tempo desejado, pressione S2 mais uma vez. 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 por muito tempo até que “*” desapareça (ele volta novamente), basta pressionar meio segundo para alternar o status do alarme.

NOTA IMPORTANTE:

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

Para evitar 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, ao definir um alarme com este projeto, você deve definir no formato de 24 horas de 0 a 23 horas.

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

Protótipo do autor:

Você gosta deste projeto? Tem alguma dúvida a respeito deste projeto, fique à vontade para se manifestar no comentário, poderá receber uma resposta rápida.

Videoclipe:




Anterior: Circuito indicador de nível de farol para tanques de grãos da colheitadeira Próximo: 3 circuitos inversores de onda senoidal pura SG3525 de alta potência