Jak używać modułu zegara czasu rzeczywistego (RTC) DS3231 z ESP32

Jak Uzywac Modulu Zegara Czasu Rzeczywistego Rtc Ds3231 Z Esp32



ESP32 to inteligentna płytka mikrokontrolera z wbudowanymi funkcjami Wi-Fi i Bluetooth. ESP32 jest wyposażony w wewnętrzny zegar RTC, ale jego działanie zależy od zasilania. Jeśli więc chcesz projektować projekty lub obwody, które chcesz uruchamiać nawet przy braku zasilania, musisz użyć dowolnego zewnętrznego modułu RTC, takiego jak DS1307 lub DS3231.

Zrobiliśmy już tutorial na ten temat Współpraca DS1307 z modułem ESP32 . Dziś omówimy podstawy czujnika RTC DS3231 i sprawdzimy jak można go skomunikować z płytką ESP32.

Spis treści:







1. Co to jest moduł RTC DS3231



2. Jak połączyć DS3231 z ESP32



3. Sprzęt





4. Kod

5. Wyjście



6. Jak wyświetlić czas RTC DS3231 na ekranie OLED za pomocą ESP32

Wniosek

1. Co to jest moduł RTC DS3231

Moduł DS3231 zapewnia bardzo dokładny pomiar czasu. Zawiera zintegrowany oscylator kwarcowy z kompensacją temperatury (TCXO), który zapewnia nam czas z dużą precyzją. Moduł pracuje w oparciu o protokół I2C w konfiguracji Master-Slave. Może przechowywać godzinę i datę dzięki baterii zapasowej, nawet gdy nie ma głównego zasilania wejściowego. Jest powszechnie stosowany w urządzeniach zależnych od czasu i daty.

DS3231 rejestruje sekundy, minuty i godziny. Może także rejestrować daty i dni tygodnia. W przypadku lat przestępnych automatycznie dostosowuje czas. Może także wyświetlać czas w formacie 12-godzinnym lub 24-godzinnym, wraz ze wskaźnikiem AM/PM.

1.1. DS3231 kontra DS1307

Zarówno DS3231, jak i DS1307 to moduły pomiaru czasu z obsługą podtrzymania bateryjnego. Jednak DS3231 jest dokładniejszy niż DS1307. Głównym powodem jest to, że DS1307 zależy od zewnętrznego kryształu 32 kHz do pomiaru czasu.

Jednakże RTC DS3231 jest wyposażony w wewnętrzny oscylator kwarcowy z kompensacją temperatury (TCXO). Dzięki temu jest mniej podatny na wpływ temperatury zewnętrznej, dzięki czemu zapewnia przewagę dokładności o kilka minut rocznie w porównaniu z DS1307.

1.2. Układ pinów DS3231

DS3231 działa w oparciu o protokół I2C. Sercem tego modułu RTC jest dokładny układ RTC zaprojektowany przez firmę Maxim. Układ ten obsługuje wszystkie funkcje czasowe i komunikuje się za pomocą I2C z płytką ESP32 lub Arduino.

Główne piny modułów RTC DS3231 to:

  • VCC: Podłącz ten pin do dodatniego zacisku źródła zasilania.
  • GND: Połączenie uziemiające.
  • SDA: Szeregowy pin danych (używany do komunikacji I2C).
  • SCL: Pin zegara szeregowego (również część interfejsu I2C).
  • Pytanie: Pin wyjściowy fali prostokątnej (może generować sygnał okresowy, np. dla alarmów lub innych celów związanych z synchronizacją).
  • 32 tys.: Wyjście oscylatora 32 kHz (przydatne w zastosowaniach wymagających precyzyjnego pomiaru czasu).

Poniżej znajdują się główne komponenty wbudowane modułu RTC DS3231:

  • Uchwyt baterii: Umożliwia pracę modułu w przypadku braku zasilania zewnętrznego.
  • Układ RTC: Ten chip utrzymuje godzinę i datę.
  • Pamięć EEPROM AT24C32: Zapewnia nieulotną pamięć do rejestrowania danych i innych celów z 1 000 000 cykli zapisu.
  • TCXO: Oscylator z kompensacją temperatury zapewniający prawidłowy czas dla zmieniającego się zakresu temperatur.
  • Czujnik temperatury: Pobiera odczyty temperatury i udostępnia je w ramach funkcji modułu.

2. Jak połączyć DS3231 z ESP32

Aby połączyć DS3231 z ESP32, musisz zainstalować Biblioteka RTClib Pierwszy. Po zainstalowaniu tej biblioteki Adafruit RTC możesz połączyć swoją płytę ESP32 z DS3231 za pomocą protokołu I2C. Do połączenia ESP32 I2C z modułem RTC DS3231 można wykorzystać piny ESP32 D21 i D22.

2.1. Schemat połączeń ESP32 z RTC DS3231

Najpierw musisz połączyć ESP32 z modułem I2C RTC DS3231. Aby okablować, postępuj zgodnie z poniższą konfiguracją pinów:

Po podłączeniu ESP32 do RTC DS3231 schemat podłączenia powinien wyglądać tak. Można także zasilać DS3231 z pinu VIN ESP32. Napięcia robocze DS3231 wynoszą od 3,3 do 5,5 VDC.

2.2. Instalowanie wymaganych bibliotek

Gdy obwód będzie gotowy, następnym krokiem jest jego wykonanie skonfiguruj swoją płytkę ESP32 za pomocą Arduino IDE . Aby połączyć DS3231, musisz zainstalować Biblioteka RTClib . Można go zainstalować za pomocą menedżera bibliotek Arduino IDE.

3. Sprzęt

Do zaprojektowania zegara RTC opartego na DS3231 i ESP32 będziesz potrzebować następującego sprzętu:

  • Płytka rozwojowa ESP32
  • Moduł RTC DS3231
  • Bateria CR2032
  • Przewody połączeniowe
  • Deska do krojenia chleba

4. Kod

Po zainstalowaniu biblioteki RTC następna część to napisanie kodu dla DS3231 i wgranie go na płytkę ESP32. Najpierw musisz napisać kod, aby ustawić aktualny czas. Po ustawieniu czasu w DS3231, będzie on pamiętał czas i działał nawet wtedy, gdy płyta ESP32 zostanie wyłączona.

Teraz otwórz Arduino IDE, skompiluj i wypal kod na płytce ESP32.

#include
#include

RTC_DS3231 rtc ; // Zainicjuj instancję klasy RTC_DS3231

próżnia organizować coś ( ) {
Seryjny. zaczynać ( 115200 ) ;
Drut. zaczynać ( ) ;

Jeśli ( ! rtc. zaczynać ( ) ) {
Seryjny. drukuj ( „Nie wykryto RTC” ) ;
chwila ( 1 ) ; // Zawieszenie na czas nieokreślony, jeśli nie zostanie znaleziony RTC
}

//Odkomentuj poniższy wiersz, aby ustawić początkową datę i godzinę
//rtc.just(Data/godzina(__DATA__, __CZAS__));
}

próżnia pętla ( ) {
// Odczytaj aktualny czas z czujnika (DS3231)
Data i godzina teraz = rtc. Teraz ( ) ;

// Wydrukuj datę i godzinę w tym samym wierszu, używając dwóch cyfr oznaczających godziny, minuty i sekundy
Seryjny. wydrukować ( 'Bieżąca data: ' ) ;
Seryjny. wydrukować ( Teraz. rok ( ) , GRUDZIEŃ ) ;
Seryjny. wydrukować ( „/” ) ;
drukujDwie cyfry ( Teraz. miesiąc ( ) ) ;
Seryjny. wydrukować ( „/” ) ;
drukujDwie cyfry ( Teraz. dzień ( ) ) ;
Seryjny. wydrukować ( ' Obecny czas: ' ) ;
drukujDwie cyfry ( Teraz. godzina ( ) ) ;
Seryjny. wydrukować ( „:” ) ;
drukujDwie cyfry ( Teraz. minuta ( ) ) ;
Seryjny. wydrukować ( „:” ) ;
drukujDwie cyfry ( Teraz. drugi ( ) ) ;
Seryjny. drukuj ( ) ;

opóźnienie ( 1000 ) ; // Aktualizuj co 1 sekundę
}

próżnia drukujDwie cyfry ( wew numer ) {
Jeśli ( numer < 10 ) {
Seryjny. wydrukować ( „0” ) ; // Dodaj początkowe zero dla liczb jednocyfrowych
}
Seryjny. wydrukować ( numer ) ;
}

4.1. Wyjaśnienie kodu

Kod rozpoczyna się od inicjalizacji komunikacji szeregowej I2C za pomocą biblioteki przewodów. Następnie dołączyliśmy bibliotekę RTC firmy Adafruit do współpracy z modułem DS3231. Biblioteka ta zapewnia funkcję interakcji z modułem RTC DS3231.

w organizować coś część, magistrala I2C jest uruchamiana i sprawdzana pod kątem dostępnych urządzeń I2C. Jeśli nie zostanie znaleziony, program zawiesza się na czas nieokreślony. Szybkość transmisji jest również zdefiniowana, dzięki czemu można sprawdzić dane wyjściowe na monitorze szeregowym Arduino IDE.

Ustawianie zegara po raz pierwszy

Programując DS3231, musisz to zrobić odkomentuj tę linię . Spowoduje to pobranie czasu systemowego i zapisanie go w pamięci RTC. W ten sposób zegar modułu RTC zostaje zsynchronizowany z zegarem systemowym.

//rtc.just(Data/godzina(__DATA__, __CZAS__));

Po ustawieniu czasu musisz ponownie wgrać powyższy kod, ale tym razem musisz skomentuj linię funkcji rtc.just(). . W przeciwnym razie spowoduje to zastąpienie poprzedniego ustawionego czasu, a gdy ESP32 zostanie wyłączony, RTC uruchomi się ponownie od momentu przesłania kodu.

W ten sposób Twój czas pozostanie obecny w tle modułu RTC tak długo, jak moduł RTC będzie zasilany w swojej komórce CR2032.

w pętla część, bieżąca data i godzina odczytywane są z modułu DS3231 za pomocą funkcji rtc.now(). Wyodrębniane są składniki daty i godziny, a sformatowana data jest drukowana na monitorze szeregowym Arduino IDE co jedną sekundę.

5. Wyjście

Po wgraniu kodu na płytkę ESP32 zobaczysz, że czas zacznie drukować na monitorze szeregowym Arduino IDE.

6. Jak wyświetlić czas RTC DS3231 na ekranie OLED za pomocą ESP32

Można też pójść o krok dalej i wyświetlić godzinę na ekranie OLED po odczytaniu jej z DS3231. W tym celu należy zainstalować Biblioteka Adafruit GFX SSD1306 w ArduinoIDE.

Po zainstalowaniu podłącz ESP32 z modułem OLED i RTC w poniższej konfiguracji.

Po podłączeniu czujnika zobaczysz, że obwód wygląda jak na poniższym schemacie.

Teraz prześlij następujący kod DS3231 do płyty ESP32.

#include
#include
#include
#include „RTClib.h”

RTC_DS3231 rtc ;

zwęglać dni [ 7 ] [ 12 ] = { 'Niedziela' , 'Poniedziałek' , 'Wtorek' , 'Środa' , 'Czwartek' , 'Piątek' , 'Sobota' } ;

Wyświetlacz Adafruit_SSD1306 = Adafruit_SSD1306 ( 128 , 64 , & Drut , - 1 ) ;

próżnia organizować coś ( ) {
Seryjny. zaczynać ( 115200 ) ;

wyświetlacz. zaczynać ( SSD1306_SWITCHCAPVCC , 0x3C ) ;

Jeśli ( ! rtc. zaczynać ( ) ) {
Seryjny. drukuj ( „Nie można znaleźć zegara RTC! Sprawdź obwód.” ) ;
chwila ( 1 ) ;
}
//odkomentuj poniższą linię podczas ustawiania czasu po raz pierwszy
//rtc.just(Data/godzina(__DATA__, __CZAS__));
wyświetlacz. wyczyść wyświetlacz ( ) ;
wyświetlacz. ustawkolor tekstu ( BIAŁY ) ;
wyświetlacz. ustawRozmiar Tekstu ( 2 ) ;
wyświetlacz. ustaw kursor ( 0 , 20 ) ;
wyświetlacz. wydrukować ( „ZEGAR RTC” ) ;
wyświetlacz. wyświetlacz ( ) ;
opóźnienie ( 5000 ) ;
}

próżnia pętla ( ) {
Data i godzina teraz = rtc. Teraz ( ) ;

wyświetlacz. wyczyść wyświetlacz ( ) ;
wyświetlacz. ustawRozmiar Tekstu ( 2 ) ;
wyświetlacz. ustaw kursor ( 75 , 0 ) ;
wyświetlacz. drukuj ( Teraz. drugi ( ) , GRUDZIEŃ ) ;
wyświetlacz. ustawRozmiar Tekstu ( 2 ) ;
wyświetlacz. ustaw kursor ( 25 , 0 ) ;
wyświetlacz. drukuj ( „:” ) ;
wyświetlacz. ustawRozmiar Tekstu ( 2 ) ;
wyświetlacz. ustaw kursor ( 65 , 0 ) ;
wyświetlacz. drukuj ( „:” ) ;
wyświetlacz. ustawRozmiar Tekstu ( 2 ) ;
wyświetlacz. ustaw kursor ( 40 , 0 ) ;
wyświetlacz. drukuj ( Teraz. minuta ( ) , GRUDZIEŃ ) ;
wyświetlacz. ustawRozmiar Tekstu ( 2 ) ;
wyświetlacz. ustaw kursor ( 0 , 0 ) ;
wyświetlacz. drukuj ( Teraz. godzina ( ) , GRUDZIEŃ ) ;
wyświetlacz. ustawRozmiar Tekstu ( 2 ) ;
wyświetlacz. ustaw kursor ( 0 , 25 ) ;
wyświetlacz. drukuj ( Teraz. dzień ( ) , GRUDZIEŃ ) ;
wyświetlacz. wydrukować ( dni [ Teraz. dzień tygodnia ( ) ] ) ;
wyświetlacz. ustawRozmiar Tekstu ( 2 ) ;
wyświetlacz. ustaw kursor ( 20 , 25 ) ;
wyświetlacz. drukuj ( „-” ) ;
wyświetlacz. ustawRozmiar Tekstu ( 2 ) ;
wyświetlacz. ustaw kursor ( 35 , 25 ) ;
wyświetlacz. drukuj ( Teraz. miesiąc ( ) , GRUDZIEŃ ) ;
wyświetlacz. ustawRozmiar Tekstu ( 2 ) ;
wyświetlacz. ustaw kursor ( 60 , 25 ) ;
wyświetlacz. drukuj ( „-” ) ;
wyświetlacz. ustawRozmiar Tekstu ( 2 ) ;
wyświetlacz. ustaw kursor ( 75 , 25 ) ;
wyświetlacz. drukuj ( Teraz. rok ( ) , GRUDZIEŃ ) ;
wyświetlacz. wyświetlacz ( ) ;
}

Wyjaśnienie kodu

Kod rozpoczął się od kilku ważnych bibliotek wymaganych dla ekranów RTC i OLED. Wyświetlacz OLED jest skonfigurowany przy użyciu biblioteki Adafruit SSD1306.

W części pętli bieżąca data i godzina są uzyskiwane za pomocą rtc.now(). Następnie ekran OLED zostanie wyczyszczony, a składowe czasu zostaną wyświetlone w formacie zegara cyfrowego. Możesz także zmodyfikować kod, aby dostosować format daty i godziny.

Po przesłaniu kodu na tablicę aktualny czas wyświetli się na ekranie OLED.

Notatka: Powyższy kod używa 0x3C Adres I2C dla OLED. Jest to najpopularniejszy adres I2C dostępny w wyświetlaczach OLED SSD1306. Jeśli chcesz znaleźć adres I2C dla swojego ekranu OLED, możesz uruchomić Kod skanera I2C .

Wniosek

DS3231 to czujnik RTC, którego można używać do pomiaru czasu. Posiada podtrzymanie bateryjne, które pozwala zachować dokładny czas nawet wtedy, gdy płyta mikrokontrolera jest wyłączona. Aby połączyć ESP2 z DS3231, musisz zainstalować bibliotekę RTClib w swoim Arduino IDE. Następnie należy podłączyć moduł RTC po protokole I2C za pomocą cyfrowego pinu ESP32. Po podłączeniu po prostu prześlij kod i dostosuj czas. Teraz czujnik RTC będzie rejestrował czas i można go odczytać na monitorze szeregowym w przypadku projektów opartych na czasie.