Rellotge digital Arduino mitjançant el mòdul RTC

Proveu El Nostre Instrument Per Eliminar Problemes





En aquest post anem a construir un rellotge digital mitjançant el mòdul RTC o Rellotge en temps real. Comprendrem què és el mòdul 'RTC', com interactuar amb Arduino i què fa.

Per:



El mòdul RTC és un circuit que fa un seguiment del temps actual amb precisió. Fa dues funcions, es comunica amb microcontroladors i microprocessadors per donar temps actual i actuar com a circuit de còpia de seguretat per mantenir el temps en cas de fallada de corrent, ja que té un sistema de còpia de seguretat de bateria integrat.

Podem trobar RTC en qualsevol dispositiu electrònic on el temps sigui una funció important del gadget.



Per exemple, el nostre ordinador o portàtil manté el seu temps fins i tot després d’apagar l’alimentació o de retirar la bateria. A la placa base de qualsevol ordinador podem trobar una bateria CMOS, que alimenta el circuit RTC.

Tipus similar de circuit que farem servir en aquest projecte.

El mòdul RTC és un dispositiu econòmic que es pot trobar a qualsevol lloc de comerç electrònic i a les botigues locals de projectes electrònics.

Il·lustració del mòdul RTC típic DS1307:

La majoria dels mòduls RTC inclouen bateria (CR2032) en el moment de la compra. Hi ha diferents mides i models, és possible que les il·lustracions anteriors no siguin les mateixes per a vosaltres. Però assegureu-vos que el número de model sigui DS1307. El codi escrit en aquesta publicació només és compatible amb DS1307.

Ara ja sabeu alguna cosa sobre els RTC. Passem ara al disseny del rellotge digital. Abans de continuar amb aquest projecte, heu de descarregar la biblioteca dels enllaços següents i instal·lar-la al vostre IDE:

• DS1307RTC.h

Enllaç: github.com/PaulStoffregen/DS1307RTC

• TimeLib.h

Enllaç: github.com/PaulStoffregen/Time

Altres dues biblioteques haurien estat preinstal·lades a Arduino IDE, si teniu la versió més recent.

• LiquidCrystal.h

• Wire.h

El circuit:

La connexió de circuits entre la pantalla arduino i la pantalla LCD és estàndard, cosa que podem trobar amb connexions similars en altres projectes basats en la pantalla LCD. L'únic component addicional és el RTC.

Per reduir la congestió de cables durant el prototip, el RTC es pot inserir als pins analògics directament de l’arduino. Soldeu els SCl, SDA, Vcc i GND amb pins de capçalera masculins i inseriu-los de A2 a A5 com es mostra al prototip.

Prototip de l'autor:

Com inserir correctament RTC a Arduino:

Si el vostre RTC té diferents ubicacions de pins i no es pot replicar tal com es mostra a la imatge anterior, sempre podeu utilitzar cables per a la connexió. Ara la configuració del maquinari s’ha completat. Passem a la part de programari del projecte.

Com definir l'hora:

Un cop programat el mòdul RTC, manté el temps fins i tot quan es treu de l’arduino. La bateria ha de durar almenys un parell d’anys.

No hi ha cap botó per ajustar l'hora que el programa següent configurarà a RTC. L’hora sincronitzada automàticament amb l’hora de l’ordinador, mentre compileu el codi, assegureu-vos que l’ordinador estigui configurat per corregir l’hora abans de carregar els programes.
Pengeu aquest codi 'SetTime' per configurar l'hora amb l'RTC connectat:

#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 } 

Un cop carregat aquest codi, obriu el monitor sèrie i apareixerà un missatge d'èxit que indica que s'ha establert l'hora.

Això significa que la vostra connexió entre RTC i arduino és correcta i que s'estableix el temps.

Ara pengeu el següent codi per mostrar l'hora en pantalla 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-------// 

Un cop fet això, hauríeu de veure l'hora i la data que apareixen a la pantalla LCD i funcionen.

Nota: El codi 'SetTime' es modifica a partir del codi d'exemple de DS1307RTC per optimitzar les connexions per cable per al mòdul RTC; la càrrega del codi original no definirà l'hora.

Rellotge despertador digital mitjançant Arduino

En això anterior vam aprendre a construir el rellotge bàsic Arduino mitjançant el mòdul RTC, a la secció següent investigem com es pot actualitzar a un circuit de despertador digital mitjançant Arduino.

Hi ha persones que no necessiten despertador, es desperten de forma natural i hi ha persones que es desperten després que soni poc després el despertador i hi ha persones que premen el botó de posposar un munt de vegades i van a la universitat / treballen tard amb algunes excuses.

El divertit projecte de petit despertador proposat pot afrontar el problema amb la mandra durant la vigília del matí. La majoria de rellotges despertadors tenen un botó de posposició i un temps de tall predeterminat per a l’alarma si l’usuari no respon.

Hem dissenyat aquest despertador sense un botó gandul (botó de repetició) i l’alarma no s’apagarà fins que l’usuari no premi un botó.

Aquest rellotge pot mostrar l'hora en format de 12 hores i la data en format DD / MM / AAAA.

L’hora i la data es mostraran a la pantalla LCD de 16 x 2. Un mòdul de temps de rellotge en temps real o RTC s'encarregarà de rastrejar l'hora i pot conservar l'hora correcta fins i tot després d'un llarg tall de corrent.

Hi ha 5 botons proporcionats, la funció de la qual s’explicarà en breu. El cervell del projecte Arduino pot adaptar-se a qualsevol model que vulgueu, recomanaríem Arduino pro mini o Arduino nano per la seva mida compacta.

Ara ens endinsem en esquemes.

L'esquema anterior és que Arduino mostri la connexió, ajusteu el contrast de la pantalla girant el potenciòmetre de 10K.

A continuació es mostra la resta del circuit:

El circuit es pot alimentar amb adaptador de paret de 9V 500mA.

Funcions de 5 botons:

S1: s'utilitza per aturar l'alarma (també és un botó de reinici).
S2: s'utilitza per configurar l'alarma. Prement llargament S2 arribareu al menú de configuració d'alarma.
S3: s’utilitza per incrementar les hores.
S4: s'utilitza per incrementar minuts.
S5: s'utilitza per canviar l'estat d'alarma. Si '*' existeix a la pantalla LCD de la cantonada inferior dreta de l'alarma, està activada, si '*' no existeix, les estadístiques d'alarma estan DESACTIVADES.

A la part inferior de l'article s'explica més detall sobre com configurar l'alarma.

Baixeu-vos els fitxers de la biblioteca a continuació:

Enllaç 1: github.com/PaulStoffregen/DS1307RTC
Enllaç 2: github.com/PaulStoffregen/Time

Ara hem d’establir l’hora al mòdul RTC, l’hora es sincronitzarà des del vostre PC amb el mòdul RTC.

Pengeu el codi següent per configurar l'hora i obriu el monitor sèrie:

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

Ara heu establert correctament el temps a RTC
A continuació, heu de penjar el codi principal següent:

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

Després de penjar el codi anterior, heu de veure la data i l’hora correctes a la pantalla.

Ara veurem com configurar l'alarma:
• Premeu S2 fins que pugueu veure el menú d'alarma.
• Premeu S3 i S4 per ajustar les hores i els minuts respectivament.
• Després del temps desitjat, torneu a prémer S2. Es dirà 'L'alarma està configurada per a xx: xx hores'.
• Si l'alarma està ACTIVADA, podeu veure el símbol '*' a la pantalla, si l'alarma està DESACTIVADA, no hi haurà cap símbol '*'.
• Podeu activar / desactivar l'alarma prement S5 durant mig segon. No premeu fins que desaparegui '*' (torna a aparèixer); només cal que premeu mig segon per canviar l'estat de l'alarma.

NOTA IMPORTANT:

L’error més freqüent en establir una alarma en qualsevol rellotge és canviar involuntàriament AM / PM, cosa que provoca que no soni l’alarma a l’hora desitjada.

Per contrarestar aquest problema, la configuració de despertador proposada està dissenyada en format de rellotge de 24 hores.

L'hora que es mostra a la pantalla LCD serà de 12 hores amb el format AM / PM, però, quan configureu una alarma amb aquest projecte, heu de configurar el format de 24 hores de 0 a 23 hores.

Per exemple: si voleu configurar l'alarma a les 21:00, heu d'establir 21 hores i 0 minuts. Per a les 5 de la matinada: 5 hores i 0 minuts, etc.

Prototip de l'autor:

T'agrada aquest projecte? Si teniu alguna pregunta sobre aquest projecte, no dubteu a expressar-lo al comentari, podreu rebre una resposta ràpida.

Clip de vídeo:




Anterior: Circuit indicador de nivell de balisa per a tancs de gra per a segadores combinades Següent: 3 circuits d’inversors d’ona sinusoidal pura SG3525 d’alta potència