Arduino годинник реального часу RTC DS1307 та DS3231

Годинник реально часу (Real Time Clock) – це пристрій який дозволяє зберігати та відстежувати поточний час Для Arduino найчастіше використовуються модулі DS1307 або DS3231. Модуль працює від автономного живлення – батарейки та продовжує вести відлік часу, навіть якщо мікроконтролер без живлення.

Використання годинника реального часу, може бути корисне в проектах поливу. Також в проектах з увімкненням освітлення по заданому часу.

Мікроконтролери зокрема Arduino мають вбудований лічильник, але цей лічильник занулятися після кожного запуску мікроконтролера. Для цього використовують спеціалізовані мікросхеми, DS1307, DS3231 та інші.

DS3231 і DS1307 функціонально однакові, за винятком того, що DS3231 має вбудований кристал з температурною компенсацією. Це дає більш точний результат.

Модуль DS1307 має вихід під датчик температури DS18B20, тобто можлива програмна реалізація компенсації похибки.

Модулі мають I2C інтерфейс підключення, живиться від акумулятора. Також на модулі розміщена енергонезалежна EEPROM пам’ять, яка може використовуватись як додаткове сховище даних під потреби проекту.

DS1307

DS1307
DS1307
  • Напруга живлення від 4.5V до 5.5V
  • Напруга акумулятора від 2.0V до 3.5V
  • Струм споживання в активному стані 1.5mA
  • Струм споживання в режимі очікування 200μA
  • Струм споживання від акумулятора від 10nA до 800nA (залежить від налаштувань)
  • Похибка 30ppm ~16 хвилин на рік (залежить від температури при температурі ~ 20°C похибка може складати до 2 хвилин на рік)
  • Більш детальна інформація в datasheet.

Перша група контактів

DSВихід DS18B20
SCLI2C SCL (Serial Clock)
SDAI2C SDA (Serial Data)
VCCЖивлення модуля 5V
GNDЗагальний

Друга група контактів

SQВихід меандра
DSВихід DS18B20
SCLI2C SCL (Serial Clock)
SDAI2C SDA (Serial Data)
VCCЖивлення модуля 5V
GNDЗагальний
BATВихід для вимірювання напруги акумулятора

DS3231

  • Напруга живлення від 2.3V до 5.5V
  • Напруга акумулятора від 2.3V до 5.5V
  • Струм споживання в активному стані 300μA при 5.5V – 200μA при 3.65V
  • Струм споживання в режимі очікування 170μA при 5.5V – 110μA при 3.65V
  • Струм споживання від акумулятора в активному режимі до 150μA, в режимі тільки годинника без передачі даних до 3.5μA
  • Похибка 2ppm ~63 секунди на рік
  • Більш детальна інформація в datasheet.

Перша група контактів

SCLI2C SCL (Serial Clock)
SDAI2C SDA (Serial Data)
VCCЖивлення модуля 5V
GNDЗагальний

Друга група контактів

GNDЗагальний
VCCЖивлення модуля
SDAI2C SDA (Serial Data)
SCLI2C SCL (Serial Clock)
SQWВихід меандра / переривання
32KВихід 32Khz

Підключення

Пошук адрес пристроїв на шині I2C

Налаштування годинника

Для початку нам потрібно налаштувати годинник. Потрібно встановити час Unix Time Stamp

[env:uno]
platform = atmelavr
board = uno
framework = arduino
monitor_speed = 9600
lib_deps = 
    adafruit/RTClib @ ^2.1.1
build_flags =
   -DCOMPILE_UNIX_TIME=$UNIX_TIME    

У файлі platformi.ini додатково додамо ‘DCOMPILE_UNIX_TIME’ надалі в коді програми використовуємо його для того, щоб при компіляції та записі прошивки встановлювався час компіляції.

Якщо прошивку завантажується окремо закоментуйте в коді нижче функцію ‘checkAndSetTime()’.

#include <Arduino.h>
#include "RTClib.h"
#include <Wire.h>
#include "SPI.h"

RTC_DS1307 rtc;
//RTC_DS3231 rtc;

void checkAndSetTime();
void printDateAndTime();

void setup()
{
  Serial.begin(9600);
  if (rtc.begin())
  {
    checkAndSetTime();
  }
  else
  {
    Serial.println("Fail run DS1307 RTC module. Please check the connection and reset the Arduino.");
  }
}

void loop()
{
  printDateAndTime();
}

void checkAndSetTime()
{
  if (rtc.now().unixtime() != COMPILE_UNIX_TIME)
  {
    rtc.adjust(DateTime(COMPILE_UNIX_TIME));
  }
}

void printDateAndTime()
{
  Serial.print(rtc.now().year(), DEC);
  Serial.print('/');
  Serial.print(rtc.now().month(), DEC);
  Serial.print('/');
  Serial.print(rtc.now().day(), DEC);
  Serial.print(" ");
  Serial.print(rtc.now().hour(), DEC);
  Serial.print(':');
  Serial.print(rtc.now().minute(), DEC);
  Serial.print(':');
  Serial.print(rtc.now().second(), DEC);
  Serial.println();
  delay(1000);
}

Для вибору свого годинника DS1307 або DS3231 розкоментуйте свій.

Для роботи з ESP32 додайте:

#include "Wire.h"

Також на ESP можливо реалізувати автоматичну синхронізацію часу NTP отримання точної дати та часу.

Будильник на DS3231 та Arduino

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *