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
