Долгое время в своих поделках я использовал замечательную микросхему DS1307. Все в ней отлично и цена и размер и удобство пайки (DIP и SMD), вот только точность хода не на отлично.
Еще одна проблема в необходимости использовать внешний часовой кварц на 32Khz. И все бы ничего, да вот только все кварцы купленные у наших братьев китайцев по бросовым цена ужасного качества…Точность хода с ними просто отвратительная +-3сек в сутки….Короче мне это надоело и я начал искать замену старенькой DS1307. И вот тут я наткнулся на DS3231.
DS3231 — это часы реального времени с экстремально точным ходом благодаря встроенному кварцевому резонатору с температурной компенсацией. Интерфейс передачи данных — I2C. При отключении основного питания микросхема автоматически переключается на роботу от резервной батареи, точность хода от резервной батареи не нарушается. В DS3231 поддерживается подсчет секунд, минут, часов, дней месяца (даты), дней недели, месяцев и лет (с учетом високосного года для месяцев). Поддерживается работа в 12 и 24 часовом формате. Имеется 2 будильника с возможностью их настройки и отслеживания состояния. Подстройка точности температурной компенсации. А также два выхода — на 32 кГц (выход составляет 32.768 кГц) и программируемый выход от 1 Гц до 8.192 кГц. Имеется также вывод сброса — RST. микросхема часов реального времени выпускается в корпусе SO-16
Да, она уже занимает больше места на плате (8 ножек у 1307 и 16 у 3231), исполнение корпуса только под поверхностный монтаж (SMD). Но! Мегазачетная точность хода, термокомпенсация, встроенный кварц, цена сравнима с DS1307!! В общем нужно брать! По мониторив цены понял, что выгоднее купить готовый модуль в который входят сами часы, батарейка и весь нужный обвес, чем покупать чип отдельно.
Заказывал на Aliexpress. Цена около 1$.
Даташит можно посмотреть тут. Схема подключения (если использовать микросхему отдельно) такая.
В модуле весь обвес есть, его можно подключать на прямую к устройству. Используя пины SCL и SDA. А так же необходимо подключить питание пин GND(-) и пин VCC(+5v).
Рассмотрим пример подключения к Arduino
Нужно всего четыре провода))
Ну а теперь скачаем библиотеку для DS3231 и библиотеку TIME
И опробуем наши часы
+#include <DS3232RTC.h> //http://github.com/JChristensen/DS3232RTC +#include <Time.h> //http://www.arduino.cc/playground/Code/Time +#include <Wire.h> //http://arduino.cc/en/Reference/Wire (included with Arduino IDE) + +void setup(void) +{ + Serial.begin(9600); + setSyncProvider(RTC.get); // the function to get the time from the RTC + if(timeStatus() != timeSet) + Serial.println("Unable to sync with the RTC"); + else + Serial.println("RTC has set the system time"); +} + +void loop(void) +{ + digitalClockDisplay(); + delay(1000); +} + +void digitalClockDisplay(void) +{ + // digital clock display of the time + Serial.print(hour()); + printDigits(minute()); + printDigits(second()); + Serial.print(' '); + Serial.print(day()); + Serial.print(' '); + Serial.print(month()); + Serial.print(' '); + Serial.print(year()); + Serial.println(); +} + +void printDigits(int digits) +{ + // utility function for digital clock display: prints preceding colon and leading 0 + Serial.print(':'); + if(digits < 10) + Serial.print('0'); + Serial.print(digits); +}
Вариант номер 2, без библиотеки TIME
Нужна библиотека RTClib ССЫЛКА
// Date and time functions using a DS3231 RTC connected via I2C and Wire lib #include <Wire.h> #include "RTClib.h" RTC_DS3231 rtc; char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}; void setup () { #ifndef ESP8266 while (!Serial); // for Leonardo/Micro/Zero #endif Serial.begin(9600); delay(3000); // wait for console opening if (! rtc.begin()) { Serial.println("Couldn't find RTC"); while (1); } if (rtc.lostPower()) { Serial.println("RTC lost power, lets set the time!"); // following line sets the RTC to the date & time this sketch was compiled rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // This line sets the RTC with an explicit date & time, for example to set // January 21, 2014 at 3am you would call: // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0)); } } void loop () { DateTime now = rtc.now(); Serial.print(now.year(), DEC); Serial.print('/'); Serial.print(now.month(), DEC); Serial.print('/'); Serial.print(now.day(), DEC); Serial.print(" ("); Serial.print(daysOfTheWeek[now.dayOfTheWeek()]); Serial.print(") "); Serial.print(now.hour(), DEC); Serial.print(':'); Serial.print(now.minute(), DEC); Serial.print(':'); Serial.print(now.second(), DEC); Serial.println(); Serial.print(" since midnight 1/1/1970 = "); Serial.print(now.unixtime()); Serial.print("s = "); Serial.print(now.unixtime() / 86400L); Serial.println("d"); // calculate a date which is 7 days and 30 seconds into the future DateTime future (now + TimeSpan(7,12,30,6)); Serial.print(" now + 7d + 30s: "); Serial.print(future.year(), DEC); Serial.print('/'); Serial.print(future.month(), DEC); Serial.print('/'); Serial.print(future.day(), DEC); Serial.print(' '); Serial.print(future.hour(), DEC); Serial.print(':'); Serial.print(future.minute(), DEC); Serial.print(':'); Serial.print(future.second(), DEC); Serial.println(); Serial.println(); delay(3000); }