Zegar czasu rzeczywistego ESP32 (RTC) wykorzystujący DS1307 i wyświetlacz OLED

Zegar Czasu Rzeczywistego Esp32 Rtc Wykorzystujacy Ds1307 I Wyswietlacz Oled



ESP32 ma wbudowany moduł RTC, ale działa on tylko wtedy, gdy jest zasilanie. W przypadku utraty zasilania zegar zostanie zresetowany i nie będzie mógł wskazywać prawidłowego czasu. Jeśli więc chcesz śledzić czas lub sterować dowolnym urządzeniem opartym na czasie, wypróbuj czujnik RTC DS1307. Możesz jednak pomyśleć o podłączeniu akumulatora zapasowego do płyty ESP32, ale nie jest to najlepszy scenariusz, jeśli masz niedobór zasilania. Najlepszą alternatywą jest użycie czujnika DS1307, ponieważ jest on wyposażony w wbudowaną baterię, która wytrzymuje co najmniej rok.

Aby wszystko było jasne, wewnętrzny zegar czasu rzeczywistego (RTC) ESP32 może śledzić czas nawet wtedy, gdy główny procesor jest wyłączony lub znajduje się w stanie głębokiego uśpienia. Możesz użyć ESP32 RTC do śledzenia czasu bez zużywania dużej ilości energii i wpływu na główny procesor. Ale nadal wymaga zasilania, nie aż tak dużo, ale do działania wewnętrznego zegara RTC wymagana jest minimalna ilość energii.

Pozostaje nam zatem jedynie rozwiązanie polegające na zastosowaniu zewnętrznego modułu RTC. Przyjrzyjmy się etapom łączenia płytki ESP32 z modułem RTC DS1307.







Zawartość:

1. Co to jest moduł RTC DS1307

DS1307 to urządzenie o niskim poborze mocy, które może dokładnie śledzić czas i datę. Używa formatu dziesiętnego kodowanego binarnie (BCD). Może wyświetlać czas w szczegółowym formacie, takim jak sekundy, minuty, a nawet godziny i dni. Można także wydrukować datę w pełnym formacie, takim jak miesiąc i rok. Wie też, kiedy jest rok przestępny, do 2100. Do komunikacji z DS1307 można wykorzystać protokół I2C.





DS1307 posiada wbudowany akumulator, który może zasilać go przez około rok bez zewnętrznego źródła 5V. Dzięki tej baterii podtrzymującej może zachować czas nawet przy wyłączonym głównym zasilaniu. Posiada również 56 bajtów pamięci SRAM do przechowywania niektórych danych. DS1307 to poręczne urządzenie, które w połączeniu z płytką Arduino lub ESP32 ma wiele zastosowań. Dane te mogą być na przykład pomocne w rejestrowaniu danych, systemach alarmowych lub sterowaniu przemysłowym. Jeśli potrzebujesz niezawodnego pomiaru czasu, DS1307 jest świetną opcją.





Dane techniczne modułu RTC DS1307

Moduł RTC DS1307 składa się z układu scalonego RTC, pamięci EEPROM, oscylatora kwarcowego i uchwytu baterii zapasowej.



Poniżej szczegóły tych części:

Układ scalony RTC DS1307 : Układ scalony RTC DS1307 to 8-pinowy układ scalony, który śledzi czas i datę za pomocą protokołu I2C. Zużywa bardzo mało energii, mniej niż 500nA. Może wyświetlać czas w sekundach, minutach i godzinach oraz datę w dniach, miesiącach i latach. Może także przełączać się między formatem 24-godzinnym i 12-godzinnym.

Układ scalony EEPROM 24C32 : Układ scalony EEPROM 24C32 to 32-bajtowy układ firmy Atmel, który przechowuje ustawienia, godzinę i datę. Wykorzystuje również protokół I2C.

Kryształ 32,768 kHz : Oscylator kwarcowy 32,768 kHz zapewnia częstotliwość zegara dla układu scalonego DS1307 RTC.

Uchwyt baterii : Uchwyt baterii mieści baterię CR2032. Jest to bateria pastylkowa litowa 3V. Zapewnia ciągłą moc układu scalonego DS1307 RTC.

Dostawa czujnika DS18B20 : Dzięki wyposażeniu w czujnik DS18B20 można lutować i używać czujnika temperatury DS18B20. Nie jest wstępnie lutowany. Można wlutować pakiet przewlekany i zmierzyć temperaturę z pinu DS modułu.

Poniższa lista zawiera krótkie specyfikacje czujnika RTC DS1307:

  • Napięcie robocze: 4,5–5,5 V, typowo 5 V
  • Obecne zużycie : Mniej niż 1,5 mA
  • Dokładność : 0–40 °C, zależy od kryształu
  • Bateria : CR2032 (moneta 3 V)
  • Pamięć : 56 bajtów nieulotnej pamięci RAM
  • Interfejs : Dwuprzewodowy (I2C) interfejs szeregowy
  • Wyjście : Pin wyjściowy 1 Hz
  • Programowalne wyjście fali prostokątnej : Zużywa mniej niż 500 nA w trybie zasilania awaryjnego
  • Wykrywanie awarii zasilania : Automatyczne wykrywanie awarii zasilania i obwody przełączające
  • Obwód wyczuwania mocy : Może automatycznie przełączać się na zasilanie rezerwowe w przypadku braku zasilania
  • Rekompensata za rok przestępny : Obowiązuje do roku 2100

Układ pinów modułu RTC DS1307

Moduł posiada kilka pinów o różnych funkcjach.

  • VCC to pin, który do zasilania modułu potrzebuje napięcia stałego od 3,3 V do 5,5 V.
  • GND jest pinem niskiego napięcia lub masy.
  • SDA I SCL to piny przesyłające dane i sygnały zegara za pośrednictwem magistrali I2C.
  • DS to pin mierzący temperaturę czujnikiem DS1307 jeśli taki posiadasz na module RTC.
  • kw to pin generujący sygnał prostokątny o częstotliwości 1 Hz, 4 kHz, 8 kHz lub 32 kHz, w zależności od tego, jak go zaprogramujesz.
  • JEDEN to pin, który wykorzystuje baterię 3 V, aby zapewnić dokładny czas, gdy główne zasilanie jest wyłączone.

2. Jak połączyć RTC DS1307 i wyświetlacz OLED z ESP32

Aby połączyć ESP32 z DS1307 i wyświetlaczem OLED, możesz użyć wbudowanych pinów I2C płyty ESP32. Zarówno DS1307, jak i wyświetlacz OLED są urządzeniami opartymi na I2C. Następnie można komunikować się za pomocą protokołu I2C master-slave przez magistralę I2C.

Zanim przejdziemy do połączenia ESP32 z DS1307 i wyświetlaczem OLED, najpierw musisz zainstalować kilka wymaganych bibliotek.

Instalowanie wymaganych bibliotek

Będziesz potrzebować dwóch bibliotek, jednej dla modułu RTC i jednej dla wyświetlacza OLED. Używając OLED z modułem RTC, możesz tworzyć niesamowite i interaktywne podglądy zegara. Jeśli nie planujesz wyświetlania czasu na ekranie, możesz pominąć instalację biblioteki.

Poniżej znajdują się dwie biblioteki, których będziesz potrzebować:

  • RTClib (autorstwa Adafruit) to biblioteka Arduino IDE do ustawiania i pobierania czasu z RTC. Zawiera także klasy umożliwiające manipulowanie datami, godzinami i czasem trwania. Korzystając z tej biblioteki, można łączyć i programować moduły zegara czasu rzeczywistego (RTC), takie jak DS1307 i DS3231.
  • S SD1306 (autorstwa Adafruit) to biblioteka dla Arduino, za pomocą której można łączyć i programować wyświetlacze OLED z Arduino lub dowolną inną płytką mikrokontrolera.

Aby pobrać i zainstalować obie te biblioteki w Arduino IDE, najpierw otwórz plik Kierownik Biblioteki wyszukaj bibliotekę RTClib i kliknij zainstalować :

Otrzymasz możliwość zainstalowania samej biblioteki lub jej zależności. Kliknij Zainstaluj wszystko przycisk, aby całkowicie zainstalować bibliotekę. W ten sposób nie otrzymasz żadnego błędu, jeśli zmodyfikujesz kod, który zależy od zależności tej biblioteki.

Podobnie wyszukaj bibliotekę SSD1306. Ta biblioteka jest potrzebna dla wyświetlacza OLED. Kliknij zainstalować kontynuować.

Tym razem otrzymasz również tę samą wiadomość z potwierdzeniem. Kliknij na Zainstaluj wszystko opcja.

Teraz obie biblioteki dla OLED i DS1307 są zainstalowane i gotowe do użycia. Ale wcześniej najpierw znajdź adres I2C wyświetlacza OLED.

3. Znalezienie adresu I2C wyświetlacza OLED

Adres I2C jest unikalnym identyfikatorem każdego urządzenia na magistrali I2C. Umożliwia urządzeniu nadrzędnemu komunikację z określonym urządzeniem podrzędnym poprzez wysyłanie danych na jego adres. Celem adresu I2C jest uniknięcie konfliktów i pomyłek między wieloma urządzeniami na tej samej magistrali.

Aby uzyskać adres urządzenia I2C, możesz użyć a prosty szkic, który skanuje autobus i drukuje adresy znalezionych urządzeń. Alternatywnie możesz sprawdzić arkusz danych urządzenia, aby zobaczyć jego domyślny lub konfigurowalny adres.

Tutaj w naszym przypadku po uruchomieniu kodu skanera I2C na terminalu Arduino IDE wyświetlany jest następujący adres I2C ekranu OLED.

W większości przypadków istnieje duża szansa, że ​​Ty również otrzymasz to samo 0x3C adres ekranu OLED.

4. Połączenie modułu OLED i RTC DS1307 z ESP32

1. Połącz piny SDA i SCL zarówno modułu DS1307, jak i Wyświetlacz OLED na piny I2C z ESP32. Zazwyczaj, są to GPIO 21 i GPIO 22 , ale w razie potrzeby możesz przypisać w kodzie dowolne inne piny.

2. Podłącz VCC i GND DS1307 oraz wyświetlacz OLED do pinów 3,3 V i GND ESP32.

3. Włóż baterię pastylkową CR2032 do modułu DS1307, aby zapewnić zasilanie awaryjne zegara czasu rzeczywistego.

4. Prześlij przykładowy kod z tego tutoriala na swoją płytkę ESP32. Zmodyfikuj kod dla niestandardowych wyników.

Po przesłaniu zegar uruchomi się od ustawionej godziny i wyświetli godzinę na ekranie OLED.

5. Schemat obwodu

Schemat obwodu ESP32 z DS1307 jest prosty i wymaga podłączenia tylko czterech przewodów. Można skrócić przewody I2C SDA i SCL obu czujników OLED i DS1307. Podobnie do zasilania obu tych czujników można wykorzystać pin 3V3 i GND płytki ESP32. W razie potrzeby można także zasilać z osobnego źródła.

Notatka : Można bezpiecznie zasilać RTC DS1307 z pinu 3,3 V ESP32, jeśli limit prądu ESP32 nie zostanie przekroczony. Jeśli jednak chcesz być w bezpiecznym miejscu, możesz albo użyć osobnego źródła zasilania dla modułu RTC, albo wypróbować czujnik DS3231 o małej mocy, którego zakres roboczy wynosi od 3,3 do 5,5 VDC.

Poniższy obrazek ilustruje połączenie ESP32 z czujnikiem RTC DS1307.

Podobnie, jeśli chcesz podłączyć ekran OLED do wyświetlania czasu, możesz użyć tych samych pinów I2C i pinów zasilania płytki ESP32.

6. Kod

Za pomocą poniższego kodu ustawimy aktualną datę i godzinę na RTC. Po ustawieniu czasu kod wyświetli czas na terminalu Arduino IDE. Zanim prześlesz kod, musisz go zaktualizować, podając aktualną datę i godzinę.

#include „RTClib.h”
RTC_DS1307 DS1307_RTC;
char Tydzień_dni [ 7 ] [ 12 ] = { 'Niedziela' , 'Poniedziałek' , 'Wtorek' , 'Środa' , 'Czwartek' , 'Piątek' , 'Sobota' } ;
pusta konfiguracja ( ) {
Początek numeru seryjnego ( 115200 ) ;
#ifndef ESP8266
chwila ( ! Seryjny ) ;
#endif
Jeśli ( ! DS1307_RTC.begin ( ) ) {
Numer seryjny.drukuj ( „Nie można znaleźć RTC” ) ;
chwila ( 1 ) ;
}
Regulacja DS1307_RTC ( DataGodzina ( F ( __DATA__ ) , F ( __CZAS__ ) ) ) ;
}
pusta pętla ( ) {
DateTime teraz = DS1307_RTC.now ( ) ;
Wydruk seryjny ( teraz.rok ( ) , GRUDZIEŃ ) ;
Wydruk seryjny ( „/” ) ;
Wydruk seryjny ( teraz.miesiąc ( ) , GRUDZIEŃ ) ;
Wydruk seryjny ( „/” ) ;
Wydruk seryjny ( teraz.dzień ( ) , GRUDZIEŃ ) ;
Wydruk seryjny ( „(” ) ;
Wydruk seryjny ( Dni tygodnia [ teraz.dzieńTygodnia ( ) ] ) ;
Wydruk seryjny ( ') ' ) ;
Wydruk seryjny ( teraz.godzina ( ) , GRUDZIEŃ ) ;
Wydruk seryjny ( ':' ) ;
Wydruk seryjny ( teraz.minuta ( ) , GRUDZIEŃ ) ;
Wydruk seryjny ( ':' ) ;
Wydruk seryjny ( teraz.drugi ( ) , GRUDZIEŃ ) ;
Numer seryjny.drukuj ( ) ;
opóźnienie ( 1000 ) ;
}

Ten kod używa Biblioteka RTClib do współpracy z modułem zegara czasu rzeczywistego DS1307, który śledzi datę i godzinę.

The organizować coś funkcja rozpoczęła się od inicjalizacji szybkości transmisji. Następnie w tej sekcji zdefiniowaliśmy funkcję synchronizacji daty i godziny komputera z czujnikiem DS1307. Spowoduje to przesłanie czasu kompilacji kodu do czujnika RTC.

Możesz skorzystać z pętla funkcja pobierania daty i godziny z RTC. Następnie możesz wyświetlić go na monitorze szeregowym w następujący sposób: rok/miesiąc/dzień (dzień tygodnia) godzina:minuta:sekunda. Pamiętaj, aby dodać jednosekundowe opóźnienie po każdej pętli, aby kod nie działał zbyt szybko.

Wyświetl aktualny czas na wyświetlaczu OLED

Aby wyświetlić ten sam czas na ekranie OLED, musimy dodać dodatkową część kodu dla ekranu OLED. Wystarczy przesłać podany kod. Ten kod wyświetli aktualny czas na ekranie OLED.

Pamiętaj, że tutaj używamy modułu wyświetlacza OLED SSD 0,96 cala 128 × 64 I2C I2C. Jeśli używasz innego rozmiaru, zmodyfikuj odpowiednio kod. Sprawdź także adres I2C i zmodyfikuj go w podanym kodzie. W naszym przypadku mamy adres I2C 0x3C dla ekranu OLED.

#include
#include
#include
#include „RTClib.h”
#zdefiniuj SZEROKOŚĆ EKRANU 128
#zdefiniuj SCREEN_HEIGHT 64

Wyświetlacz Adafruit_SSD1306 ( SCREEN_WIDTH, SCREEN_HEIGHT, & Drut, - 1 ) ;
RTC_DS1307 RTC;
dni char [ 7 ] [ 12 ] = { 'Niedziela' , 'Poniedziałek' , 'Wtorek' , 'Środa' , 'Czwartek' , 'Piątek' , 'Sobota' } ;
pusta konfiguracja ( ) {
Początek numeru seryjnego ( 115200 ) ;
Jeśli ( ! Rozpocznij RTC ( ) ) {
Numer seryjny.drukuj ( „Nie można znaleźć RTC” ) ;
chwila ( 1 ) ;
}
Regulacja RTC ( DataGodzina ( F ( __DATA__ ) , F ( __CZAS__ ) ) ) ;
Jeśli ( ! wyświetl.rozpocznij ( SSD1306_SWITCHCAPVCC, 0x3C ) ) {
Numer seryjny.drukuj ( F ( „Alokacja dysku SSD1306 nie powiodła się” ) ) ;
Do ( ;; ) ;
}
opóźnienie ( 1000 ) ;
wyświetlacz.wyczyśćWyświetl ( ) ;
display.setTextSize ( 2 ) ;
display.setTextColor ( BIAŁY ) ;
display.setCursor ( 30 , 20 ) ;
display.println ( „Linux” ) ;
wyświetlacz.wyświetlacz ( ) ;
opóźnienie ( 3000 ) ;
wyświetlacz.wyczyśćWyświetl ( ) ;
}
pusta pętla ( ) {
DateTime teraz = RTC.now ( ) ;
wyświetlacz.wyczyśćWyświetl ( ) ;
display.setTextSize ( 2 ) ;
display.setCursor ( 0 , 0 ) ;
wyświetlacz.drukuj ( teraz.dzień ( ) ) ;
wyświetlacz.drukuj ( „/” ) ;
wyświetlacz.drukuj ( teraz.miesiąc ( ) ) ;
wyświetlacz.drukuj ( „/” ) ;
wyświetlacz.drukuj ( teraz.rok ( ) ) ;
display.println ( dni [ teraz.dzieńTygodnia ( ) ] ) ;
display.println ( '' ) ;
display.setCursor ( 0 , 40 ) ;
Jeśli ( teraz.godzina ( ) < 10 )
wyświetlacz.drukuj ( „0” ) ;
wyświetlacz.drukuj ( teraz.godzina ( ) ) ;
wyświetlacz.drukuj ( ':' ) ;
Jeśli ( teraz.minuta ( ) < 10 )
wyświetlacz.drukuj ( „0” ) ;
wyświetlacz.drukuj ( teraz.minuta ( ) ) ;
wyświetlacz.drukuj ( ':' ) ;
Jeśli ( teraz.drugi ( ) < 10 )
wyświetlacz.drukuj ( „0” ) ;
display.println ( teraz.drugi ( ) ) ;
wyświetlacz.wyświetlacz ( ) ;
}

Kod zaczął się od bibliotek, które zainstalowaliśmy dla zegara RTC i wyświetlacza. Następnie określa rozmiar ekranu i adres wyświetlania. Inicjuje tablicę nazwami dni tygodnia.

The organizować coś część zaczyna się od komunikacji szeregowej. Sprawdza, czy RTC i wyświetlacz działają, czy nie. Następnie zdefiniowaliśmy ciąg tekstowy „Linuxhint”, który będzie wyświetlany przez 3 sekundy. To jest tylko wiadomość otwierająca lub startowa. Możesz także zmodyfikować tę wiadomość, dodając własny tekst.

The pętla funkcja pobiera datę i godzinę modułu DS1307. Następnie czyści wyświetlacz i drukuje datę i godzinę w sformatowany sposób. Kod dodaje również zera początkowe do godzin, minut i sekund, jeśli ich wartości są mniejsze niż 10.

7. Sprzęt

Po przesłaniu kodu na kartę ESP32 na ekranie OLED zobaczysz następujące dane wyjściowe. Jeśli chodzi o sprzęt, wykorzystaliśmy ekran OLED i moduł I2C RTC DS1307. Zastosowano płytkę ESP32 z 30 pinami. Możesz także eksperymentować z dowolną inną płytą ESP32, ale pamiętaj o prawidłowym podłączeniu pinów I2C.

Wniosek

RTC DS1307 ma 56-bajtową pamięć SRAM z obsługą podtrzymania bateryjnego. Jest to urządzenie 8-pinowe, które wykorzystuje protokół komunikacyjny I2C. Aby połączyć moduł RTC DS1307 z ESP32, można użyć pinów I2C (GPIO 22 (SCL) i GPIO 21 (SDA)) płytki ESP32. Możesz wydrukować czas na konsoli Arduino IDE lub użyć dowolnego ekranu, takiego jak OLED lub I2C LCD, aby wyświetlić czas. Moduł RTC DS1307 to przydatne urządzenie do śledzenia czasu i daty w różnych zastosowaniach. Niektóre główne zastosowania obejmują rejestratory danych, zegary cyfrowe i inteligentne zegarki.