Spisu treści:

Korzystanie z modułów zegara czasu rzeczywistego DS1307 i DS3231 z Arduino: 3 kroki
Korzystanie z modułów zegara czasu rzeczywistego DS1307 i DS3231 z Arduino: 3 kroki

Wideo: Korzystanie z modułów zegara czasu rzeczywistego DS1307 i DS3231 z Arduino: 3 kroki

Wideo: Korzystanie z modułów zegara czasu rzeczywistego DS1307 i DS3231 z Arduino: 3 kroki
Wideo: 29. Jak za pomocą Arduino i modułu RTC DS1307 zrobić zegar? 2024, Listopad
Anonim
Korzystanie z modułów zegara czasu rzeczywistego DS1307 i DS3231 z Arduino
Korzystanie z modułów zegara czasu rzeczywistego DS1307 i DS3231 z Arduino
Korzystanie z modułów zegara czasu rzeczywistego DS1307 i DS3231 z Arduino
Korzystanie z modułów zegara czasu rzeczywistego DS1307 i DS3231 z Arduino

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: