Spisu treści:
Wideo: Korzystanie z modułów zegara czasu rzeczywistego DS1307 i DS3231 z Arduino: 3 kroki
2024 Autor: John Day | [email protected]. Ostatnio zmodyfikowany: 2024-01-30 11:29
Ciągle otrzymujemy prośby dotyczące korzystania z modułów zegara czasu rzeczywistego DS1307 i DS3231 z Arduino z różnych źródeł – więc jest to pierwszy z dwuczęściowych samouczków na temat ich używania. W tym samouczku Arduino mamy do wykorzystania dwa moduły zegara czasu rzeczywistego, jeden oparty na Maxim DS1307 (moduł kwadratowy) i DS3231 (moduł prostokątny).
Istnieją dwie główne różnice między układami scalonymi w modułach zegara czasu rzeczywistego, a mianowicie dokładność pomiaru czasu. DS1307 zastosowany w pierwszym module działa bardzo dobrze, jednak temperatura zewnętrzna może wpływać na częstotliwość obwodu oscylatora, który steruje wewnętrznym licznikiem DS1307.
Może to brzmieć jak problem, jednak zwykle powoduje to, że zegar jest wyłączony o około pięć minut miesięcznie. DS3231 jest znacznie dokładniejszy, ponieważ ma wewnętrzny oscylator, na który nie mają wpływu czynniki zewnętrzne – dzięki czemu jego dokładność wynosi maksymalnie kilka minut rocznie. Jeśli masz moduł DS1307 - nie czuj się źle, nadal jest to świetna tablica wartościowa i będzie ci dobrze służyć. W przypadku obu modułów wymagana jest bateria zapasowa.
Dobrym pomysłem jest zakup nowej baterii CR2032 i zamontowanie jej do modułu. Oprócz śledzenia czasu i daty moduły te mają również małą pamięć EEPROM, funkcję alarmu (tylko DS3231) oraz możliwość generowania fali prostokątnej o różnych częstotliwościach – wszystko to będzie przedmiotem drugiego samouczka.
Krok 1: Podłączanie modułu do Arduino
Oba moduły wykorzystują magistralę I2C, co sprawia, że połączenie jest bardzo łatwe.
Najpierw musisz określić, które piny na twoim Arduino lub kompatybilnych płytkach są używane do magistrali I2C - będą to znane jako SDA (lub dane) i SCL (lub zegar). Na Arduino Uno lub kompatybilnych płytach te piny to A4 i A5 dla danych i zegara; W Arduino Mega piny to D20 i D21 dla danych i zegara; A jeśli używasz kompatybilnego z Pro Mini, piny to A4 i A5 dla danych i zegara, które są równoległe do głównych pinów.
Moduł DS1307
Jeśli masz moduł DS1307, będziesz musiał przylutować przewody do płytki lub przylutować do niektórych pinów inline, aby móc użyć przewodów połączeniowych. Następnie podłącz piny SCL i SDA do Arduino, a pin Vcc do pinu 5 V i GND do GND.
Moduł DS3231
Podłączenie tego modułu jest łatwe, ponieważ kołki nagłówkowe są fabrycznie zainstalowane na płytce. Możesz po prostu ponownie uruchomić przewody połączeniowe z SCL i SDA do Arduino i ponownie z pinów Vcc i GND modułu do 5 V lub 3,3 V i GND na płycie. Jednak są one duplikowane po drugiej stronie do lutowania własnych przewodów. Oba te moduły mają wymagane rezystory podciągające, więc nie musisz dodawać własnych. Podobnie jak w przypadku wszystkich urządzeń podłączonych do magistrali I2C, spróbuj ograniczyć długość przewodów SDA i SCL do minimum.
Krok 2: Odczytywanie i zapisywanie czasu z modułu RTC
Po podłączeniu modułu RTC. wprowadź i prześlij następujący szkic. Chociaż uwagi i funkcje w szkicu odnoszą się tylko do DS3231, kod działa również z DS1307.
#include "Wire.h"#define DS3231_I2C_ADDRESS 0x68 // Konwertuj normalne liczby dziesiętne na kodowany binarnie bajt dziesiętny decToBcd(byte val) { return((val/10*16) + (val%10)); } // Konwersja liczb dziesiętnych kodowanych binarnie na normalne liczby dziesiętne byte bcdToDec(byte val) { return((val/16*10) + (val%16)); } void setup() { Wire.begin(); Serial.początek(9600); // ustaw czas początkowy tutaj: // DS3231 sekundy, minuty, godziny, dzień, data, miesiąc, rok // setDS3231time(30, 42, 21, 4, 26, 11, 14); } void setDS3231time(byte second, byte minute, byte hour, byte dayOfWeek, byte dayOfMonth, byte month, byte year) { // ustawia datę i godzinę na DS3231 Wire.beginTransmission(DS3231_I2C_ADDRESS); Wire.write(0); // ustaw następne wejście, aby zaczynało się w sekundach register Wire.write(decToBcd(second)); // ustaw sekundy Wire.write(decToBcd(minuta)); // ustaw minuty Wire.write(decToBcd(hour)); // ustaw godziny Wire.write(decToBcd(dayOfWeek)); // ustaw dzień tygodnia (1=niedziela, 7=sobota) Wire.write(decToBcd(dayOfMonth)); // ustaw datę (1 do 31) Wire.write(decToBcd(miesiąc)); // ustaw miesiąc Wire.write(decToBcd(year)); // ustaw rok (0 do 99) Wire.endTransmission(); } void readDS3231time(bajt *sekunda, bajt *minuta, bajt *godzina, bajt *dzień tygodnia, bajt *dzień miesiąca, bajt *miesiąc, bajt *rok) { Wire.beginTransmission(DS3231_I2C_ADDRESS); Wire.write(0); // ustaw wskaźnik rejestru DS3231 na 00h Wire.endTransmission(); Wire.requestFrom(DS3231_I2C_ADDRESS, 7); // zażądaj siedmiu bajtów danych z DS3231 zaczynając od rejestru 00h *second = bcdToDec(Wire.read() & 0x7f); *minuta = bcdDoDec(Przewód.odczyt()); *godzina = bcdToDec(Wire.read() & 0x3f); *DzieńTygodnia = bcdDoDec(Przewód.odczyt()); *DzieńMiesiąca = bcdDoDec(Przewód.odczyt()); *miesiąc = bcdDoDec(Przewód.odczyt()); *rok = bcdDoDec(Przewód.odczyt()); } void displayTime() { bajt sekunda, minuta, godzina, dzień tygodnia, dzień miesiąca, miesiąc, rok; // pobierz dane z DS3231 readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); // wyślij go do monitora szeregowego Serial.print(hour, DEC); // po wyświetleniu konwertuj zmienną bajtową na liczbę dziesiętną Serial.print(":"); if (minuta<10) { Serial.print("0"); } Serial.print(minuta, DEC); Serial.print(":"); if (drugi<10) { Serial.print("0"); } Serial.print(drugi, DEC); Serial.print(" "); Serial.print(dzieńMiesiąca, grudzień); Serial.print("/"); Serial.print(miesiąc, grudzień); Serial.print("/"); Serial.print(rok, grudzień); Serial.print(" Dzień tygodnia: "); switch(dayOfWeek){ przypadek 1: Serial.println("Niedziela"); przerwa; przypadek 2: Serial.println("Poniedziałek"); przerwa; przypadek 3: Serial.println("Wtorek"); przerwa; przypadek 4: Serial.println("środa"); przerwa; przypadek 5: Serial.println("Czwartek"); przerwa; przypadek 6: Serial.println("piątek"); przerwa; przypadek 7: Serial.println("sobota"); przerwa; } } void loop() { displayTime(); // wyświetl dane zegara czasu rzeczywistego na monitorze szeregowym, delay(1000); // każda sekunda }
Kodu może być dużo, ale dobrze rozbija się na łatwe do zarządzania części.
Najpierw zawiera bibliotekę Wire, która jest używana do komunikacji magistrali I2C, a następnie definiuje adres magistrali dla RTC jako 0x68. Po nich następują dwie funkcje, które konwertują liczby dziesiętne na BCD (dziesiętny kodowany binarnie) i na odwrót. Są one niezbędne, ponieważ układy scalone RTC działają w BCD, a nie w systemie dziesiętnym.
Funkcja setDS3231time() służy do ustawiania zegara. Korzystanie z niego jest bardzo łatwe, wystarczy wstawić wartości od roku do sekundy, a RTC rozpocznie się od tego czasu. Na przykład, jeśli chcesz ustawić następującą datę i godzinę – środa 26 listopada 2014 i 21:42 i 30 sekund – użyjesz:
setDS3231time (30, 42, 21, 4, 26, 11, 14);
Krok 3:
Zwróć uwagę, że czas jest ustawiany w formacie 24-godzinnym, a czwartym parametrem jest „dzień tygodnia”. To przypada między 1 a 7, czyli odpowiednio od niedzieli do soboty. Te parametry są wartościami bajtów, jeśli zastępujesz własne zmienne.
Po uruchomieniu funkcji dobrze jest poprzedzić ją przedrostkiem // i ponownie wgrać kod, aby nie zresetować czasu po wyłączeniu zasilania lub zresetowaniu mikrokontrolera. Odczytywanie czasu z RTC Jest tak samo proste, w rzeczywistości proces można dokładnie śledzić w funkcji displayTime(). Będziesz musiał zdefiniować siedmiobajtowe zmienne do przechowywania danych z RTC, które są następnie wstawiane do funkcji readDS3231time(). Na przykład, jeśli twoje zmienne to:
bajt sekunda, minuta, godzina, dzień tygodnia, dzień miesiąca, miesiąc, rok;
…odświeżyłbyś je aktualnymi danymi z RTC używając:
readDS3232time(&sekunda, &minuta, &godzina, &dzień tygodnia, &dzień miesiąca, &miesiąc, &rok);
Następnie możesz używać zmiennych według własnego uznania, od wysyłania godziny i daty do monitora szeregowego, tak jak robi to przykładowy szkic, po konwertowanie danych do odpowiedniej formy dla wszelkiego rodzaju urządzeń wyjściowych.
Aby sprawdzić, czy wszystko działa, wprowadź odpowiednią godzinę i datę do szkicu demonstracyjnego, prześlij go, skomentuj funkcję setDS3231time() i prześlij ponownie. Następnie otwórz monitor szeregowy i powinieneś otrzymać bieżący wyświetlacz aktualnej godziny i daty.
Od tego momentu masz teraz narzędzia programowe do ustawiania danych i pobierania ich z modułu zegara czasu rzeczywistego i mamy nadzieję, że rozumiesz, jak korzystać z tych niedrogich modułów.
Więcej informacji o poszczególnych układach zegara czasu rzeczywistego można znaleźć na stronie producenta – DS1307 i DS3231.
Ten post został dostarczony przez pmdway.com - wszystko dla producentów i entuzjastów elektroniki, z bezpłatną dostawą na całym świecie.
Zalecana:
Jak korzystać z modułu zegara czasu rzeczywistego (DS3231): 5 kroków
Jak korzystać z modułu zegara czasu rzeczywistego (DS3231): DS3231 to tani, niezwykle dokładny zegar czasu rzeczywistego (RTC) I2C ze zintegrowanym oscylatorem kwarcowym z kompensacją temperatury (TCXO) i kryształem. Urządzenie zawiera wejście baterii i utrzymuje dokładny pomiar czasu, gdy główne zasilanie
Dokładne, szybkie i automatyczne ustawianie DS3231 RTC (zegar czasu rzeczywistego) za pomocą języka Java (+-1 s): 3 kroki
Dokładne, szybkie i automatyczne ustawianie zegara czasu rzeczywistego DS3231 (zegar czasu rzeczywistego) za pomocą języka Java (+-1 s): Ta instrukcja pokaże, jak ustawić czas w zegarze czasu rzeczywistego DS3231 za pomocą Arduino i małej aplikacji Java, która używa połączenie szeregowe Arduino.Podstawowa logika tego programu:1. Arduino wysyła żądanie szeregowe
Zegar oparty na Arduino wykorzystujący moduł zegara czasu rzeczywistego DS1307 (RTC) i 0,96: 5 kroków
Zegar oparty na Arduino wykorzystujący moduł zegara czasu rzeczywistego DS1307 (RTC) i 0,96: Cześć, w tym samouczku zobaczymy, jak zrobić działający zegar za pomocą modułu zegara czasu rzeczywistego DS1307 i amp; Wyświetlacze OLED. Czyli odczytamy czas z modułu zegara DS1307. I wydrukuj to na ekranie OLED
Tworzenie zegara za pomocą M5stick C przy użyciu Arduino IDE - Zegar czasu rzeczywistego RTC z M5stack M5stick-C: 4 kroki
Tworzenie zegara za pomocą M5stick C przy użyciu Arduino IDE | Zegar czasu rzeczywistego RTC z M5stack M5stick-C: Cześć chłopaki, w tej instrukcji dowiemy się, jak zrobić zegar za pomocą płytki rozwojowej m5stick-C m5stack przy użyciu Arduino IDE. Tak więc m5stick wyświetli datę, godzinę i amp; tydzień miesiąca na wyświetlaczu
Zegar cyfrowy za pomocą wewnętrznego zegara czasu rzeczywistego STM32L476: 5 kroków
Zegar cyfrowy wykorzystujący wewnętrzny zegar RTC STM32L476: Ten samouczek prowadzi do tworzenia zegara cyfrowego w domu i może działać tak długo, jak jest zasilany ze źródła zasilania. Wykorzystuje wewnętrzne rejestry mikrokontrolera i nie wymaga zewnętrznego zegara RTC