Orologio digitale Arduino tramite modulo RTC

Prova Il Nostro Strumento Per Eliminare I Problemi





In questo post costruiremo un orologio digitale utilizzando il modulo RTC o Real Time Clock. Capiremo cos'è il modulo “RTC”, come interfacciarsi con Arduino e cosa fa.

Di:



Il modulo RTC è un circuito che tiene traccia dell'ora corrente in modo accurato. Ha due funzioni, comunica con microcontrollori e microprocessori per fornire l'ora corrente e funge da circuito di backup per mantenere il tempo in caso di interruzione di corrente, poiché ha un sistema di backup della batteria integrato.

Possiamo trovare RTC in qualsiasi dispositivo elettronico in cui il tempo è una funzione importante del gadget.



Ad esempio, il nostro computer o laptop mantiene il suo tempo anche dopo che l'alimentazione viene scollegata o la batteria viene rimossa. Sulla scheda madre di qualsiasi computer possiamo trovare una batteria CMOS, che alimenta il circuito RTC.

Tipo di circuito simile che useremo in questo progetto.

Il modulo RTC è un dispositivo economico che può essere trovato su qualsiasi sito di e-commerce e nei negozi di progetti elettronici locali.

Illustrazione del tipico modulo RTC DS1307:

La maggior parte dei moduli RTC viene fornita con la batteria (CR2032) al momento dell'acquisto. Ci sono diverse dimensioni e modelli, quanto sopra illustrato potrebbe non essere lo stesso per te. Ma assicurati che il numero di modello sia DS1307. Il codice scritto in questo post è compatibile solo con DS1307.

Ora sai qualcosa sugli RTC. Ora passiamo al design dell'orologio digitale. Prima di procedere con questo progetto è necessario scaricare la libreria dai seguenti link e installarla sul proprio IDE:

• DS1307RTC.h

Collegamento: github.com/PaulStoffregen/DS1307RTC

• TimeLib.h

Collegamento: github.com/PaulStoffregen/Time

Altre due librerie sarebbero state preinstallate sull'IDE di Arduino, se si utilizza la versione più recente.

• LiquidCrystal.h

• Wire.h

Il circuito:

La connessione del circuito tra arduino e display LCD è standard, che possiamo trovare connessione simile su altri progetti basati su LCD. L'unico componente aggiuntivo è l'RTC.

Per ridurre la congestione del filo durante il prototipo, l'RTC può essere inserito nei pin analogici direttamente di arduino. Saldare SCl, SDA, Vcc e GND con i perni di intestazione maschio e inserirli da A2 a A5 come mostrato nel prototipo.

Prototipo dell'autore:

Come inserire correttamente RTC su Arduino:

Se il tuo RTC ha posizioni pin diverse e non è possibile replicare come illustrato sopra, puoi sempre utilizzare cavi per il collegamento. Ora che la configurazione dell'hardware è completa, passiamo alla parte software del progetto.

Come impostare l'ora:

Una volta programmato il modulo RTC, mantiene l'ora anche se viene rimosso da arduino. La batteria dovrebbe durare almeno un paio d'anni.

Non vi è alcun pulsante per regolare l'ora, il seguente programma imposterà l'ora in RTC. L'ora si sincronizza automaticamente con l'ora del tuo computer, durante la compilazione del codice, quindi assicurati che il tuo computer sia impostato sull'ora corretta, prima di caricare i programmi.
Carica questo codice 'SetTime' per impostare l'ora con RTC collegato:

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

Una volta caricato questo codice, apri il monitor seriale e dovrebbe apparire un messaggio di successo che dice che l'ora è stata impostata.

Ciò significa che la connessione tra l'RTC e arduino è corretta e l'ora è impostata.

Ora carica il seguente codice per visualizzare l'ora sul display 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-------// 

Una volta fatto questo, dovresti vedere l'ora e la data visualizzate sul display LCD e in esecuzione.

Nota: Il codice 'SetTime' viene modificato dal codice di esempio di DS1307RTC per ottimizzare i collegamenti dei cavi per il modulo RTC, il caricamento del codice originale non imposterà l'ora.

Sveglia digitale utilizzando Arduino

In questo sopra abbiamo imparato come costruire l'orologio di base di Arduino usando il modulo RTC, nella sezione seguente indaghiamo su come questo può essere aggiornato in un circuito di sveglia digitale usando Arduino.

Ci sono alcune persone che non hanno bisogno della sveglia, si svegliano naturalmente e ci sono alcune persone che si svegliano dopo che la sveglia suona poche volte e ci sono alcune persone che premono il pulsante snooze un sacco di volte e vanno al college / lavorano fino a tardi con alcune scuse.

Il progetto di sveglia divertente proposto può affrontare il problema con la pigrizia durante la veglia mattutina. La maggior parte delle sveglie ha un pulsante snooze e un orario limite predeterminato per la sveglia se l'utente non ha risposto.

Abbiamo progettato questa sveglia senza un pulsante pigro (pulsante snooze) e la sveglia non si spegnerà fino a quando l'utente non premerà un pulsante.

Questo orologio può mostrare l'ora nel formato 12 ore e la data nel formato GG / MM / AAAA.

L'ora e la data verranno visualizzate sul display LCD 16 x 2. Un modulo RTC o orologio in tempo reale si occuperà di tenere traccia dell'ora e può mantenere l'ora corretta anche dopo una lunga interruzione di corrente.

Sono disponibili 5 pulsanti la cui funzione verrà spiegata a breve. Il cervello del progetto Arduino può qualsiasi modello di tua scelta, ti consigliamo Arduino pro mini o Arduino nano per le sue dimensioni compatte.

Ora tuffiamoci negli schemi.

Quanto sopra è lo schema per Arduino per visualizzare la connessione, regolare il contrasto del display ruotando il potenziometro 10K.

Di seguito è riportato il resto del circuito:

Il circuito può essere alimentato con adattatore da parete 9V 500mA.

Funzioni di 5 pulsanti:

S1 - Serve per fermare l'allarme (è anche pulsante di reset).
S2 - Viene utilizzato per impostare l'allarme. Premendo a lungo S2 si accede al menu di impostazione della sveglia.
S3 - Viene utilizzato per incrementare le ore.
S4: viene utilizzato per incrementare i minuti.
S5 - Viene utilizzato per attivare o disattivare lo stato di allarme. Se '*' è presente sul display LCD nell'angolo in basso a destra, l'allarme è ON, se '*' non esiste, le statistiche di allarme sono OFF.

Ulteriori dettagli su come impostare l'allarme sono spiegati in fondo all'articolo.

Scarica i file della libreria di seguito:

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

Ora dobbiamo impostare l'ora sul modulo RTC, l'ora verrà sincronizzata dal tuo PC al modulo RTC.

Carica il codice seguente per impostare l'ora e aprire il monitor seriale:

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

Ora hai impostato correttamente l'ora su RTC
Successivamente, è necessario caricare il seguente codice principale:

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

Dopo aver caricato il codice sopra è necessario vedere l'ora e la data corrette in esecuzione sul display.

Ora vediamo come impostare la sveglia:
• Premere a lungo S2 fino a visualizzare il menu Allarme.
• Premere S3 e S4 per regolare rispettivamente le ore e i minuti.
• Dopo aver impostato l'ora desiderata, premere nuovamente S2. Dirà 'L'allarme è impostato per xx: xx ore'.
• Se l'allarme è attivo puoi vedere il simbolo “*” sul display, se l'allarme è spento non ci sarà il simbolo “*”.
• È possibile attivare / disattivare l'allarme premendo S5 per mezzo secondo. Non premere a lungo finché '*' non scompare (ritorna di nuovo), basta premere a lungo mezzo secondo per attivare lo stato della sveglia.

NOTA IMPORTANTE:

L'errore più comune durante l'impostazione di una sveglia su qualsiasi orologio è l'attivazione involontaria di AM / PM, che si traduce nel non suonare la sveglia all'ora desiderata.

Per contrastare questo problema, l'impostazione della sveglia proposta è progettata sul formato dell'orologio a 24 ore.

L'ora visualizzata sul display LCD sarà di 12 ore con il formato AM / PM ma, quando si imposta una sveglia con questo progetto, è necessario impostare il formato 24 ore da 0 a 23 ore.

Ad esempio: se vuoi impostare la sveglia alle 21:00 devi impostare 21 ore e 0 minuti. Per, 5:00: 5 ore e 0 minuti e così via.

Prototipo dell'autore:

Ti piace questo progetto? Hai qualche domanda su questo progetto, sentiti libero di esprimere nel commento, potresti ricevere una rapida risposta.

Video clip:




Precedente: Circuito indicatore di livello beacon per serbatoi cereale per mietitrebbie Avanti: 3 circuiti inverter ad onda sinusoidale pura SG3525 ad alta potenza