Jak podłączyć RTC do arduino zegar czasu rzeczywistego DS3231 krok po kroku

Czas to wielkość niezależna od innych płynąca w takim samym rytmie w całym wszechświecie. Brzmi to na tyle dobrze, że warto by było móc sprawdzać godzinę i datę na naszym mikrokontrolerze.

Przyda się to w monitorowaniu danych lub w tak trywialnych zastosowaniach jak wyświetlanie aktualnej godziny na wyświetlaczu.

Aby wcielić ten plan w życie potrzebny będzie nam moduł odliczający czas. Moduły te są powszechnie nazywane RTC (real time clock) co w tłumaczeniu na nasze daje moduł czasu rzeczywistego i mogą podawać tylko godzinę lub również posiadać funkcję kalendarza a nawet pozwalać na programowanie alarmów. Często posiadają też wbudowany termometr do kompensacji odliczania czasu – aby temperatury nie zaburzały działania generatora kwarcowego umieszczonego wewnątrz. Fajnie jeśli nasz moduł posiada zintegrowaną baterię, która pozwoli na zapamiętanie i podtrzymanie ustawionego wcześniej czasu.

W tym artykule zajmiemy się popularnym modułem RTC DS3231, moduł posiada zintegrowaną baterię CR2032, kalendarz, 2 alarmy oraz wbudowany termometr, generator fali prostokątnej oraz sygnału 32kHz. Posiada możliwość komunikacji przez interfejs I2C.

Przyglądając się dokładniej DS3231

Analizując kolejno nasz RTC posiada złącza interfejsu I2C z dwóch stron, jedna zakończona goldpinami w rastrze 2,54 druga z otworami lutowniczymi. Od nas zależy, które wygodniej będzie nam użyć do komunikacji. Pola oznaczona A0, A1, A2 pozwalają nam dobrać adres I2C wbudowanej pamięci EEPROM poprzez zlutowanie zworki. Pola lutownicze oznaczają następujące bity:

adresacja EEPROM

Zlutowanie zworki na polu podciąga stan na LOW, domyślnie w miejscach A0, A1, A2 ustawione są na HIGH. Czyli adres wygląda: 10110111 binarnie i 0x57 hexadecymalnie. Moduł został wyposażony w 32 bajtowy EEPROM 24C32

Wyjście SQR pozwala generować przebieg fali prostokątnej o częstotliwościach 1Hz, 4kHz, 8kHz i 32kHz.

Wyjście 32kHz to bezpośredni sygnał z TCXO.

Jeśli chodzi o dokładność naszego modułu posiada on kompensacje działania przez wbudowany czujnik temperatury dzięki temu rozbieżność wskazania czasu będzie sięgać do 5 minut w ciągu roku – to całkiem dobry wynik.

Czas działania na baterii można przyjąć średnio jako 8 lat.

Bateria posiada pojemność 220mAh, moduł zużywa minimalnie 3uA więc : 220mAh/3uA= 73333h = 3055 dni = 8 lat  brzmi jak odpowiedni zapas 😉

Jak podłączyć go do Arduino UNO?

Aby połączyć nasz RTC z mikrokontrolerem wpinamy go w pola SDA i SCL, arduino ma te pola oznaczona na odwrocie.

DS3231 potrzebuje napięcia z zakresu od 3V do 5V ,które w naszym przypadku pobieramy bezpośrednio z mikrokontrolera, GNG czyli masy łączymy ze sobą jak również SDA<->SDA (serial data) i SCL<->SCL (serial clock).

Po prawidłowym połączeniu i podaniu zasilania powinna zaświecić się czerwona dioda power na DS3231.

Wybór biblioteki i kod programu

W internecie jest sporo bibliotek wspomagających obsługę RTC jednak większość na pierwszy rzut oka jest skomplikowana – my stawiamy na naszym blogu na prostotę dla osób zaczynających swoją przygodę z arduino i polecamy pobrać i zainstalować bibliotekę od Rinky-Dink Electronics.

Pobierz bibliotekę do DS3231: >klik<

Dokumentacja do biblioteki do pobrania tutaj: >klik<

Dokumentacja funkcji jest tutaj tak prosto opisana, że nawet początkujący powinien sobie poradzić z jej rozszyfrowaniem.

Aby rozpocząć kodowanie w środowisku ArduinoIDE wchodzimy w:

Szkic->Dołącz Bibliotekę-> Dodaj bibliotekę .ZIP… i wybieramy nasz pobrany z linku powyżej plik biblioteki.

Teraz przystępujemy do pisania kodu, otwieramy nowy szkic i zaczynamy od dodania bibliotek <Wire.h> odpowiedzialnej za komunikacje I2C oraz <DS3231.h>

Kolejno deklarujemy sobie obiekt klasy DS3231 który nazwiemy na nasze potrzeby rtc, podając w nawiasie na jakich pinach nastąpi komunikacja – wpisujemy słownie SDA,SCL. Kolejno inicjalizujemy serial monitor oraz odczyt czasu. Jak zawszę uczulam, że po otwarciu serial monitora w arduinoIDE powinniśmy ustawić taką samą wartość jak podaliśmy w nawiasie – w tym przypadku 57600, inaczej zaczną pojawią się dziwne znaki.

#include <DS3231.h>
#include <Wire.h>
DS3231 rtc(SDA,SCL);

void setup() {

Serial.begin(57600);
rtc.begin();
}

Przyjmujemy, że jest to nasze pierwsze uruchomienie tego modułu i ustawiliśmy na nim jeszcze właściwej godziny. Należy to zrobić przez dodanie pod rtc.begin(); następujących linijek:

rtc.setDOW(4);
rtc.setTime(14,3,9);
rtc.setDate(18,6,2020);

setDOW – ustawiamy dzień tygodnia od 1 do 7 – cyfry odpowiadają kolejno dniom od poniedziałku do niedzieli.

setTime – podajemy godzinę, minuty, sekundy

setDate – podajemy dzień, miesiąc, rok

Kod ten wrzucamy tylko przy pierwszym uruchomieniu, następnie kasujemy go aby nie przestawiać wcześniej ustawionego czasu.

Po tym jak czas został już ustawiony zajmijmy się odczytaniem i wypisaniem godziny i daty przez serial monitor.

Aby to zrobić wykorzystamy funkcję:

Serial.print(rtc.getTimeStr(2)); //wypisuje godzinę
Serial.print(" - "); // 
Serial.println(rtc.getDateStr()); // wypisuje datę
Serial.println(rtc.getDOWStr()); //wypisuje dzień tygodnia
delay(1000); // czekamy 1 sekunde

Zgodnie z instrukcją do biblioteki można wywoływać funkcję z parametrami, przykładowo w formacie długim podając 2 lub w formacie krótkim podając 1 w nawiasie.

Serial.println(rtc.getDOWStr(1)) – otrzymamy Thu

Serial.println(rtc.getDOWStr(1)) – otrzymamy Thursday

Cały działający kod do przetestowania wklejam poniżej:

#include <DS3231.h>
#include <Wire.h>
DS3231 rtc(SDA,SCL);
void setup() {
Serial.begin(57600);
rtc.begin();

//////////pamiętaj usuń poniższe 3 linijki jesli ustawiles juz poprawny czas
rtc.setDOW(4); //dzien tygodnia
rtc.setTime(14,3,9); //czas
rtc.setDate(18,6,2020); //data

}

void loop() {
Serial.print(rtc.getTimeStr(2));
Serial.print(" - ");
Serial.println(rtc.getDateStr());
Serial.println(rtc.getDOWStr(1));
delay(1000);

}

Jeśli chcemy skorzystać z wbudowanego termometru temperaturę możemy odczytać poprzez funkcję rtc.getTemp();

Mam nadzieję, że w przystępny sposób udało się przybliżyć działanie modułu RTC DS3231. Jeśli nie posiadasz go jeszcze w swojej kolekcji zachęcamy do zakupu go w naszym sklepie internetowym gdzie sprzedajemy go w zestawie z baterią:

11 Comments

Zostaw komentarz

  1. Antoni
    Odpowiedz

    Mam taki sam problem z zegarem jak przedstawiony w przykładzie. Tylko tyle w tym różnicy, że posiadam Arduino Nano. Czy da się w jakiś łatwy sposób przerobić tych parę linijek tak aby można było zaprogramować ten zegar pod Arduino Nano?

    1. admin
      Odpowiedz

      model arduino nie ma tutaj znaczenia, kroki są identyczne jak w poradniku

    2. Piotr S
      Odpowiedz

      Może nie masz wgranej biblioteki do programowania nano? 🙂 Nano every jest na innym klocku, po podłączeniu IDE samo powinno zasugerować aktualizację/rozbudowę.

  2. Karol
    Odpowiedz

    Link do biblioteki nie działa

    1. admin
      Odpowiedz

      Dzień dobry, Panie Karolu sprawdziliśmy i link jest poprawny, jeśli są problemy z pobraniem należy prawym klawiszem kliknąć w link i wybrać zapisz link jako…, lub coś podobnego w zależności od przeglądarki.

  3. Andy
    Odpowiedz

    Ładnie działa, bez najmniejszych problemów – testowane z Ardu UNO.

    1. admin
      Odpowiedz

      Dzięki cieszymy się, że projekt się przydał!

  4. Tomasz
    Odpowiedz

    Nano czy uno to tak samo się programuje ten moduł

  5. Tomy
    Odpowiedz

    Dzięki za super – czarno nabiałym

  6. Piotr
    Odpowiedz

    Stwierdzenie „czas to wielkość niezależna od innych płynąca w takim samym rytmie w całym wszechświecie” jest mocno kontrowersyjne w świetle teorii względności z 1905 roku.

Odpowiedz

Twój adres e-mail nie zostanie opublikowany