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ą:

Odpowiedz

Twój adres e-mail nie zostanie opublikowany