Zegar czasu rzeczywistego RTC DS3231
DS3231 jest bardzo precyzyjnym układem RTC służącym do odmierzania czasu, często spotykanym w niektórych modułach dla Arduino.
Jego ogromną zaletą jest brak konieczności podłączania zewnętrznego rezonatora kwarcowego oraz wbudowany termometr do kompensacji temperaturowej.
Jeśli przypomnimy sobie, jaki wpływ ma temperatura na standardowy kwarc zegarkowy, stosowany w opisywanym niedawno DS1307 i jakie może mieć to skutki po upływie miesiąca czasu, to z pewnością docenicie dokładność jaką oferuje DS3231, która wynosi stałe ±2ppm w zakresie temperatur 0°C ÷ 40°C oraz ±3.5ppm w zakresie temperatur -40°C ÷ 85°C. Tak duża dokładność gwarantuje maksymalną odchyłkę odmierzanego czasu do około 1 minuty w skali roku.
DS3231 pozwala również na bezpośredni odczyt temperatury z wbudowanego termometru, konfigurację dwóch alarmów obsługujących przerwania, a także generator przebiegu prostokątnego o zadanej częstotliwości 1Hz ÷ 32768Hz. Posiada również dodatkowe wyjście o stałym sygnale prostokątnym o częstotliwości 32kHz.
Układ DS3231 dostępny jest jedynie w obudowie SOIC:
Dokumentacja techniczna: https://www.jarzebski.pl/datasheets/DS3231.pdf
Schemat połączeń
Sposób podłączenia DS3231 jest bardzo podobny do układu DS1307. Podłączamy więc zasilanie 5V (nóżka 2) oraz masę GND (nóżka 13). Bardzo ważne jest, aby również podłączyć do masy wszystkie wyprowadzenia oznaczone jako NC (nóżki 5,6,7,8,9,10,11,12). DS3231 również komunikuje się z Arduino za pomocą magistrali I2C, a więc łączymy SCL (nóżka 16) do pinu A5, a SDA (nóżka 15) do pinu A4. Na koniec nie zapomnijmy podciągnąć linii sygnałowych rezystorami o wartości 10kΩ do zasilania 5V. Baterię 3V podłączamy natomiast do VBAT (nóżka 14). Wyjścia SQW/OUT oraz 32kHz, również podciągamy rezystorami o wartości 10kΩ do zasilania 5V. Jest to zabieg niezbędny, ponieważ i tutaj wyjścia działają w układzie otwartego drenu. Dlatego, jeśli chcemy wykorzystać do nich diodę LED, należy podłączyć tutaj katodę - anodę zaś do masy. Jeśli nie planujemy korzystać z SQW/OUT oraz wyjścia sygnału 32kHz, możemy pozostawić je "w powietrzu".
Ja zamiast zasilania bateryjnego wykorzystałem napięcie 3.3V z Arduino oraz podłączyłem sobie diody LED do sygnalizacji stanów na wyjściach z rezystorami 220Ω.
Prosty przykład
Do obsługi modułów z układami DS3231 przygotowałem bibliotekę dla Arduino, którą można pobrać z repozytorium Git: https://github.com/jarzebski/Arduino-DS3231. Bazuje ona bibliotekach JeeLabs oraz Adafruit, jednak oferuje ona dodatkowe funkcje do sterowania wyjściami SQW/OUT oraz 32kHz, ustawiania alarmów oraz formatowanie daty na wzór funkcji date() znanej z języka PHP.
- #include <Wire.h>
- #include <DS3231.h>
- DS3231 clock;
- RTCDateTime dt;
- void setup()
- {
- Serial.begin(9600);
- // Inicjalizacja DS3231
- Serial.println("Initialize DS3231");;
- clock.begin();
- // Ustawiany date i godzine kompilacji szkicu
- clock.setDateTime(__DATE__, __TIME__);
- }
- void loop()
- {
- // Odczytujemy i wyswietlamy czas
- dt = clock.getDateTime();
- Serial.print("Raw data: ");
- Serial.print(dt.year); Serial.print("-");
- Serial.print(dt.month); Serial.print("-");
- Serial.print(dt.day); Serial.print(" ");
- Serial.print(dt.hour); Serial.print(":");
- Serial.print(dt.minute); Serial.print(":");
- Serial.print(dt.second); Serial.println("");
- delay(1000);
- }
Formatowanie daty
Jeśli chcemy wyświetlić czas i datę w odpowiednim dla nas formacie, możemy skorzystać z funkcji dateFormat().
- #include <Wire.h>
- #include <DS3231.h>
- DS3231 clock;
- RTCDateTime dt;
- void setup()
- {
- Serial.begin(9600);
- // Inicjalizacja DS3231
- Serial.println("Initialize DS3231");;
- clock.begin();
- // Ustawiamy date i czas z kompilacji szkicu
- clock.setDateTime(__DATE__, __TIME__);
- // Lub recznie (YYYY, MM, DD, HH, II, SS
- // clock.setDateTime(2014, 4, 13, 19, 21, 00);
- }
- void loop()
- {
- // Odczytujemy czas i formatujemy za pomoca funkcji dateFormat
- dt = clock.getDateTime();
- Serial.print("Long number format: ");
- Serial.println(clock.dateFormat("d-m-Y H:i:s", dt));
- Serial.print("Long format with month name: ");
- Serial.println(clock.dateFormat("d F Y H:i:s", dt));
- Serial.print("Short format witch 12h mode: ");
- Serial.println(clock.dateFormat("jS M y, h:ia", dt));
- Serial.print("Today is: ");
- Serial.print(clock.dateFormat("l, z", dt));
- Serial.println(" days of the year.");
- Serial.print("Actual month has: ");
- Serial.print(clock.dateFormat("t", dt));
- Serial.println(" days.");
- Serial.print("Unixtime: ");
- Serial.println(clock.dateFormat("U", dt));
- Serial.println();
- delay(1000);
- }
Sterowanie wyjściem 32kHz oraz SQW/INT
W poniższym przykładzie możemy zobaczyć jak włączyć lub wyłączyć generator przebiegu prostokątnego na wyjściu 32kHz oraz ustawić interesujący nas przebieg prostokątny na wyjściu SQW. Sygnał SQW możemy wykorzystać do obsługi przerwania lub podłączyć diodę LED jako sygnalizator sekund, oszczędzając tym samym cyfrowy pin Arduino. Kiedy będziemy mieli zamiar skorzystać z alarmów to wyjście SQW/INT będzie nam służyło właśnie do obsługi przerwań.
- #include <Wire.h>
- #include <DS3231.h>
- DS3231 clock;
- boolean state;
- void setup()
- {
- Serial.begin(9600);
- // Inicjalizyjemy DS3231
- Serial.println("Initialize DS3231");;
- clock.begin();
- // Wylaczamy wyjscie 32kHz
- clock.enable32kHz(false);
- // Ustawiamy wyjscie SQW na sygnal 1Hz
- clock.setOutput(DS3231_1HZ);
- // Wlaczamy wyjsscie SQW
- clock.enableOutput(true);
- if (clock.isOutput())
- {
- Serial.println("Oscilator is enabled");
- } else
- {
- Serial.println("Oscilator is disabled");
- }
- switch (clock.getOutput())
- {
- case DS3231_1HZ: Serial.println("SQW = 1Hz"); break;
- case DS3231_4096HZ: Serial.println("SQW = 4096Hz"); break;
- case DS3231_8192HZ: Serial.println("SQW = 8192Hz"); break;
- case DS3231_32768HZ: Serial.println("SQW = 32768Hz"); break;
- default: Serial.println("SQW = Unknown"); break; }
- }
- void loop()
- {
- // Wlaczamy i wylaczamy wyjscie 32kHz co 2 sekundy
- clock.enable32kHz(state);
- state = !state;
- delay(2000);
- }
Odczyt temperatury z wbudowanego czujnika
DS3231 pozwala nam również na dostęp do wbudowanego termometru o rozdzielczości 10-bitów. Co daje nam odczyt z precyzją 0.25°C i dokładnością ±3°C. Domyślnie pomiar temperatury odbywa się co 64 sekundy na potrzeby kompensacji , jednak możemy wymusić ponowny pomiar za pomocą funkcji forceConversion().
- #include <Wire.h>
- #include <DS3231.h>
- DS3231 clock;
- RTCDateTime dt;
- void setup()
- {
- Serial.begin(9600);
- // Inicjalizyjemy DS3231
- Serial.println("Initialize DS3231");;
- clock.begin();
- }
- void loop()
- {
- // Wymuszamy konwersje temperatury, poniweaz domyslnie jest ona odswiezana co 64 sekundy
- clock.forceConversion();
- Serial.print("Temperature: ");
- Serial.println(clock.readTemperature());
- delay(1000);
- }
Konfiguracja alarmów
Układ pozwala na konfigurację dwóch alarmów, które różnią się od siebie głównie metodą porównania czasu z ustawionym alarmem.
Alarm 1 pozwala na aktywowanie przerwania do następujących dopasowań:
- Każda sekunda
- Dopasowanie tylko sekundy
- Dopasowanie sekundy i minuty
- Dopasowanie sekundy, minuty i godziny
- Dopasowanie sekundy, minuty, godziny oraz dnia miesiąca
- Dopasowanie sekundy, minuty, godziny oraz dnia tygodnia
Alarm 2 pozwala natomiast na aktywowanie przerwania do następujących dopasowań:
- Kazda pełna minuta
- Dopasowanie tylko do wybranej minuty
- Dopasowanie minuty i godziny
- Dopasowanie do minuty, godziny oraz dnia miesiąca
- Dopasowanie do minuty, godziny oraz dnia tygodnia
Łatwo więc zauważyć, że Alarm 1 operuje na sekundach natomiast Alarm 2 na minutach. W ramach tego przykładu w funkcji setup() wyłączamy i resetujemy przerwania za pomocą funkcji armAlarmX(false) oraz clearAlarmX() ponieważ wartości te są podtrzymywane bateryjnie. W normalnej pracy oczywiście powinniśmy pominąć ten fragment, ponieważ będzie on powodował kasowanie ustawień przy powrocie głównego zasilania.
- #include <Wire.h>
- #include <DS3231.h>
- DS3231 clock;
- RTCDateTime dt;
- void setup()
- {
- Serial.begin(9600);
- // Inicjalizacja DS3231
- Serial.println("Initialize DS3231");;
- clock.begin();
- // Wylaczamy alarmy i resetujemy przerwania do przykladu,
- // poniewaz ustawienia sa podtrzymywane bateryjnie
- clock.armAlarm1(false);
- clock.armAlarm2(false);
- clock.clearAlarm1();
- clock.clearAlarm2();
- // Ustawiamy date (Year, Month, Day, Hour, Minute, Second)
- clock.setDateTime(2014, 4, 25, 0, 0, 0);
- // Ustawiamy Alarm1 na 20s kazdej minutu z dopasowaniem sekund
- // setAlarm1(Date or Day, Hour, Minute, Second, Mode, Armed = true)
- clock.setAlarm1(0, 0, 0, 20, DS3231_MATCH_S);
- // Usyawiamy Alarm2 - Kazda pierwsza minuta kazdej godziny z dopasowaniem do minut
- // setAlarm2(Date or Day, Hour, Minute, Mode, Armed = true)
- clock.setAlarm2(0, 0, 1, DS3231_MATCH_M);
- }
- void loop()
- {
- // Odczytujemy date
- dt = clock.getDateTime();
- Serial.println(clock.dateFormat("d-m-Y H:i:s - l", dt));
- // Sprawdzamy alaram 1
- if (clock.isAlarm1())
- {
- Serial.println("ALARM 1 TRIGGERED!");
- }
- // Sprawdzamy alaram 1
- if (clock.isAlarm2())
- {
- Serial.println("ALARM 2 TRIGGERED!");
- }
- delay(1000);
- }
W tym przykładzie zademonstrowałem jak obsłużyć alarmy programowo, jednak w repozytorium Git znajdziecie przykład z wykorzystaniem przerwania INT0 w Arduino UNO. Przykład ten został również omówiony na filmie poniżej.
Materiały dodatkowe
Dokumentacja techniczna: https://www.jarzebski.pl/datasheets/DS3231.pdf
Biblioteka Arduino: https://github.com/jarzebski/Arduino-DS3231
Reklama
Komentarze

kolejny ciekawy wpis. Co kolejne bedzie? :)

Cześć,
mam problem z obsługą przerwania w gotowym module http://www.ebay.com/itm/DS3231-AT24C32-IIC-Precision-RTC-Real-Time-Clock-Memory-Module-For-Arduino-/141135165489?
Ze schematu
Oryginalny obraz posiada rozmiar 1000x660 i zdjęć modułu wygląda, że int podłączone jest przez rezystorek.
Pomiar woltomierzem wskazuje, że po wywołaniu przerwania napięcie spada z 5 do 0, i po chwili wraca do 5, ale gdy podłączę pin pod arduino i użyję attachInterrupt, to albo od razu serial monitor się przywiesza i nie wyświetla żadnych danych (zaczyna wyświetlać od razu po odłączeniu kabelka), albo, przerwanie wywoływane kilkanaście razy na sekundę (pomiędzy wysłaniem czasu na Serial.print).
Gdzie może być problem?

Spotkałem się z podobnym problemem, ale przez fragment programu. Pokaż funkcję obsługi przerwania, czasami może przyblokować właśnie program (ja tak przyblokowałem, jak chciałem w niej zresetować obsłużone przerwanie). Ew. zobacz czy zadziała ci ten przykład:
https://github.com/jarzebski/Arduino-DS3231/blob/master/DS3231_intalarm/DS3231_intalarm.ino

Wydaje mi się, że chyba jest coś nie tak elektrycznie. Uploaduję szkic, kabel z SQW z zegara wisi luzem, w monitorze portu dostaję co sekundę 45 linijek *** INT 0 ***, a potem datę.
Gdy podłączę pod Arduino (używam Leonardo) pod cyfrowy pin 3, na porcie szeregowym pojawia się jeszcze pojedyncze *** INT 0 ***, i potem już nic więcej. Gdy wyciągnę kabel, pojawia się znów sporo linijek z przerwaniem i poprawna godzina.
Pod SQW podłączyłem diodę, która w momencie alarmu na sekundę przygasa. Jeżeli dodatkowo podłączam kabel pod pin 3, dioda świeci odrobinę jaśniej (i przygasa, jak kabel wyciągnę).
Jeżeli wszystko podłączę i wcisnę reset na Arduino, na monitorze nic się nie wyświetla, dioda się pali, a po wystąpieniu alarmu (po tych 10s), dioda gaśnie na dobre, aż do wyciągnięcia kabla z pin3.
Próbowałem też zamiast przerwania odczytywać (analogRead/digitalRead) na pinie A0 i 0, przed alarmem jest stan 1, po alarmie 0, i nie zamienia się już później na 1.
Dla porównania, robiłem sobie jakieś testy z obsługą przerwania z przycisku i czujki pir, wszystko działa.

Dziwna sprawa. Najgorsze jest to, że nie posiadam Leonardo by się temu przyjrzeć. Toć to troszkę dziwne, bo dioda w momencie alarmu wystąpienia przerwania powinna się zaświecić. Może coś z połączeniami? Wyjścia DS3231 pracują w otwartym drenie... nie wiem już w sumie. Zaopatrzę się w Leonardo to dam znać jak mi poszło.

Mi się wydaje, że alarm jest active-low, czyli napięcie spada w momencie wystąpienia alarmu (mam diodę podłączoną pod ~INT/SQW, nie dodatkową diodę pod pin4 z przykładu).
Ogólnie nie rozumiem, dlaczego cały układ się przywiesza jak tylko podpinam ~INT/SQW do arduino. Może jednak coś jest nie tak z samym modułem?

To całkiem możliwe, na gołym DS3231 dziś sprawdzałem i problemu nie potrafię powtórzyć :(

A czy przy tym gotowym układzie (jak w jednym z komentarzy) też są wymagane te rezystory 10k do linii sygnałowych?

Nie - tam są już podciągnięte rezystorami (RP1)

panowie przedstawiam skecz ,po wgraniu do Arduino zegar głupieje możecie doradzić gdziejest błąd
https://gist.github.com/gregor36/18817234729525f584cf

Nic tu nie ma :(
Whoops.
We seem to have missed the gist of that gist you were looking for.

Witam,
Chcialem uzyc tej biblioteki do tego RTC, ale nie przewidziano w niej ustawienia bitu na istnienie baterii i pracy po odlaczeniu zasilania. Po zdieciu napiecia zegar pamieta czas ale zatrzymuje sie, probowalem innych bibliotek i takiego problemu nie ma.

Już nad tym pracuję, w niedzielę wgram nową wersję

poprawione i wgrane na git - dzięki za cynk

Dotarłem tu niedawno, ale po wgraniu biblioteki nadal zatrzymuje czas z przykładu "simple"

Thrusday should be Thursday edit cpp file !
Setting min at 08 is ok but 09 error !
Hope to see Temperature ie: 20.25 and 20.3 (short) would be great.
Thank you for your library

Typo was fixed and uploaded to git :) thanks
You can paste the code causing the error?
About Temperature, you can do it by:
Serial.println(clock.readTemperature(), 0); => 20
Serial.println(clock.readTemperature(), 1); => 20.3
Serial.println(clock.readTemperature(), 2); => 20.25

Thanks for the typo fix and temperture info.
The error seems to be the way I entered the value, so no problem with single char 9 min but 09 gives.. error: invalid digit "9" in octal constant.
Just the way I entered the value and bad memory !, appreciate your help and great work.

W jaki sposób wyłączyć alarm, dajmy na to w przykładzie DS3231_alarm.ino.
Polecenie clock.armAlarm1(false) go nie wyłącza. Odczytując stan alarmu clock.isArmed1() mam niby wynik false, ale i tak alarm o zadanym czasie się uaktywnia.

Alarms once set continue to run. There is no way to disable them. so alarms once set keeps occuring and if you read their status they show as having occured. The key is in the meaning of disarm/turn off. turn off means the alarm is prevented from raising an interrupt.

Witam,
Mam podłączony taki moduł do Arduino http://www.dx.com/p/ds3231-high-precision-real-time-clock-module-blue-3-3-5-5v-222910
Niestety po odłączeniu zasilania czas i data zostają przywrócone do ostatniej aktualizacji. Nie występuje podtrzymanie na baterii danych...
Co może być tego przyczyną?

Po ustawieniu aktualnego czasu musisz wywalić clock.setDateTime(__DATE__, __TIME__); i wgrać program raz jeszcze. W przeciwnym razie po wyłączeniu i włączeniu ustawia Ci ponownie datę i godzinę kompilacji :)

Missing "KEYWORD" file in library

lcd.print(clock.dateFormat("jS", dt));
The day should read 11th, 12th, 13th but is 11st, 12nd, 13rd.
I am trying to also change the backlight brightness on 1602 LCD with PWM, by the time of day. So if the time was >10pm but <6am brightness = 127; analogWrite(9,brightness);
I can do this in alarm or is there a simpler way.
Thanks.

I will fix it in next release, thanks!

char *DS3231::strDaySufix(uint8_t day)
{
if (day == 01 || day == 21 || day == 31)
{
return "st";
} else
if (day == 02 || day == 22)
{
return "nd";
}
if (day == 03 || day == 23)
{
return "rd";
}
return "th";
}

What version IDE do you use?

Tested on IDE v1.6.1 works fine now with the above code change to DS3231.cpp

Chciałbym z użyciem tego modułu wykonać pewien impulsator, który dokładnie co minutę wykona określoną funkcję (zmiana stanu dwóch pinów cyfrowych). Ta funkcja będzie sterowała cewką tzw. zegara wtórnego dlatego dokładność (regularność) wywoływania tej funkcji jest kluczowa i nie mogę tu użyć zwykłego delay() bo jest to mało dokładne.
Czy dobrze kombinuję, że powinienem użyć opisanego tu alarmu, ustawić go na minutę i w ramach alarmu wykonać potrzebną mi funkcję? Czy przypadkiem czas wykonania samej funkcji nie wpłynie na wywołanie kolejnego alarmu, a tym samym kolejnego wywołania fynkcji po upływie kolejnej minuty?

Tak, najlepiej użyć do tego alarmu - podepnij go pod przerwanie int0 i będzie gites. Funkcja nie będzie wykonywać się całą minutę zakładam :)

Chciałbym zrobić dodatkowe alarmy, i chcę się zapytać czy można np wywoływać co sekundę wartość funkcji clock.dateFormat("H:i:s - l", dt)) i porównać do zmiennej Budzik1(jakaś godzina w konkretnym dniu tygodnia np "00:00:28 - Friday") która określa ten czas alarmu.
Jaki postawić poprawnie taki warunek porównania Budzik1 do clock.dateFormat("H:i:s - l", dt))?

Właśnie podpiąłem sobie ten moduł do UNO i testuję wraz z LCD po I2C. Dziwna sprawa jest, że co kilkanaście sekund resetuje się układ i inicjalizuje znowu wyświetlacz. To pewnie nie jest wina samego zegara.
Drugi problem jest chyba jednak z zegarem związany bo mam wrażenie, że czasem sekundy są pomijane i wskakuje jakby co druga. Wygląda jakby zegar przyspieszał. Czy kto widział taki efekt?

Problem z odczytywaniem sekund może być to, że nie wyrabiasz się z odczytaniem :) np, jeśli Twój program robi coś dwie sekundy, to przy następnym odczycie pominie

Witaj,
wgrywam twój kod, a po serialu sprawdzając pojawia się
Raw data: 2005-4-1 0:1:0
Raw data: 2005-4-1 0:1:1
Raw data: 2005-4-1 0:1:0
Raw data: 2005-4-1 0:1:1
Raw data: 2005-4-1 0:1:0
Raw data: 2005-4-1 0:1:1
wiesz może w czym problem? bardzo będę wdzięczny za pomoc, cały dzień to męczę...

Mam podobny problem, też się z tym męczę drugi dzień. Wgrywam DS3231_simple i po odpaleniu serial monitora mam coś takiego:
Initialize DS3231
Raw data: 2016-11-29 21:49:43
Raw data: 2000-1-1 0:0:0
Raw data: 2000-1-1 0:0:0
Raw data: 2000-1-1 0:0:0
Raw data: 2000-1-1 0:0:0
Raw data: 2000-1-1 0:0:0
Raw data: 2000-1-1 0:0:0
...
Co mogę robić źle??

Witam, GY-87 (MPU6050) i ZS-042 (DS3231SN), oba mają adres I2C "068" jest jakiś prosty sposób, jak ich używać razem z Leonardem? Dziękuję.

Owszem jest, polecam układ:

Hi,
thanks for the library, it\'s nice.
I work with unixtime and I\'m found a small problem in converting between local human time and unixtime.
Correct is:
uint16_t DS3231::date2days(uint16_t year, uint8_t month, uint8_t day)
{
.......
if ((month > 2) && isLeapYear(year))
{
........

Ok, thanks! I will fix it in next release

Powiedz mi czy ten uklad ma wbudowana wewnetrzna pamiec ? ktora jest podtrzymywana bateryjnie i jak mozna z niej skozystac?

Niestety nie ma, ale możesz skorzystać z pamięci EEPROM w atmedze

Chodzi mi pamiec ktora sie nie nadpisze po zmianie programu... potrzebuje do mojej pogodynki...

to nie ma :) wciąż pozostaje ci pamięć eeprom w osobnym układzie

cos godnego polecenia?

Praktycznie dowolna pamięć eeprom :) https://kamami.pl/16-eeprom byle i2c

There have some error with ds3231 alarm in
// Set Alarm - Every full minute.
// DS3231_EVERY_MINUTE is available only on Alarm2.
// setAlarm2(Date or Day, Hour, Minute, Second, Mode, Armed = true)
clock.setAlarm2(0, 0, 0, 0, DS3231_EVERY_MINUTE);
***error message show ****
Arduino: 1.6.1 (Windows 8.1), Board: "Arduino Mega or Mega 2560, ATmega2560 (Mega 2560)"
DS3231_alarm.ino: In function \'void setup()\':
DS3231_alarm.ino:41:50: error: invalid conversion from \'int\' to \'DS3231_alarm2_t\' [-fpermissive]
In file included from DS3231_alarm.ino:10:0:
C:UsersKetsayaiDocumentsArduinolibrariesArduino-DS3231-master/DS3231.h:119:7: error: initializing argument 4 of \'void DS3231::setAlarm2(uint8_t, uint8_t, uint8_t, DS3231_alarm2_t, bool)\' [-fpermissive]
void setAlarm2(uint8_t dydw, uint8_t hour, uint8_t minute, DS3231_alarm2_t mode, bool armed = true);
^
Error compiling.
This report would have more information with
"Show verbose output during compilation"
enabled in File > Preferences.
could you fix this.

Jak to jest z podłączeniem diody na wyjściu SQW/OUT. Na powyższym filmie jest mowa o podłączeniu między +5V i tym wyjściem, a na schemacie, który widzę w opisie DS1307
Oryginalny obraz posiada rozmiar 600x245
wyglądą, że dioda jest między masą, a wyjściem SQW/OUT.
To jak w końcu powinno być?

Led1 powinna być podpięta do 5V (VCC). Wy 7 układu podaje masę (otwarty dren, kolektor).
Wyżej w opisie jest ten sam błąd:
"...jeśli chcemy wykorzystać do nich diodę LED, należy podłączyć tutaj katodę - anodę zaś do masy."

Witam!
Mam pytanie... jak zrobić aby monitor szeregowy wyświetlał czas zegara RTC co sekundę ale bez użycia funkcji delay. Ja tak zrobiłem (na układzie ds1307):
psec = sec;
DateTime now = rtc.now();
sec = now.second();
if (sec != psec)
{
digitalWrite(9, HIGH);
delay(5);
digitalWrite(9, LOW);
}
Powyższy "cytat" jest częścią programu który sczytuje dokładny atomowy czas z sygnału DCF77, następnie nastawia zegar RTC. W układzie są dwie diody 1 zapala się gdy w sygnale dcf wystepuje zbocze narastające wywołujące przerwanie (znacznik sekundy) druga dioda zapala się gdy sekunda na rtc jest różna od poprzedniej (powyższy kod programu) Problem polega na tym że obydwie diody powinny się zapalać niemal jednocześnie (czas pomiędzy ich zaświeceniem determinuje czas wykonania programu który wynosi około 0.02 s). W praktyce czas między zaświeceniem obydwu diod jest zmienny. Podejrzewam że przyczyną jest niestabilność zegara ds1307. Planuje w moim projekcie zastąpić go tu opisywanym ds3231...mam nadzieje że pomoże.
ma ktoś jakieś pomysły?

Najprostszym rozwiązaniem będzie użycie timerów. Są dostępne biblioteki do uruchomienia timerów na płytkach z AVR jak i ARM. Jest to bardziej eleganckie, wygodne i racjonalne (można używać w Due kilku timerów jednocześnie) i nie powoduje "leżenia mikrokontrolera odłogiem".

Hi
I Use This Library on UNO Board But it doesn\'t work well on DUE Board. Can you help me for How I Use this library on DUE Board?
Thanks

Sorry, I dont have duo yet. Maybe soon

Biblioteka do obsługi DS3231 jest naprawdę znakomita, ale jest jeden problem: tak zwany czas letni. Sam DS3231 nie ma "na pokładzie" obsługi tej bzdury, ale bez tego trzeba ręcznie "przestawiać" czas na "letni" - "zimowy".
Bardzo gorącą prośba do autora o dadanie tej opcji.
[P.S. Wszystko przez to że pewnemu amerykańskiemu idiocie zachciało sie łapać motyle. Niestety niektórzy na całym Świecie to podchwycili.]

Obliczenie czasu zimowego / letniego - to nie jest takie proste zagadnienie :) Ale postaram się coś wykombinować

Ja dopiero po tygodniu zrozumiałem jaką gafę strzeliłem, uważając że "problem czasu letniego" to coś banalnego. Sam nie mam żadnych kompetencji aby "dłubać w kodzie", ale wpis na tym forum:
http://forums.parallax.com/discussion/162371/rtc-and-dst
wydaje mi się wielce interesujący.

Super biblioteka!
W kwestii czasu letniego/zimowego, rozwiązałem to banalnie - użyłem przycisku, który dodaje lub odejmuje godzinę i po sprawie (zbyt często się tego nie używa przecież). Ale jest ALE i to jak widzicie duże. Przycisk można przypadkiem kliknąć - no problem, odklikam i mam ponownie bieżący czas. Tu jednak pojawia się pewien problem: otóż, przy dokładności zegara rzędu 1 min / rok pojawiają się opóźnienia. Ale do rzeczy:
Przykładowo używam korekty czasu na zimowy:
clock.setDateTime(rok, miesiac, dzien, godzina + 1, minuta, sekunda);
zegar ustawia się prawidłowo, ALE zaczyna się późnić o około ~0,5 sekundy. Klejenia zmiana czasu zegara i kolejne ~0,5 sekundy się późni.
I teraz mam pytania:
- z czego to wynika? Czas obsługi I2C, zapisu w samym zegarze?
- czy i jak to kompensować?
- czy istnieje metoda ustawienia wyłącznie godziny bez użycia setDateTime?

Skoro poprzez nastawianie zegara tracisz o,5s, to nie lepiej jest w programie zmieniać czas?

Dzień dobry,
Dobrym miejscem do nauki elektroniki. Dziękuję.
W stosunku do RTC DS3231 mają następujące pytania:
1. Jak Program 3 ALARM1 na dzień:
clock.setAlarm1 (0, 00, 00, 10, DS3231_MATCH_S);
clock.setAlarm1 (0, 00, 00, 20, DS3231_MATCH_S);
clock.setAlarm1 (0, 00, 00, 30, DS3231_MATCH_S);
W ten sposób działa tylko przez 30 sekund. Jak to zrobić?
2. Program WWW: DS3231_intalarm.ino OK?
Dzięki,
A. Francisco
(tłumaczenie na język polski z portugalskiego tłumacza Google)

Hi, Francisco - try to write in English, as the automated Google translation does not work properly for languages with more complex grammar :-)

Hello,
A great place to learn electronics. My thanks.
Relative to the DS3231 RTC I have the following questions:
1. You can program Alarm1 three times on the same day, for example:
clock.setAlarm1 (0, 00, 00, 10, DS3231_MATCH_S)
clock.setAlarm1 (0, 00, 00, 20, DS3231_MATCH_S)
clock.setAlarm1 (0, 00, 00, 30, DS3231_MATCH_S);
As previously, only works for 30s.
2. The web program: DS3231_intalarm.ino OK?
Thank
A. Francisco

Biblioteka dziala swietnie. Mam jednak problem z Alarmami. Obojetnie co nastawie w alarmie, SQW pulsuje co ok. sekunde (podlaczylem diode). Przetestowalem programy przykladowe z biblioteki na Arduino Mini i Pro.
Ma ktos podobne efekty?
Pozdrawiam
Radek

Mam problem z wysyłaniem danych na wyświetlacz. Do przykładu dateFormat, chciałbym dodać opcję wysyłania daty i czasu na LCD.
Po załączeniu pliku nagłówkowego LiquidCrystal.h do kodu programu i odpowiednim zainicjowania pinów, do których podłączony został wyświetlacz (LiquidCrystal LCD(7,6,5,4,3,2);) oraz rozpoczęciu komunikacji w pętli setup okazuje się, że na LCD nie wyświetlają się nawet najprostsze komunikaty tekstowe w stylu "Hello". Z początku myślałem, że może wypisuję datę w złym formacie, ale jak wspomniałem wyżej - zwykły tekst również nie działa. W zamian na wyświetlaczu otrzymuje jakieś dziwne krzaczki, nie rozkodowywane są znaki tekstowe, czyli najprawdopodobniej program nie korzysta poprawnie z załączonej biblioteki wyświetlacza.
Kod oraz wyświetlacz wyglądają jak na załączonych zdjęciach:
Oryginalny obraz posiada rozmiar 615x893
Oryginalny obraz posiada rozmiar 1024x768
Czy ktoś wie z czego wynika problem? Dodam, że wyświetlacz działa prawidłowo przy kompilacji jakiegokolwiek innego szkicu. Sam zegar w serial monitorze również działa bez zarzutu.

Świetna biblioteka dzięki ! Ale mam pytanie, jak by można ręcznie nastawić czas przez przyciski ? Pozdro

Podbijam pod zapytanie, też jestem zainteresowany jak ten zegarek ustawiać z przycisków?

Witam.
Biblioteka na wyjściu SQW nie obsługuje czestotliwości 1024Hz
czy może ktoś to poprawić?

No to plama z mojej strony. Przestudiowałem PDF i jednak jest błąd w definicji częstotliwości SQW. Poprawię to przed weekendem

Na githubie dalej to samo.
Ogólnie źle przypisane częstotliwości SQW
Wg. pdf-a powinny być
1 Hz
1024 Hz
4096 Hz i
8192 Hz
adresowanie przez rejestry RS1 i RS2
32 KHz to osobne wyjście a nie INT/SQW

Obsługuje 1024Hz tylko opisana jest jako 4096Hz :-)
Wystarczy spojrzeć do pdf-a na rejestry RS 1 i RS2

Biblioteka nie kompiluje się dla DUE, mógłbyś to poprawić ??

No nie ma wyjścia :) Muszę kupić te DUO w końcu :)

Wystarczy zmienić nazwę klasy DS3231 z "clock" na np "clock1" i będzie działać.

Witam.
Fajna sprawa.
Mam pytanie czy ta biblioteka obsługuje ustawienie "Aging Offset"?
Mam gorącą prośbę do autora biblioteki o dodanie takiego polecenia. Zegar jest super ale możliwość dodatkowej kalibracji była by super sprawą.

Hi,
at first thank you very, very much for your libraries,
for me they work out of the box, great job :-)
I only got a problem with the example "DS3231_intalarm".
https://github.com/jarzebski/Arduino-DS3231/tree/master/DS3231_intalarm
No matter what i do, all i get is a signal of 1 Hz at pin SQW.
I`m using arduino 1.6.7
Btw., AFAIK the loop function should reset ""boolean isAlarm"
as well, so (to my mind) it should look like
void loop()
{
dt = clock.getDateTime();
Serial.println(clock.dateFormat("d-m-Y H:i:s - l", dt));
if (isAlarm)
{
digitalWrite(alarmLED, alarmState);
alarmState = !alarmState;
clock.clearAlarm1();
isAlarm = false; // correct?
}
delay(1000);
}
Any ideas concerning my 1Hz-Problem?
Thanks in advance.
Best regards,
Soeren

I will fix it on next release.

Ekstra biblioteka. Wiesz moze kiedy bedzie nowa wersja (poprawki) bo last commit was on Dec 6, 2014 ?

Hello!
A lot of peoples have some Trouble with the Alarm and other funktions from that library, cause of the not descriped functions! all that People try to use that great library (thanks for that) but spend a lot of time to try out whats happend behind the funktions. also i have the ,,Feeling,, that the alarmClear function dont work. What this library will be much greater is an detailed description of her funktions.
Thanks for that !
Marc

Thanks for report. I will fix that soon

Witam!
Po wgraniu programu (sterowanie wyjściem 32kHz oraz SQW/INT) do arduino pro mini podłączyłem miernik do pinu (DS3231) 32K i GND i widzę, że napięcie zmienia się co 2 sekundy od 1.02V do 3.5V. Dlaczego napięcie nie spada do 0V?
Podłączając natomiast miernik do pinu SQW i GND napięcie od 0.1V do 3.36V. Dlaczego w tym przypadku napięcie nie zmienia się co 2 sekundy tak jak zostało to ustawione w programie?

stan niski TLL nie musi być 0V - standard mówi, że jest to wartość <= 0.8V.

Prośba o podpowiedź lub update biblioteki w jaki sposób ustawiać Aging Offset?

Prośba o jakiś sensowny poradnik jak sprzęgnąć Arduino + GSM Sim900A + RTC DS3231
Funkcje typowego modułu powiadamiania czyli wysyłanie SMS z informacją o wystąpieniu zdarzenia, testowanie modułu raz na dobę poprzez dzwonienie na zaprogramowany nr. telefonu i rozłączenie np. po dwóch dzwonkach (tzw. clip)

Takich poradników jest bardzo dużo możesz np. ten przerobić http://www.induino.com/2013/11/interfacing-serial-devices-part-3.html

Nie potrzebujesz zegara jak masz sim900
Kawałek kodu gdzie pobieram czas z modemu
sim800.println("AT+CCLK?rn ");//Pobierz czas
delay(500);
if (sim800.find(":")) { // decode reply
while (sim800.available()) {
char c = sim800.read();
if (c != \'n\')
getGSMTimestamp += c;
else getGSMTimestamp +=" ";
}
}

Witam!
W tym https://github.com/jarzebski/Arduino-DS3231/blob/master/DS3231_intalarm/DS3231_intalarm.ino przykładzie jest błąd. Do funkcji setup należy jeszcze dodać
clock.enableOutput(false);
a usunąć
clock.begin();

Witam!
Chciałbym, aby alarm uruchamiał się co 12 godzin, ale nie jestem pewien, czy powinien on wyglądać tak jak poniżej?
clock.setAlarm2(12, 0, 0, DS3231_MATCH_H_M_S);

dopasowanie HMS jest dla konkretnego czasu - czyli w tym przypadku codziennie o 12:00:00

Witam!
Czy można ustawić uruchamianie alarmu co 2 minuty? Ustawiłem wyzwalanie alarmu co 120 sekund, ale on uruchamia się co 1 minutę.
clock.setAlarm1(0, 0, 0, 120, DS3231_MATCH_S);
Dzięki za info.

Hello great work.
I use "clock.setAlarm1(0, 0, 0, 20, DS3231_EVERY_SECOND);" to have an alarm after 20s but i measure on interrupt pin2 LOW all the time.
If i use "clock.setAlarm1(0, 20, 15, 10, DS3231_MATCH_H_M_S);" it works corect, i get LOW only in specific time.
Thanks

Trafiłem na pewien problem przy kompilacji Pana przykładowych programów z github, (mam Arduino Zero) pojawia się szereg błędów, który sugeruje, że biblioteka nie jest kompatybilna z Adruino Zero? Kompilowałem programy dla Arduino Uno i nie było żadnego problemu.
Jest jakiś sposób na obejście problemu?

Witam, a czy jest możliwość ustawienia innych częstotliwości jak te:
case DS3231_1HZ: Serial.println("SQW = 1Hz"); break;
case DS3231_5HZ: Serial.println("SQW = 5Hz"); break;
case DS3231_4096HZ: Serial.println("SQW = 4096Hz"); break;
case DS3231_8192HZ: Serial.println("SQW = 8192Hz"); break;
case DS3231_32768HZ: Serial.println("SQW = 32768Hz"); break;
Na wyjściu SQW ??
Wydaje się że są one ustawione na sztywno w bibliotece ds3231.h
typedef enum
{
DS3231_1HZ = 0x00,
DS3231_4096HZ = 0x01,
DS3231_8192HZ = 0x02,
DS3231_32768HZ = 0x03
Czy można dodać własne? jak to jakie adresy?
Dzięki.

Ja też szukam takiej odpowiedzi...

Witam, jestem początkującym użytkownikiem Arduino i kupiłem coś takiego: https://botland.com.pl/moduly-rtc/3790-zegar-czasu-rzeczywistego-modul-rtc-ds3231-i2c-bateria.html .Jak mam to podłączyć do Arduino? Jakiej biblioteki użyć?

Dzień dobry,
Potrzebuję zapisać godzinę unix do zmiennej typu long int by móc ją porównywać z inną zmienną typu long. Istnieje taka możliwość?
W grę wchodzi również przypisanie aktualnej sekundy do zmiennej typu int. Jeśli, ktoś wie jak to zrobić to proszę o pomoc.

Witam serdecznie,
przy podawaniu roku mam problem, bo gdy podam rok poniżej 2000 lub powyżej 2159 pokazują się dziwne wyniki. Czy da się coś z tym zrobić?

Cześć,
Masz poważne błędy w tej bibliotece niestety. Np. w metodzie dateFormat() zwracasz adres zmiennej lokalnej...
Dlatego mi ta metoda nie działała, a gdy zacząłem sprawdzać, to zobaczyłem dlaczego :)
Jeśli chcesz, to na priv mogę podesłać diffy DS3232.{h,cpp} bo trochę pozmieniałem rzeczy, które mnie najbardziej gryzły w oczy, np. metody które nie operują na żadnych składowych klasy powinny być statyczne - bo tylko po to aby ich użyć musisz tworzyć instancję klasy.
Taka mała porada: zwracaj proszę uwagę również na warningi z kompilacji a nie tylko na błędy - wtedy taki katastrofalny błąd jak zwrócenie adresu do zmiennej lokalnej kompilator Ci złapie...
Ale poza tym oczywiście kawał dobrej roboty :) Pzdr.

Cześć Robert, chętnie skorzystam z sugestii - wysłałem Ci email w tej sprawie

Witam też mam problem z dateFormat() , potrzebuję poprawnej wersji

Też mi to nie działa czy jest poprawiona wersja ?

Zerknij w komentarze poniżej, problem ma rozwiązanie ;)

Przy odliczaniu kolejnego dnia roku jest podawany wczorajszy dzień.
Pierwszy dzień nowego roku został wyświetlony jako dzień "0".
Co z tym można zrobić.
Dziękuję za odpowiedź.

w:
uint16_t DS3231::dayInYear(uint16_t year, uint8_t month, uint8_t day)
zmienić to
fromDate = date2days(year, 1, 1);
na to
fromDate = date2days(year, 1, 0);
;-)
Swoją drogą autor mógłby nanieść poprawki, skoro tyle razy obiecywał :D
Dziękuję za już i liczę, że się będzie chciało chcieć.
pozdr.

wchodzisz na githuba, robisz forka i poprawiasz co tam chcesz :)

i nie Kraków a Gliwice, jakby co
(lol)

Witam, mam problem z zatrzymywaniem się czasu przy braku zasilania, mam baterie, czas sie podtrzymuje ale nie odlicza się. Gdzie zmienić parametr aby zegar pracował z baterii ?!

Witam serdecznie
Jestem pod wrażeniem.Gratuluję wiedzy.
Po dokonaniu wpisu
w:
uint16_t DS3231::dayInYear(uint16_t year, uint8_t month, uint8_t day)
zmienić to
fromDate = date2days(year, 1, 1);
na to
fromDate = date2days(year, 1, 0);
;-)
wszystko dział normalnie.
Bardzo dziękuję za pomoc.

Witam!
Wszystko nawet działa poprawnie na Arduino Mega 2560. Jednak po wgraniu intalarm (bez ustawiania daty na rok 2014) po ustawieniu alarmu na każdą 20sekundę minuty, alarm jest wywoływany co sekundę..
Co jednak bardziej mnie interesuje:
Czy jest możliwość, by na zegar na sqw dawał sygnał, po odłączeniu go całkowicie od arduino, tzn. na samym zasilaniu z baterii? Potrzebuję to do projektu, w którym alarm z tego zegara uruchomi zasilanie reszcie układu.
Pozdrawiam,
marw

Po raz kolejny wraca problem z ustawianiem czasu przyciskami(czas letni /zimowy). Jest z tym jakiś dziwny problem, próbowałem załadować do int-ów aktualną wartość od roku do sekund za pomocą(dt.year).. (dt.second) wykonać ++ na godzinie i jednokrotnie wykonać clock.setDateTime(2014, 4, 13, 19, 21, 00); w miejsce danych podstawiając ww. int-y, ale na zegarze wychodzą jakieś bzdury. Może trzeba użyć jakiś innych zmiennych ?
Czy ktoś by się pokusił o zrobienie działającego fragmentu kodu, w którym można dodawać i odejmować godziny ?

Też mam problem ze zmianą ustawień DS3221 z przycisków. Nic mi nie wychodzi. Może ktoś widział gdzieś coś co działa. Pozdrawiam

U mnie działa np. tak.
RTCDateTime setdt;
...
setdt.year = 2018;
setdt.month = 1;
setdt.day = 9;
setdt.hour = 12;
setdt.minute = 15;
setdt.second = 0;
clock.setDateTime(setdt.year, setdt.month, setdt.day, setdt.hour, setdt.minute, setdt.second );
oraz wszelkie operacje typu setdt.minute++; działają.

Mam arduino 1.6.8 i 1.8.1 na dwóch różnych sprzętach i wyskakuje mi error przy kompilacji : warning: deprecated conversion from string constant to \'char*\' [-Wwrite-strings] x dużo
Przejmować się tym ?

Hej, czy funkcja clock.clearAlarm1() na pewo działa? Wywoływanie jej nie powoduje żadnej istotnej róznicy.

Zasadnicze pytanie czy biblioteka wspiera 8266, bo na arduino działa sprawnie.

Czy w twojej bibliotece jest timeout przy braku połączenia z RTC? Spotkałem się z głupią sytuacją: wyciągłem sobie kabelek z SDA i układ się zawiesił przy odczycie zegara - tak jakby czekał na odpowiedź. I czekał godzinami (min 4 godziny). Może jakaś funkcja sprawdzająca czy RTC działa?

Czy mógłbym prosić o krótki i jak najprostszy scatch do ustawienia zegara. Program powinien ustawić godzinę ze zmiennych. Przykładowo int godz = godzina, którą chcę ustawić. Proszę o pomoc, nie mogę poradzić sobie z tym problemem.

A ja chciałbym wykorzystać Alarmy jako miejsce, gdzie można zapisać konkretną godzinę i skorzystać z tego później. Może tak się nie da ale zapytam.
Idea jest taka, żeby po np. naciśnięciu przycisku aktualna godzina została zapisana jako alarm, a po jakimś czasie ta wartość została sprawdzona i porównana z aktualną godziną. Mogę zapisać aktualną godzinę jako alarm, ale czy jest możliwość odczytania wartości ustawionego alarmu?

bool DS3231::isLeapYear(uint16_t year)
{
return (year % 4 == 0);
}
Seems must have be next logic
(year % 4 == 0) && ( (year % 100 != 0) || (year % 400 == 0) );

Kupiłem sobie moduł ZS-042 z tym zegarem DS3231 na Aliexpress. Zrobiłem prosty zegarek z wyświetlaniem na LCD 20x4 i dziwna sprawa. Po 12 godzinach spieszy się jakieś 4 sekundy. To o wiele za dużo jak na deklarowaną 1 minutę na rok. Co może być nie tak?

Witam, czy można przy użyciu tej biblioteki ustawić czas przy użyciu epoch. Czy też trzeba samemu sobie go przekonwertować do czasu w formacie yyyy,mm,dd hh:ii:ss ??

Witam pobieram czas UNIX z internetu, w DS1307 można było ustawić zegar za pomocą czasu UNIX. Czy w DS3231 też będzie to działało ??
// UNIX timestamp
clock.setDateTime(1397408400);

Jak ustawić inne częstotliwości SQW??

Dziękuję za super bibliotekę :-) Czy jest jakiś inny sposób ustawienia czasu niż funkcja clock.setDateTime? Problem polega na tym że zanim skończy kompilować i wgra skecz mika koło 20 sekund :-(
Na razie wpadłem tylko na pomysł żeby wykorzystać funkcję ustawiania ręcznego i napisać specjalnie do tego szkecz tak żeby można było ustawiać przez serial, ale może jest jakiś prostszy sposób, o którym nie wiem?

Nowa wersja SW ARDUINO 1.8.6 mi Twoja biblioteka na DS3231 nie działa. Gdzie jest problem? Dziękuję za informacje :)

Przyłączam się do poprzedniego postu. W nowej SW Android 1.8.7 biblioteka nie działa prawidłowo.

Z przykładu w tej Bibliotece, funkcja Dateformat nie pokazuje mi żadnych wartości o godzinie, data, upłyna czas itp. Co moze byc przyczyną? Arduino 1.8.5 wgrywane na Arduino Mega

Hello
Your code has an Error on clock.dateFormat sketch -> he show me no data from the rtc, but the sketch with raw data i can see the rtc\'s time/date
Whats the problem here?
thx for your supports to me :)

Hej,
W pliku DS3231.cpp, w metodach dateFormat zmienna buffer powinna być statyczna czyli: static char buffer[255];
Pozdrawiam
KK

Dziena brachu, naprawiło to problem formatu daty i czasu!

Hello. The library works on ESP8266 by ESP8266 Community v.2.5.0-beta2 or earlier and I really like the library.
But after updating the board to ESP8266 by ESP8266 Community v.2.5.0 in the example to the library, it began to generate an error "\'DS3231 clock\' redeclared as different kind of symbol".
I assume that the type of data is incorrectly defined in the library. Can you fix it?
And I think you need to add "yield" in function to avoid crash on ESP8266 if wiring is incorrect.

clock.dateFormat() cannot return value!!!!
plz check.

Witam. Mam problem z skeczem DS3231_simple. Podczas kompilacji pojawia się błąd:
\'RTCDateTime\' does not name a type
W czym problem? Nic nie zmieniłem w kodzie, nawet spacji nie dodałem.
Pozdrawiam.

Jak wywoływać jednym przyciskiem na ekranie lcd raz jeden napis, a po wciśnięciu przycisku drugi. Chodzi mi o wyświetlanie prędkości obrotów gramofonu gdy są ustawione na 45.00 obr/min to wyświetlacz pokazuje 45obr/min po przełączeniu prędkości na 33.33 wyświetlacz pokaże 33,33 obr/min.

Witam
Nie działa mi clock.dateFormat ani na wyswietlaczu ani w monitorze. kompiluje sie ale nic nie wyświetla.

Witam,
Na początku podziękowania za świetny materiał. Mam jednak problem z wyświetlaniem godziny przez dt.minute, a mianowicie nie wyświetla 0 (zera) przed pojedynczymi minutami. Nie zauważyłem, żeby ktoś z komentujących miał podobny problem.
Bardzo proszę o pomoc.
Pozdrawiam.

dotyczy to godzin, minut i sekund o wartościach mniejszych niż 10. Sprawdzasz przed wyświetleniem danej wielkości, czy przypadkiem nie jest mniejsza niż 10. Jeśli tak jest, to w pierwszej kolejności dodajesz tzw. zero wiodące (jako tekst) a dopiero potem wyświetlasz liczbę godzin, minut lub sekund.

if (dt.minute < 10)
{
display.print("0");
}
display.print(dt.minute);
i tak samo dt.hour.
Mi działa. Pozdrawiam

Witam,
czy ktoś może ma wiedzę jak zaprządz płytkę z tym zegarem ZS-042 (oparta o DS3231) do obudzenia z "deep sleep" urządzenia opartego o ESP-32 dokładniej płytkę ttgo t-call. Bo walczę z tym już długo i nie radzę sobie. Wygląda to tak jakby u mnie na wyjściu był cały czas stan wysoki. Zasilanie ZS\'a jest z płytki i baterii. do niczego też nie wykorzystuje kostki 24c32. Poniżej link do schematu modułu ZS-042
Oryginalny obraz posiada rozmiar 1600x569

Witam. Super poradnik i strona na YT.
Mam problem z automatyczną zmianą godziny z czasu zimowego na letin i odwrotnie. Jest na to jakiś patent ? Pozdrawiam

Ciekawe - po ponad roku chcę zaktualizować swój zegar. I tutaj niespodzianka: dateFormat nie zwraca nic, ALE tylko na niektórych płytkach, jak np. Arduino Mega256, Nano, Mini. Na płytce D1 mini wszystko działa jak trzeba. Czy ktoś może to wyjaśnić?

Witam, najpierw słowa uznania za świetne teksty i biblioteki :) Prosiłbym o małe wyjaśnienie/komentarz:
jeżeli używam funkcji clock.setDateTime(2020,05,01,9,25,24);
w prostym skeczu do ustawiania i wyświetlania czasu wszystko działa OK, jeżeli natomiast ustawiam czas podając unixtime:
clock.setDateTime(1588325124);
to zegar pokazuje 1h później:
22:51:40.287 -> Initialize DS3231
22:51:40.287 -> Raw data: 2020-5-1 10:25:24
22:51:41.270 -> Raw data: 2020-5-1 10:25:25
22:51:42.300 -> Raw data: 2020-5-1 10:25:26
skąd ta różnica ?

Witam.
Czy jest jakaś opcja żeby odpalić bibliotekę pod ESP8266?
Konsola zwraca takie błędy:
Arduino:1.8.13 (Windows 10), Płytka:"NodeMCU 1.0 (ESP-12E Module), 80 MHz, Flash, Legacy (new can return nullptr), All SSL ciphers (most compatible), 4MB (FS:2MB OTA:~1019KB), 2, v2 Lower Memory, Disabled, None, Only Sketch, 115200"
DS3231_simple:12:8: error: \'DS3231 clock\' redeclared as different kind of symbol
DS3231 clock;
^
In file included from C:Userski_biAppDataLocalArduino15packagesesp8266hardwareesp82662.7.1/tools/sdk/libc/xtensa-lx106-elf/include/stdlib.h:11:0,
from C:Userski_biAppDataLocalArduino15packagesesp8266hardwareesp82662.7.1coresesp8266/Arduino.h:27,
from sketchDS3231_simple.ino.cpp:1:
C:Userski_biAppDataLocalArduino15packagesesp8266hardwareesp82662.7.1/tools/sdk/libc/xtensa-lx106-elf/include/../include/time.h:50:19: error: previous declaration of \'clock_t clock()\'
clock_t _EXFUN(clock, (void));
^
C:Userski_biAppDataLocalArduino15packagesesp8266hardwareesp82662.7.1/tools/sdk/libc/xtensa-lx106-elf/include/_ansi.h:65:30: note: in definition of macro \'_EXFUN\'
#define _EXFUN(name, proto) name proto
^
C:ArduinolibrariesArduino-DS3231-masterDS3231_simpleDS3231_simple.ino: In function \'void setup()\':
DS3231_simple:21:9: error: request for member \'begin\' in \'clock\', which is of non-class type \'clock_t() {aka long unsigned int()}\'
clock.begin();
^
DS3231_simple:24:9: error: request for member \'setDateTime\' in \'clock\', which is of non-class type \'clock_t() {aka long unsigned int()}\'
clock.setDateTime(__DATE__, __TIME__);
^
C:ArduinolibrariesArduino-DS3231-masterDS3231_simpleDS3231_simple.ino: In function \'void loop()\':
DS3231_simple:29:14: error: request for member \'getDateTime\' in \'clock\', which is of non-class type \'clock_t() {aka long unsigned int()}\'
dt = clock.getDateTime();
^
exit status 1
\'DS3231 clock\' redeclared as different kind of symbol
Oczywiście pod Nano działa bez problem.

Bardzo fajny opis i biblioteka. Korzystam z niej w kilku projektach, a teraz jeden chciałem zmodyfikować dodając możliwość ustawiania czasu RTC na podstawie danych odebranych z DCF77. Korzystam z biblioteki Funkuhr.h, gdzie powinienem dostać dane dla roku, miesiąca, dnia, godziny, minuty, sekundy.
Biorę te wartości zdekodowane z odbiornika:
dcf.getTime(dt); //sprawdzenie sygnału z radia
rok = (dt.year, DEC) + 2000;
miesiac = (dt.month, DEC);
dzien = (dt.day, DEC);
godzina = (dt.hour, DEC);
minuta = (dt.min, DEC);
sekunda = (dt.sec, DEC);
i chciałem wpisać je do RTC korzystając z
clock.setDateTime(rok, miesiac, dzien, godzina, minuta, sekunda);
ale wynik jest niestety marny i zapisują się wartości 10 w każdej pozycji (z wyjątkiem oczywiście roku, który ma dodane 2000 więc jest 2010).
Czy masz jakieś sugestie w tej kwestii?