Годинник реально часу (Real Time Clock) – це пристрій який дозволяє зберігати та відстежувати поточний час Для Arduino найчастіше використовуються модулі DS1307 або DS3231. Модуль працює від автономного живлення – батарейки та продовжує вести відлік часу, навіть якщо мікроконтролер без живлення.
Використання годинника реального часу, може бути корисне в проектах поливу. Також в проектах з увімкненням освітлення по заданому часу.
Мікроконтролери зокрема Arduino мають вбудований лічильник, але цей лічильник занулятися після кожного запуску мікроконтролера. Для цього використовують спеціалізовані мікросхеми, DS1307, DS3231 та інші.
DS3231 і DS1307 функціонально однакові, за винятком того, що DS3231 має вбудований кристал з температурною компенсацією. Це дає більш точний результат.
Модуль DS1307 має вихід під датчик температури DS18B20, тобто можлива програмна реалізація компенсації похибки.
Модулі мають I2C інтерфейс підключення, живиться від акумулятора. Також на модулі розміщена енергонезалежна EEPROM пам’ять, яка може використовуватись як додаткове сховище даних під потреби проекту.
DS1307
- Напруга живлення від 4.5V до 5.5V
- Напруга акумулятора від 2.0V до 3.5V
- Струм споживання в активному стані 1.5mA
- Струм споживання в режимі очікування 200μA
- Струм споживання від акумулятора від 10nA до 800nA (залежить від налаштувань)
- Похибка 30ppm ~16 хвилин на рік (залежить від температури при температурі ~ 20°C похибка може складати до 2 хвилин на рік)
- Більш детальна інформація в datasheet.
Перша група контактів
DS | Вихід DS18B20 |
SCL | I2C SCL (Serial Clock) |
SDA | I2C SDA (Serial Data) |
VCC | Живлення модуля 5V |
GND | Загальний |
Друга група контактів
SQ | Вихід меандра |
DS | Вихід DS18B20 |
SCL | I2C SCL (Serial Clock) |
SDA | I2C 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.
Перша група контактів
SCL | I2C SCL (Serial Clock) |
SDA | I2C SDA (Serial Data) |
VCC | Живлення модуля 5V |
GND | Загальний |
Друга група контактів
GND | Загальний |
VCC | Живлення модуля |
SDA | I2C SDA (Serial Data) |
SCL | I2C 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 отримання точної дати та часу.