Подключение часов реального времени( DS3231) к Arduino.

Одной из самых известных микросхем RTC (RealTimeClock) является наверное DS1307 от Dallas Semiconductors. Эти часы достаточно точные, братья Китайци сделали целую кучу готовых модулей. Они просты в понимании и подключение. Приступим.

Характеристики :

  • Напряжение питания: 3.3В и 5В.
  • Чип памяти: AT24C32 (32 Кб).
  • Точность: ± 0.432 сек в день .
  • Частота кварца:32.768 кГц.
  • Поддерживаемый протокол: I2C.

Большинство микросхем, таких как DS1307 используют внешний кварцевый генератор частотой 32кГц, но в них есть существенный недостаток, при изменении температуры меняется частота кварца, что приводит к погрешности в подсчете времени. Эта проблема устранена в чипе DS3231, внутрь которого установили кварцевый генератор и датчик температуры, который компенсирует изменения температуры, так что время остается точным (при необходимости, данные температуры можно считать). Так же чип DS3231 поддерживает секунды, минуты, часы, день недели, дата, месяц и год информацию, а так же следит за количеством дней в месяце и делает поправку на високосный год. Поддерживает работу часов в двух форматов 24 и 12, а так-же возможно запрограммировать два будильника. Модуль работает по двух проводной шине I2C.

Выводы :
  •  32K: выход, частота 32 кГц.
  • SQW: выход.
  • SCL: линия тактирования (Serial CLock) .
  • SDA: линия данных (Serial Data).
  • VCC: «+» питание модуля.
  • GND: «-» питание модуля.
Подключение :

Часы подключаются по двухпроводной шине IIC (Inter-IntegratedCircuit) через выводы SDA и SCL к SDA и SCL Arduino соответственно. Также необходимо подключить питание +5В и GND. Остальные выводы специфичны для DS3231 и не поддерживаются библиотеками для DS1307, да и не часто используются.

На Arduino Nano это будут  SDA — D4(7 pin), SCL- D5(8 pin).

Кодинг :

Для начала нам потребуется две библиотеке  DS1307 RTC и TimeLib. Скачать их можно например отсюда. Так же мы будем использовать TFT дисплей. Как его подключить написано тут.

// библиотека для работы.
#include <UTFT.h> // Библиотека дисплея.
#include<stdlib.h>
#include <TimeLib.h> // Библиотека часов.
#include <Wire.h> // Библиотека IIC (Inter-IntegratedCircuit).
#include <DS1307RTC.h> //Библиотека часов.

// создаём объект класса UTFT
// и передаём идентификатор модели дисплея и номера пинов
// к которым подключаются линии SCK, SDI (MOSI), D/C, RESET, CS
UTFT myGLCD(TFT01_22SP, 9, 8, 12, 11, 10);

// объявления встроенных шрифтов
extern uint8_t SmallFont[];
extern uint8_t BigFont[];
String floatToString(float x, byte precision = 0) // Функция преобразования
{
char tmp[50];
dtostrf(x, 0, precision, tmp);
return String(tmp);
}
void setup()
{
setSyncProvider(RTC.get);
//Устанавливаем нужное время в формате: Часы, минуты, секунды, день, месяц, год
setTime(11,32,0,01,4,2016);
//Применяем значение:
RTC.set(now());
myGLCD.InitLCD(1); // инициализируем дисплей с горизонтальной ориентацией
}

void loop()
{
// очищаем экран
myGLCD.clrScr();
myGLCD.setFont(BigFont);// Выбираем шрифт.
myGLCD.setColor(VGA_RED); //Задаем цвет.
myGLCD.print( floatToString(hour()) , 100, 215); //Выводим на экран часы
myGLCD.print( floatToString(minute()) , 150, 215); // Минуты
myGLCD.print( floatToString(second()) , 200, 215); // Секунды

// ждём 1 секунду
delay(1000);
}

Более подробно про библиотеку  TimeLib можно прочитать тут. Успехов.