Долгое время в своих поделках я использовал замечательную микросхему 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);
}



