RTC DS1302, czyli czas rzeczywisty
Gdy potrzeba mierzyć czas albo pokazywać godzinę do logów, na ekran, do wiadmości, do smsa potrzbne zaopatrzyć sie w moduł RTC, najlepiej z baterią aby zapewnić ciągłość pracy w czasie. Moim podzespołem jest moduł z zegarem czasu rzeczywistego i rezerwowym zasilaniem bateryjnym. Pozwala na odczyt czasu w postaci godziny, minuty i sekundy oraz daty: miesiąc, dzień, rok. Interfejsem komunikacyjnym jest magistrala SPI.
Moduł w zasadzie prosty, ale o ile pamiętam przysprzył mi kilka problemów zanim odpowiednio go dopsawałem do swoich potrzeb. Potrzebę właściwie miałem podstawową – pokazywać czas na ekranie LCD w formacie dzień/miesiąc/rok godzina/minuta/sekunda. Moduł też wie jaki jest dzień tygodnia (zawiera w sobie kalendarz) ale nie potrzeba mi takiej informacji. Ale po koleji, najpierw kwestia połączenia modułu do Arduino. W tym projekcie wykorzystałem SPI na szynie główne (2,3,4) pozostawiając osobne złącze spi na płytce Arduino wolnym. Takwięc:
VCC -> +5v
GND -> GND
I/O -> 3
SCK -> 4
CS -> 2
i to wystarczy aby uruchomić poprawnie. Pozostaje kwestia ustawienia daty i można czerpać dane garściami
#include <SPI.h> #include <DS1302.h> DS1302 rtc(2, 3, 4); String timeGlobal; void setup(){ rtc.halt(false); rtc.writeProtect(false); Serial.begin(115200); //mozna zakomentować gdy już ustawimy aktualna datę rtc.setDOW(SUNDAY); // Set Day-of-Week rtc.setTime(15, 02, 0); // Set the time to 12:00:00 (24hr format) rtc.setDate(26, 3, 2017); // Set the date to August 6th, 2010 } void loop() { Serial.println(getCurrentTime()); delay(10); } String getCurrentTime() { String mytime = rtc.getTimeStr(); String myDate = rtc.getDateStr(); timeGlobal = String(myDate) + " " + String(mytime); return String(timeGlobal); }
Z doświadczenia, zauważyłem, że z uwagi na delay w loopie cyklicznie co zdefiniowany czas odczyt z zegara wynosi 00:00:0000 00:00 i jeżeli nie przeszkadza nikomu odswieżanie odczytu nie co sekundę, to sposobem na obejście problemu jest takie podejscie dodane w metodzie getCurrentTime()
if(mytime != "00:00:00" && myDate != "00.00.2000") { timeGlobal = String(myDate) + " " + String(mytime); return String(timeGlobal); }else{ return timeGlobal; }
Opublikowano: 25 kwietnia, 2017 przez Pan z Pogodna