Часы реального времени DS3231

Долгое время в своих поделках я использовал замечательную микросхему DS1307. Все в ней отлично и цена и размер и удобство пайки (DIP и SMD), вот только точность хода не на отлично.

DS3231_imj

Еще одна проблема в необходимости использовать внешний часовой кварц на 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$.ds3231

Даташит можно посмотреть тут. Схема подключения (если использовать микросхему отдельно) такая.

 

sxema_ds3231

В модуле весь обвес есть, его можно подключать на прямую к устройству. Используя пины SCL и SDA. А так же необходимо подключить питание пин GND(-) и пин  VCC(+5v).

Рассмотрим пример подключения к Arduino

Arduino+DS3231

Нужно всего четыре провода))
Ну а теперь скачаем библиотеку для 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);
}

 

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *