Zegar cyfrowy Arduino za pomocą modułu RTC

Wypróbuj Nasz Instrument Do Eliminowania Problemów





W tym poście zamierzamy zbudować zegar cyfrowy za pomocą modułu RTC lub zegara czasu rzeczywistego. Zrozumiemy, czym jest moduł „RTC”, jak współpracować z Arduino i co robi.

Przez:



Moduł RTC to obwód, który dokładnie śledzi aktualny czas. Pełni dwie funkcje, komunikuje się z mikrokontrolerami i mikroprocesorami, aby podawać aktualny czas i działa jako obwód rezerwowy do podtrzymania czasu w przypadku awarii zasilania, ponieważ ma wbudowany system zasilania awaryjnego.

RTC możemy znaleźć w każdym urządzeniu elektronicznym, w którym czas jest ważną funkcją gadżetu.



Na przykład nasz komputer lub laptop utrzymuje swój czas nawet po odłączeniu zasilania lub wyjęciu baterii. Na płycie głównej dowolnego komputera znajdziemy baterię CMOS, która zasila układ RTC.

Podobnego rodzaju obwodu będziemy używać w tym projekcie.

Moduł RTC to niedrogie urządzenie, które można znaleźć we wszystkich witrynach handlu elektronicznego i lokalnych sklepach z projektami elektronicznymi.

Ilustracja typowego modułu RTC DS1307:

Większość modułów RTC jest dostarczana z baterią (CR2032) w momencie zakupu. Istnieją różne rozmiary i modele, pokazane powyżej mogą nie być takie same dla Ciebie. Ale upewnij się, że numer modelu to DS1307. Kod napisany w tym poście jest kompatybilny tylko z DS1307.

Teraz wiesz coś o zegarkach RTC. Przejdźmy teraz do projektowania zegara cyfrowego. Przed kontynuowaniem tego projektu musisz pobrać bibliotekę z poniższych linków i zainstalować na swoim IDE:

• DS1307RTC.h

Link: github.com/PaulStoffregen/DS1307RTC

• TimeLib.h

Link: github.com/PaulStoffregen/Time

Pozostałe dwie biblioteki zostałyby preinstalowane na Arduino IDE, jeśli masz najnowszą wersję.

• LiquidCrystal.h

• Wire.h

Obwód:

Połączenie obwodu między arduino a wyświetlaczem LCD jest standardowe, co możemy znaleźć w innych projektach opartych na LCD. Jedynym dodatkowym elementem jest RTC.

Aby zmniejszyć przeciążenie przewodów podczas prototypowania, zegar czasu rzeczywistego można podłączyć do styków analogowych bezpośrednio w arduino. Przylutuj złącza SCl, SDA, Vcc i GND za pomocą męskich pinów i włóż je od A2 do A5, jak pokazano na prototypie.

Prototyp autora:

Jak poprawnie wstawić RTC do Arduino:

Jeśli Twój zegar RTC ma różne lokalizacje pinów i nie można go odtworzyć, jak pokazano powyżej, zawsze możesz użyć przewodów do połączenia. Teraz, gdy konfiguracja sprzętu jest zakończona, przejdźmy do części projektu dotyczącej oprogramowania.

Jak ustawić czas:

Po zaprogramowaniu modułu RTC zachowuje czas nawet po wyjęciu z arduino. Bateria powinna wystarczyć na co najmniej kilka lat.

Nie ma przycisku do regulacji czasu, następny program ustawi czas w RTC. Czas automatycznie synchronizuje się z czasem komputera podczas kompilacji kodu, więc przed załadowaniem programów upewnij się, że na komputerze jest ustawiony prawidłowy czas.
Prześlij ten kod „SetTime”, aby ustawić czas przy podłączonym RTC:

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

Po przesłaniu tego kodu otwórz monitor szeregowy i powinien pojawić się komunikat o powodzeniu, informujący, że czas został ustawiony.

Oznacza to, że połączenie między RTC a arduino jest poprawne, a czas jest ustawiony.

Teraz prześlij poniższy kod do wyświetlania czasu na 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-------// 

Po wykonaniu tej czynności czas i data powinny być wyświetlane na ekranie LCD i działać.

Uwaga: Kod „SetTime” jest modyfikowany z przykładowego kodu DS1307RTC w celu optymalizacji połączeń przewodowych dla modułu RTC, przesłanie oryginalnego kodu nie spowoduje ustawienia czasu.

Cyfrowy budzik za pomocą Arduino

W tym powyżej dowiedzieliśmy się, jak zbudować podstawowy zegar Arduino za pomocą modułu RTC, w poniższej sekcji badamy, jak można go ulepszyć do obwodu cyfrowego budzika za pomocą Arduino.

Są ludzie, którzy nie potrzebują budzika, budzą się naturalnie i są tacy, którzy budzą się po kilku dzwonkach budzika i są tacy, którzy kilka razy naciskają przycisk drzemki i idą do szkoły / pracują do późna kilka wymówek.

Proponowany zabawny projekt małego budzika może skonfrontować problem z lenistwem podczas porannej pobudki. Większość budzików ma przycisk drzemki i wstępnie ustalony czas wyłączenia alarmu, jeśli użytkownik nie zareaguje.

Zaprojektowaliśmy ten budzik bez leniwego przycisku (przycisku drzemki), a alarm nie wyłączy się, dopóki użytkownik nie naciśnie przycisku.

Ten zegar może pokazywać czas w formacie 12-godzinnym i datę w formacie DD / MM / RRRR.

Godzina i data będą wyświetlane na wyświetlaczu LCD 16 x 2. Moduł czasu rzeczywistego RTC lub zegara czasu rzeczywistego zajmie się śledzeniem czasu i może zachować prawidłowy czas nawet po długiej przerwie w zasilaniu.

Dostępnych jest 5 przycisków, których funkcja zostanie wkrótce wyjaśniona. Mózgiem projektu Arduino może być dowolny wybrany przez Ciebie model, polecamy Arduino pro mini lub Arduino nano ze względu na jego kompaktowe rozmiary.

Przejdźmy teraz do schematów.

Powyższy schemat jest przeznaczony dla Arduino do połączenia wyświetlacza, wyreguluj kontrast wyświetlacza, obracając potencjometr 10K.

Poniżej znajduje się reszta obwodu:

Obwód może być zasilany za pomocą adaptera ściennego 9V 500mA.

Funkcje 5 przycisków:

S1 - Służy do zatrzymania alarmu (jest to również przycisk resetowania).
S2 - Służy do ustawiania alarmu. Długie naciśnięcie S2 spowoduje przejście do menu ustawień alarmu.
S3 - Służy do zwiększania godzin.
S4 - służy do zwiększania minut.
S5 - Służy do przełączania stanu alarmu. Jeśli na wyświetlaczu LCD w prawym dolnym rogu pojawi się „*”, alarm jest WŁĄCZONY, jeśli „*” nie istnieje, statystyka alarmu jest WYŁĄCZONA.

Więcej szczegółów na temat ustawiania alarmu jest wyjaśnione na dole artykułu.

Pobierz poniższe pliki biblioteki:

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

Teraz musimy ustawić czas na moduł RTC, czas zostanie zsynchronizowany z Twojego komputera do modułu RTC.

Prześlij poniższy kod, aby ustawić czas i otworzyć monitor szeregowy:

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

Teraz pomyślnie ustawiłeś czas na RTC
Następnie musisz przesłać następujący kod główny:

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

Po wgraniu powyższego kodu musisz zobaczyć prawidłowy czas i datę na wyświetlaczu.

Zobaczmy teraz, jak ustawić alarm:
• Długo naciśnij S2, aż pojawi się menu Alarm.
• Naciśnij S3 i S4, aby ustawić odpowiednio godziny i minuty.
• Po ustawieniu żądanego czasu ponownie naciśnij S2. Zostanie wyświetlony komunikat „Alarm jest ustawiony na xx: xx godzin”.
• Jeśli alarm jest WŁĄCZONY, na wyświetlaczu widoczny będzie symbol „*”, jeśli alarm jest WYŁĄCZONY, nie będzie symbolu „*”.
• Możesz włączyć / wyłączyć alarm naciskając S5 na pół sekundy. Nie naciskaj długo, aż „*” zniknie (pojawi się ponownie), po prostu naciśnij pół sekundy, aby przełączyć stan alarmu.

WAŻNA UWAGA:

Najczęstszym błędem podczas ustawiania budzika na dowolnym zegarze jest niezamierzone przełączanie AM / PM, co skutkuje brakiem dzwonienia alarmu w naszym pożądanym czasie.

Aby temu zapobiec, proponowane ustawienie budzika zostało zaprojektowane w formacie 24-godzinnym.

Czas wyświetlany na wyświetlaczu LCD będzie wynosił 12 godzin w formacie AM / PM, ale kiedy ustawiasz alarm w tym projekcie, musisz ustawić w formacie 24-godzinnym od 0 do 23 godzin.

Na przykład: jeśli chcesz ustawić alarm na 21:00, musisz ustawić 21 godzin i 0 minut. Na 5 rano: 5 godzin i 0 minut i tak dalej.

Prototyp autora:

Podoba Ci się ten projekt? Masz jakiekolwiek pytania dotyczące tego projektu, nie krępuj się wyrazić w komentarzu, możesz otrzymać szybką odpowiedź.

Klip wideo:




Poprzedni: Obwód wskaźnika poziomu beacon dla zbiorników zbożowych kombajnu zbożowego Dalej: 3 obwody falownika sinusoidalnego o dużej mocy SG3525