Arduino Digital Clock med RTC-modul

Prova Vårt Instrument För Att Eliminera Problem





I det här inlägget ska vi konstruera en digital klocka med hjälp av RTC eller Real Time Clock-modulen. Vi kommer att förstå vad 'RTC' -modulen är, hur man gränssnitt med Arduino och vad den gör.

Förbi:



RTC-modulen är en krets som håller koll på aktuell tid exakt. Den har två funktioner, den kommunicerar med mikrokontroller och mikroprocessorer för att ge aktuell tid och fungera som reservkrets för att upprätthålla tiden vid strömavbrott, eftersom den har ett inbyggt reservsystem för batteribackup.

Vi kan hitta RTC i alla elektroniska enheter där tid är en viktig funktion för gadgeten.



Till exempel, vår dator eller bärbara dator behåller sin tid även efter att strömmen har kopplats bort eller batteriet har tagits bort. På moderkortet på vilken dator som helst kan vi hitta ett CMOS-batteri som driver RTC-kretsen.

Liknande typ av krets vi ska använda i detta projekt.

RTC-modulen är en billig enhet som finns på alla e-handelsplatser och i dina lokala elektroniska projektbutiker.

Illustration av typisk RTC-modul DS1307:

De flesta av RTC-modulerna levereras med batteri (CR2032) vid inköpstillfället. Det finns olika storlekar och modeller, ovanstående illustrationer kanske inte är desamma för dig. Men se till att modellnumret är DS1307. Koden skriven i det här inlägget är endast kompatibel med DS1307.

Nu vet du något om RTC. Låt oss nu gå vidare till den digitala klockdesignen. Innan du fortsätter med detta projekt måste du ladda ner biblioteket från följande länkar och installera på din IDE:

• DS1307RTC.h

Länk: github.com/PaulStoffregen/DS1307RTC

• TimeLib.h

Länk: github.com/PaulStoffregen/Time

Andra två bibliotek skulle ha förinstallerats på Arduino IDE, om du har den senaste versionen.

• LiquidCrystal.h

• Wire.h

Kretsen:

Kretsförbindelsen mellan arduino och LCD-skärm är standard, vilket vi kan hitta liknande anslutning på andra LCD-baserade projekt. Den enda ytterligare komponenten är RTC.

För att minska trängseln under prototypen kan RTC sättas in i de analoga stiften direkt på arduinoen. Löd SCl, SDA, Vcc och GND med manliga huvudstift och sätt in det A2 till A5-stiften som visas i prototypen.

Författarens prototyp:

Så här sätter du in RTC på Arduino:

Om din RTC har olika stiftplatser och inte kunde replikeras som illustreras ovan kan du alltid använda ledningar för anslutning. Nu är din hårdvarukonfiguration klar, låt oss gå till programvarudelen av projektet.

Hur man ställer in tid:

När RTC-modulen är programmerad behåller den tiden även den tas bort från arduino. Batteriet ska ta minst ett par år.

Det finns ingen knapp för att justera tiden för följande program som ställer in tiden i RTC. Tiden synkroniseras automatiskt med datorns tid medan du sammanställer koden, så se till att din dator är inställd på rätt tid innan du laddar upp programmen.
Ladda upp den här 'SetTime' -koden för att ställa in tiden med RTC inkopplad:

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

När den här koden har laddats upp, öppna den seriella bildskärmen och ett framgångsmeddelande ska dyka upp och säga att tiden har ställts in.

Detta betyder att din anslutning mellan RTC och arduino är korrekt och att tiden är inställd.

Ladda nu upp följande kod för att visa tiden i 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-------// 

När detta är gjort bör du se att tid och datum visas på LCD-skärmen och körs.

Notera: 'SetTime' -koden modifieras från exempelkoden för DS1307RTC för att optimera trådanslutningar för RTC-modulen. Uppladdning av originalkod ställer inte in tid.

Digital väckarklocka med Arduino

I det här ovan lärde vi oss hur man bygger den grundläggande Arduino-klockan med hjälp av RTC-modulen, i följande sektion undersöker vi hur detta kan uppgraderas till en digital alarmklockkrets med Arduino.

Det finns vissa människor som inte behöver någon väckarklocka, de vaknar naturligt och det finns vissa människor som vaknar efter att väckarklockan har ringt några gånger och det finns några som trycker på snooze-knappen en massa gånger och går på college / jobbar sent med några ursäkter.

Det föreslagna roliga lilla väckarklockaprojektet kan konfrontera problemet med latskap på morgonen. De flesta väckarklockor har en snooze-knapp och förutbestämd avstängningstid för larm om användaren inte svarade.

Vi designade den här väckarklockan utan en lat knapp (snooze-knappen) och alarmet stängs inte av förrän användaren trycker på en knapp.

Denna klocka kan visa tid i 12-timmarsformat och datum i DD / MM / ÅÅÅÅ-format.

Tid och datum visas på 16 x 2 LCD-skärm. En RTC- eller realtidsklockmodul tar hand om att spåra tiden och kan behålla rätt tid även efter ett långt strömavbrott.

Det finns 5 knappar vem som fungerar kommer att förklaras inom kort. Hjärnan i projektet Arduino kan valfri modell efter eget val, vi rekommenderar Arduino pro mini eller Arduino nano på grund av dess kompakta storlek.

Låt oss nu dyka in i scheman.

Ovanstående är schemat för Arduino att visa anslutning, justera skärmkontrasten genom att vrida 10K potentiometern.

Nedan är resten av kretsen:

Kretsen kan drivas med 9V 500mA väggadapter.

Funktioner för 5 knappar:

S1 - Detta används för att stoppa larmet (det är också återställningsknapp).
S2 - Används för att ställa in larm. Genom att trycka länge på S2 kommer du till menyn för inställning av larm.
S3 - Det används för att öka timmarna.
S4 - den används för att öka antalet minuter.
S5 - Används för att växla larmstatus. Om “*” finns på LCD-skärmen i det nedre högra hörnet är alarmet PÅ, om “*” inte finns är alarmstatistiken OFF.

Mer information om hur man ställer in larm förklaras längst ner i artikeln.

Ladda ner biblioteksfilerna nedan:

Länk1: github.com/PaulStoffregen/DS1307RTC
Link2: github.com/PaulStoffregen/Time

Nu måste vi ställa in tid till RTC-modulen, tiden synkroniseras från din PC till RTC-modulen.

Ladda upp koden nedan för att ställa in tid och öppna Serial monitor:

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

Nu har du framgångsrikt ställt in tid till RTC
Därefter måste du ladda upp följande huvudkod:

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

Efter att ha laddat upp ovanstående kod måste du se korrekt tid och datum på displayen.

Låt oss nu se hur du ställer in alarm:
• Tryck länge på S2 tills du kan se Alarm-menyn.
• Tryck på S3 och S4 för att justera timmar respektive minuter.
• Efter önskad tidsinställning, tryck S2 en gång till. Det kommer att stå 'Larmet är inställt på xx: xx timmar'.
• Om larmet är PÅ kan du se “*” -symbolen på displayen. Om larmet är AV kommer det inte att finnas någon “*” -symbol.
• Du kan slå på / av alarmet genom att trycka på S5 i en halv sekund. Tryck inte länge tills “*” försvinner (det kommer tillbaka igen), tryck bara en halv sekund lång för att växla larmstatus.

VIKTIG NOTERING:

Det vanligaste misstaget när du ställer in ett larm på vilken klocka som helst är oavsiktlig växling mellan AM / PM, vilket leder till att larmet inte ringer vid vår önskan.

För att motverka detta problem är den föreslagna alarmklockinställningen utformad på 24-timmarsformat.

Tiden som visas på LCD-skärmen är 12 timmar med AM / PM-format, men när du ställer in ett larm med detta projekt måste du ställa in 24-timmarsformat från 0 till 23 timmar.

Till exempel: om du vill ställa in alarm 21:00 måste du ställa in 21 timmar och 0 minuter. I 5 AM: 5 timmar och 0 minuter och så vidare.

Författarens prototyp:

Gillar du det här projektet? Har du några frågor angående detta projekt, uttryck gärna i kommentaren, du kan få ett snabbt svar.

Videoklipp:




Tidigare: Beacon Level Indicator Circuit for Combine Harvester Grain Tanks Nästa: 3 högeffekt SG3525 rena Sinewave-inverterarkretsar