RTC DS1302, czyli czas rzeczywisty

RTC DS1302 arduino

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" &amp;& myDate != "00.00.2000") {
  timeGlobal = String(myDate) + " " + String(mytime);
  return String(timeGlobal);
}else{
  return timeGlobal;
}


Opublikowano: 25 kwietnia, 2017 przez Pan z Pogodna

Leave a Reply