Как подключить часы реального времени (rtc) к arduino

Содержание

Введение

Как микроконтроллеры отслеживают время и дату? Обычный микроконтроллер обладает функцией таймера, который стартует от нуля при подаче напряжения питания, а затем начинает считать. В мире Arduino мы можем использовать функцию , чтобы узнать, сколько прошло миллисекунд с того времени, когда было подано напряжение питания. Когда вы снимете и снова подадите питания, она начнет отсчет с самого начала. Это не очень удобно, когда дело доходит до работы с часами и датами.

Вот здесь и будет удобно использование микросхемы RTC (Real Time Clock, часов реального времени). Эта микросхема с батарейкой 3В или каким-либо другим источником питания следит за временем и датой. Часы/календарь обеспечивают информацию о секундах, минутах, часах, дне недели, дате, месяце и годе. Микросхема корректно работает с месяцами продолжительностью 30/31 день и с високосными годами. Связь осуществляется через шину I2C (шина I2C в данной статье не обсуждается).

Если напряжение на главной шине питания Vcc падает ниже напряжения на батарее Vbat, RTC автоматически переключается в режим низкого энергопотребления от резервной батареи. Резервная батарея – это обычно миниатюрная батарея (в виде «монетки», «таблетки») напряжением 3 вольта, подключенная между выводом 3 и корпусом. Таким образом, микросхема по-прежнему будет следить за временем и датой, и когда на основную схему будет подано питание, микроконтроллер получит текущие время и дату.

В этом проекте мы будем использовать DS1307. У этой микросхемы вывод 7 является выводом SQW/OUT (выходом прямоугольных импульсов). Вы можете использовать этот вывод для мигания светодиодом и оповещения микроконтроллера о необходимости фиксации времени. Мы будем делать и то, и другое. Ниже приведено объяснение работы с выводом SQW/OUT.

Для управления работой вывода SQW/OUT используется регистр управления DS1307.

Ригистр управления DS1307
Бит 7 Бит 6 Бит 5 Бит 4 Бит 3 Бит 2 Бит 1 Бит 0
OUT SQWE RS1 RS0
Бит 7: управление выходом (OUT)
Этот бит управляет выходным уровнем вывода SQW/OUT, когда выход прямоугольных импульсов выключен. Если SQWE = 0, логический уровень на выводе SQW/OUT равен 1, если OUT = 1, и 0, если OUT = 0. Первоначально обычно этот бит равен 0.
Бит 4: включение прямоугольных импульсов (SQWE)
Этот бит, когда установлен в логическую 1, включает выходной генератор. Частота прямоугольных импульсов зависит от значений битов RS0 и RS1. Когда частота прямоугольных импульсов настроена на значение 1 Гц, часовые регистры обновляются во время спада прямоугольного импульса. Первоначально обычно этот бит равен 0.
Биты 1 и 0: выбор частоты (RS)
Эти биты управляют частотой выходных прямоугольных импульсов, когда выход прямоугольных импульсов включен. Следующая таблица перечисляет частоты прямоугольных импульсов, которые могут быть выбраны с помощью данных битов. Первоначально обычно эти биты равны 1.
Выбор частоты прямоугольных импульсов и уровня на выводе SQW/OUT микросхемы DS1307
RS1 RS0 Частота импульсов и уровень на выходе SQW/OUT SQWE OUT
1 Гц 1 x
1 4,096 кГц 1 x
1 8,192 кГц 1 x
1 1 32,768 кГц 1 x
x x
x x 1 1

 Данная таблица поможет вам с частотой:

Выбор частоты прямоугольных импульсов DS1307
Частота импульсов Бит 7 Бит 6 Бит 5 Бит 4 Бит 3 Бит 2 Бит 1 Бит 0
1 Гц 1
4,096 кГц 1 1
8,192 кГц 1 1
32,768 кГц 1 1 1

Если вы подключили светодиод и резистор к выводу 7 и хотите, чтобы светодиод мигал с частотой 1 Гц, то должны записать в регистр управления значение 0b00010000. Если вам нужны импульсы 4,096 кГц, то вы должны записать 0b000100001. В этом случае, чтобы увидеть импульсы вам понадобится осциллограф, так как светодиод будет мигать так быстро, что будет казаться, что он светится постоянно. Мы будем использовать импульсы с частотой 1 Гц.

Код

Код проекта вы можете скачать или скопировать ниже. Код содержит комментарии. Обычно мы рекомендуем копировать код из скачанного файла, т.к. при копировании могут выявляться некоторые ошибки.

Также не забываем, что мы в самом начале подключаем библиотеку LiquidCrystal, которую вы можете скачать в разделе Библиотеки на нашем сайте.

/*
 ###  Самые простые часы на Arduino UNO ###

 Для проекта часов нужны только жк-дисплей 16х2 LCD и 2 кнопки
 Никаких потенциометров для контраса, никаких резисторов 
 Функции кнопок:
 
 - короткое нажатие одной из кнопок включает подсветку на 30 с
 
 Настройка времени
 - Нажмите H для увеличения Часов
 - Нажмите M для увеличения Минут и сброса секунд
*/

#include "LiquidCrystal.h"

// Определяем соединение ЖК-дисплея с цифровыми контактами
const int rs = 2, en = 3, d4 = 4, d5 = 5, d6 = 6, d7 = 7;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

// Настройка контрастности ЖК
int cs=9;// пин 9 для контраста ШИМ
const int contrast = 100;// контраст по умолчанию

// Начальное отображение времени 12:59:45 PM
int h=12;
int m=59;
int s=45;
int flag=1; //PM

// Кнопки установки времени
int button1;
int button2;

// Определение пинов для Кнопок установки времени
int hs=0;// pin 0 для настройки Часов
int ms=1;// pin 1 для настройки Минут

// Тайм-аут подсветки 
const int Time_light=150;
int bl_TO=Time_light;// Тайм-аут подсветки
int bl=10; // Пин подсветки
const int backlight=120; // НЕ БОЛЕЕ 7mA !!!

// Для точного считывания времени используйте часы реального времени Arduino, а не только задержку delay()
static uint32_t last_time, now = 0; // RTC

void setup()
{
  lcd.begin(16,2);
  pinMode(hs,INPUT_PULLUP);// избегать внешних Pullup резисторов для кнопки 1
  pinMode(ms,INPUT_PULLUP);// и кнопки 2
  analogWrite(cs,contrast);// Настроить контрастность VO
  analogWrite(bl,backlight);// Включить подсветку 
  now=millis(); // читать начальное значение RTC  
}

void loop()
{ 
  lcd.begin(16,2);// каждую секунду
// Обновить ЖК-дисплей
// Вывести время TIME в Hour, Min, Sec + AM/PM (часы, минуты, секунды)
 lcd.setCursor(0,0);
 lcd.print("Time ");
 if(h<10)lcd.print("0");// всегда 2 цифры
 lcd.print(h);
 lcd.print(":");
 if(m<10)lcd.print("0");
 lcd.print(m);
 lcd.print(":");
 if(s<10)lcd.print("0");
 lcd.print(s);

 if(flag==0) lcd.print(" AM");
 if(flag==1) lcd.print(" PM");
 
 lcd.setCursor(0,1);// для Line 2
 lcd.print("Precision clock");

// улучшенная замена delay(1000) 
// гораздо лучшая точность, менее зависимая от времени выполнения цикла

for ( int i=0 ;i<5 ;i++)// сделать 5-кратный цикл 200 мс, для более быстрого ответа кнопок
{
  while ((now-last_time)<200) //задержка delay 200ms
  { 
    now=millis();
  }
 // внутренний цикл 200ms
 last_time=now; // готовим следующий цикл 

 // read Setting Buttons (читаем кнопки настройки)
 button1=digitalRead(hs);// Read Buttons
 button2=digitalRead(ms);

 //Время подсветки 
 bl_TO--;
 if(bl_TO==0)
 {
  analogWrite(bl,0);// ВЫКЛ подсветки
  bl_TO++;
 }
 
 // Нажмите что-либо, чтобы активировать подсветку 
 if(  ((button1==0)|(button2==0)) & (bl_TO==1)  )
 {
  bl_TO=Time_light;
  analogWrite(bl,backlight);
  // дождитесь отпускания кнопки
  while ((button1==0)|(button2==0))
  {
   button1=digitalRead(hs);// Read Buttons
   button2=digitalRead(ms);
  }
 }
 else
 // Поведение Кнопки 1 или Кнопки 2 пока подсветка ВКЛ 
 {
  if(button1==0){
   h=h+1;
   bl_TO=Time_light;
   analogWrite(bl,backlight);
  }

 if(button2==0){
  s=0;
  m=m+1;
  bl_TO=Time_light;
  analogWrite(bl,backlight);
  }

/* ---- управлять секундами, минутами, часами am / pm ----*/
 if(s==60){
  s=0;
  m=m+1;
 }
 if(m==60)
 {
  m=0;
  h=h+1;
 }
 if(h==13)
 {
  h=1;
  flag=flag+1;
  if(flag==2)flag=0;
 }

 if((button1==0)|(button2==0))// Обновить дисплей, если нажата кнопка
 {
  // Обновить ЖК
  // Вывести время TIME в часах, минутах, секундах + AM/PM
  lcd.setCursor(0,0);
  lcd.print("Time ");
  if(h<10)lcd.print("0");// всегда 2 цифры
  lcd.print(h);
  lcd.print(":");
  if(m<10)lcd.print("0");
  lcd.print(m);
  lcd.print(":");
  if(s<10)lcd.print("0");
  lcd.print(s);

  if(flag==0) lcd.print(" AM");
  if(flag==1) lcd.print(" PM");
 
  lcd.setCursor(0,1);// для Line 2
  lcd.print("Precision clock");
 }

 } // end if else
}// end for

// outer 1000ms loop (завершение цикла)
 s=s+1; //увеличение секунд
        
// ---- управлять секундами, минутами, часами + am/pm ----
 if(s==60){
  s=0;
  m=m+1;
 }
 if(m==60)
 {
  m=0;
  h=h+1;
 }
 if(h==13)
 {
  h=1;
  flag=flag+1;
  if(flag==2)flag=0;
 }  
// Loop end (конец цикла)
}

Technical Notes

Internal system time is based on the standard Unix .
The value is the number of seconds since Jan 1, 1970.
System time begins at zero when the sketch starts.

The internal time can be automatically synchronized at regular intervals to an external time source.
This is enabled by calling the function — the provider argument is
the address of a function that returns the current time as a .
See the sketches in the examples directory for usage.

The default interval for re-syncing the time is 5 minutes but can be changed by calling the
method to set the number of seconds between re-sync attempts.

The Time library defines a structure for holding time elements that is a compact version of the C structure.
All the members of the Arduino structure are bytes and the year is offset from 1970.
Convenience macros provide conversion to and from the Arduino format.

Low-level functions to convert between system time and individual time elements are provided:

breakTime(time, &tm);  // break time_t into elements stored in tm struct
makeTime(&tm);         // return time_t from elements stored in tm struct

This DS1307RTC library provides an example of how a time provider
can use the low-level functions to interface with the Time library.

Сравнение популярных модулей RTC DS1302, DS1307, DS3231

В этой таблице мы привели список наиболее популярных модулей и их основные характеристики.

Название Частота Точность Поддерживаемые протоколы
DS1307 1 Гц, 4.096 кГц, 8.192 кГц, 32.768 кГц Зависит от кварца – обычно значение достигает 2,5 секунды в сутки, добиться точности выше 1 секунды в сутки невозможно. Также точность зависит от температуры. I2C
DS1302 32.768 кГц 5 секунд в сутки I2C, SPI
DS3231 Два выхода – первый на 32.768 кГц, второй – программируемый от 1 Гц до 8.192 кГц ±2 ppm при температурах от 0С до 40С.

±3,5 ppm при температурах от -40С до 85С.

Точность измерения температуры – ±3С

I2C

Examples

The Time directory contains the Time library and some example sketches
illustrating how the library can be used with various time sources:

  • shows Arduino as a clock without external hardware.
    It is synchronized by time messages sent over the serial port.
    A companion Processing sketch will automatically provide these messages
    if it is running and connected to the Arduino serial port.

  • adds day and month name strings to the sketch above.
    Short (3 characters) and long strings are available to print the days of
    the week and names of the months.

  • uses a DS1307 real-time clock to provide time synchronization.
    The basic DS1307RTC library must be downloaded and installed,
    in order to run this sketch.

  • is similar to the above and adds the ability to set the Real Time Clock.

  • demonstrates how to calculate the difference between times.
    It is a very simple logger application that monitors events on digital pins
    and prints (to the serial port) the time of an event and the time period since
    the previous event.

Работа схемы

Схема устройства представлена на следующем рисунке.

Плата Arduino управляет всеми процессами на этой схеме: она принимает данные от GPS модуля, извлекает дату и время из строки $GPRMC и показывает их на экране ЖК дисплея.

Контакты данных ЖК дисплея D4, D5, D6, D7 подсоединены к контактам 5, 4 , 3, 2 Arduino, а контакты управления ЖК дисплея RS и EN подсоединены к контактам 7 и 6 Arduino. Контакт передачи Tx GPS модуля подсоединен к контакту Rx (pin 10) платы Arduino (мы этот контакт сделаем входом последовательного порта с помощью соответствующей бибблиотеки). Контакты земли GPS модуля и платы Arduino соединены вместе. В данной схеме мы использовали GPS модуль SKG13BL, функционирующий на скорости 9800 бод/с, плату Arduino (ее последовательный порт) также можно сконфигурировать на работу со скоростью 9800 бод/с с помощью команды “Serial.begin(9800)”.

Constructor

Description

For AVR architecture only (for backwards compatibility with the DS1307RTC library), the DS3232RTC library instantiates a DS3232RTC object named ; the user should not use the constructor for AVR boards. For other architectures, the user’s code must instantiate a DS3232RTC object.

Parameters

initI2C: An optional parameter to control whether the constructor initializes the I2C bus. The default is true (again for backwards compatibility). (bool)

Example
// For non-AVR boards only. Not needed for AVR boards.
DS3232RTC myRTC(false);     // tell constructor not to initialize the I2C bus.

Системные библиотеки ардуино

Библиотека EEPROM

Стандартная библиотека. Предназначена для работы с энергонезависимой памятью (запись данных, их чтение).

Пример использования:

#include <EEPROM.h>

EEPROM.read(); – создание объекта, считывание байта по адресу из энергонезависимой памяти.

EEPROM.write(address, value)– запись байта в энергонезависимую память.

EEPROM.put() – запись строк чисел с плавающей запятой.

EEPROM.get() – чтение строк и чисел с плавающей запятой.

Библиотека SoftwareSerial

Библиотека, которая позволяет реализовывать последовательные интерфейсы с любых цифровых пинов. Также позволяет создавать несколько последовательных портов, которые работают на скорости до 115200 бод.

#include <SoftwareSerial.h>

SoftwareSerial mySerial(RX, TX) – создание объекта, аргументы – выводы, к которым подключены RX и TX.

Serial.begin( ); – устанавливает скорость порта для связи ардуино и компьютера.

mySerial.overflow() – проверка входного буфера на переполнение.

Библиотека Math

Включает в себя большое количество математических функций для работы с числами с плавающей запятой.

Пример использования:

#include <math.h>

Math(); – создание экземпляра Math.

Serial.print(“cos num = “); – возвращает косинус числа.

Serial.println (fmod (double__x, double__y)); – возвращает числа по модулю.

Библиотека Scheduler

Предназначена для работы с Arduino Due, позволяет работать в режиме многозадачности. Пока является экспериментальной библиотекой.

Пример использования:

#include <Scheduler.h>

Scheduler; – создание экземпляра.

Scheduler.startLoop() – позволяет добавить функцию, которая будет выполняться вместе с loop().

yield() – позволяет передать управление другим задачам.

Библиотека Servo

Стандартная библиотека. Необходима для управления серводвигателями  и часто используется в робототехнических проектах с манипуляторами.

Пример использования:

#include <Servo.h>

Servo myservo; – создание объекта для серводвигателя..

myservo.attach(); – номер выхода, к которому подключен серводвигатель.

myservo.write(180, 30, true); – движение на 180 градусов, скорость 30, ожидание окончания движения.

Библиотека Stepper

Небходима для управления шаговым униполярным и биполярным двигателем.

#include <Stepper.h>

const int stepsPerRevolution =  ; – количество шагов, за которое двигатель проходит полный поворот.

Stepper myStepper = Stepper(steps, pin1, pin2) – создает экземпляр класса с указанным количеством шагов и выводами, к которым подключается двигатель.

Библиотеки коммуникации

Библиотека Wire

Требуется для работы с двухпроводным интерфейсом I2C.

Пример использования:

#include <Wire.h>

Wire.begin() – инициализация библиотеки, подключение к шине I2C.

Wire.requestFrom() – запрос мастером байтов от ведомого устройства.

Wire.beginTransmission() – начало передачи на ведомое устройство.

Библиотека Irremote

Требуется для работы ардуино с ИК приемником.

Пример использования:

#include <IRremote.h>

IRrecv irrecv(RECV_PIN); – пин, к которому подключен ИК приемник.

SetPinAndButton(int ir1,int ir2,int pin) – позволяет настроить определенный выход на срабатывание при заданных значениях ir1, ir2.

Библиотека GSM

Требуется для соединения через GSM-плату с сетью GSM/GRPS. С ее помощью можно реализовать операции, свершаемые GSM-телефоном, работать с голосовыми вызовами и подключаться к сети интернет через GRPS.

Пример использования:

#include <GSM.h>

GSM GSMAccess – инициализирует экземпляр класса.

gprs.powerOn() – включение питания.

GSMVoiceCall – настройка голосовых вызовов.

GPRS – настройка подключения к интернету.

GSM – управление радио-модемом.

Библиотека RFID

Требуется для соединения Ардуино и RFID-модуля.

Пример использования:

#include <RFID.h>

RFID rfid(SS_PIN, RST_PIN); – создание экземпляра rfid, аргументы – пины, к которым подключен модуль.

rfid.init(); – инициализация модуля RFID.

Библиотека MFRC 522

Требуется для соединения Ардуино и MFRC522 -модуля.

Пример использования:

#include <MFRC522.h>

MFRC522 mfrc522(SS_PIN, RST_PIN); – создание экземпляра MFRC522, аргументами указаны выходы, к которым подключен модуль.

mfrc522.PCD_Init(); – инициализация MFRC522.

Библиотека Ethershield

Новая версия https://github.com/jcw/ethercard

Требуется для подключения Ардуино к локальной сети или сети интернет. Библиотека больше не поддерживается, более новая версия Ethercard. Также существует стандартная библиотека Ethernet.

Пример использования:

#include «EtherShield.h»

#include <EtherCard.h>

EtherShield es = EtherShield (); – подготовка веб-страницы

ether.begin(sizeof Ethernet::buffer, mymac, ); – начало работы, аргументы – адрес Mac и номер порта, к которому подключен выход CS.

Библиотека Nrf24l01

Требуется для работы с RF24-радиомодулем.

Пример использования:

#include “RF24.h”

RF24 – Конструктор создает новый экземпляр драйвера. Перед тем, как использовать, нужно создать экземпляр и указать пины, к которым подключен чип (_cepin : контакт модуля Enable, cspin :  контакт модуля Select).

Begin – начало работы чипа.

setChannel – каналы для связи RF.

setPayloadSize – установка фиксированного размера передачи.

getPayloadSize – получение фиксированного размера.

Библиотека TinyGPS

Требуется для чтения сообщений GPGGA и GPRMC. Помогает считывать данные о положении, дате, времени, высоте и других параметрах.

Пример использования:

#include <TinyGPS.h>

TinyGPS gps; – создание экземпляра TinyGPS.

encode () – подача на объект последовательных данных по одному символу.

gps.stats( ) – метод статистики. Показывает, получены корректные данные или нет.

Работа программного обеспечения

Интерфейс DS5000

Программа, приведённая в Приложении, написана для взаимодействия DS5000 с DS1307 с помощью двухпроводного интерфейса. DS5000 запрограммирован с использованием макетной платы DS5000T фирмы Dallas Semiconductor, которая позволяет использовать ПК в качестве терминала ввода/вывода. Программные средства KIT5K поставляемые вместе с макетной платой DS5000T обеспечивают высокоуровневый интерфейс для загрузки программных приложений в DS5000 или установки его параметров через Program command. Программное обеспечение KIT5K содержит эмулятор терминала ввода/вывода, чтобы позволить пользователю запускать программные приложения в микроконтроллер DS5000, который связан с пользователем через COM порт ПК.

Исходный код DS1307

Первый раздел исходного кода, расположенный в Приложении, используется при конфигурации DS5000 для последовательного соединения с ПК. Также в начале кода находится подпрограмма MASTER_CONTROLLER, которая используется для управления демонстрационной программой.

Подпрограммы, которые следуют непосредственно за подпрограммой MASTER_CONTROLLER, являются драйверами низкого уровня и служат для управления двухпроводным интерфейсом. Они не являются индивидуальными для DS1307, а могут быть использованы с любым совместимым с двухпроводным интерфейсом «ведомым» устройством. Вот эти подпрограммы:

SEND_START

Подпрограмма используется для генерации состояния START на двухпроводной шине.

SEND_STOP

Подпрограмма используется для генерации состояния STOP на двухпроводной шине.

SEND_BYTE

Подпрограмма посылает 8-разрядное слово (первым является старший значащий бит (MSB)) по двухпроводной шине и девятый тактовый импульс для импульса подтверждения приёма.

READ_BYTE

Подпрограмма читает 8-разрядное слово с двухпроводной шины. Она проверяет очищен ли флаг LASTREAD после того, как считан последний байт из «ведомого» устройства. Если это был не последний байт, то DS5000 посылает импульс подтверждения по девятому тактовому импульсу, а если это был последний считанный байт из «ведомого» устройства, то DS5000 посылает «неподтверждение».

SCL_HIGH

Подпрограмма осуществляет переход линии SCL из низкого в высокое состояние и обеспечивает высокое состояние линии SCL перед продолжением.

DELAY и DELAY_4

Эти две подпрограммы включены для обеспечения сохранения временной диаграммы двухпроводной шины.

Остальная часть кода, включённая в приложение, специально предназначена для демонстрации функций DS1307. Продемонстрированы следующие функции:

Setting Time

Время считывается с клавиатуры и сохраняется в сверхоперативной памяти DS5000. Затем оно передаётся по двухпроводной шине в DS1307.

Set RAM

Одиночный байт в шестнадцатеричном виде считывается с клавиатуры и записывается в RAM DS1307.

Read Date/Time

Дата и время считываются по двухпроводной шине и сохраняются в сверхоперативной памяти DS5000. Затем они выводятся на экран. Это продолжается до тех пор, пока не будет нажата кнопка на клавиатуре.

OSC On/OSC Off

Тактовый генератор DS1307 может быть включен или выключен.

SQW/OUT On/SQW/OUT Off

Функция SQW/OUT может быть включена или выключена. Она будет переключаться на частоте 1 Гц.

Таблица 1. AC электрические характеристики

Параметр Символ Эффективноезначение Единицы
Тактовая частота SCL fSCL 59 кГц
Время свободного состояния шины между состояниями STOP и START tBUF 5.7 мкс
Время удержания(повторенного) состояния START tHD:STA 6.2 мкс
Период низкого состояния тактового импульса SCL tLOW 10.5 мкс
Период высокого состояния тактового импульса SCL tHIGH 6.5 мкс
Время установки для повторного состояния START tSU:STA 5.3 мкс
Время удержания данных tHD:DAT 5.5 мкс
Время установки данных tSU:DAT 3.1 мкс
Время установки для состояния STOP tSU:STO 5.4 мкс

Заключение

Было показано, как правильно подсоединять напрямую DS1307 или любое двухпроводное «ведомое» устройство к 8051-совместимому микроконтроллеру. Соединение должно быть таким, чтобы временная диаграмма двухпроводного интерфейса на микроконтроллере не нарушалась драйверами низкого уровня. Для этого в программный код должны быть включены подпрограммы задержки. Приведённых в таблице 1 эффективных значений, придерживались при конфигурации аппаратной части, описанной в данном техническом руководстве.

Документация

  Rus Пример программы на языке Асемблер
  100 Kb Engl Исходный фаил
  Rus Описание интерфейса I2C
  Програмное обеспечение микроконтроллеров MCS-51
  200 Kb Engl Описание DS1307 — часы реального времени с IIC интерфейсом

Главная —
Микросхемы —
DOC —
ЖКИ —
Источники питания —
Электромеханика —
Интерфейсы —
Программы —
Применения —
Статьи

Примеры

  • TimeArduinoDue — Синхронизация времени с помощью RTC (для Arduino Due)
  • TimeGPS — Синхронизация времени с помощью GPS
  • TimeNTP — Синхронизация времени с помощью NTP-сервера
  • TimeNTP ESP8266WiFi — Синхронизация времени с помощью NTP-сервера и WiFi
  • TimeRTC — Синхронизация времени с помощью RTC (для остальных Arduino)
  • TimeRTCLog — Учет изменений состояний на контактах с помощью RTC
  • TimeRTCSet — Установка RTC-времени
  • TimeSerial — Настройка библиотеки Time при помощи последовательного порта
  • TimeSerialDateStrings — Настройка библиотеки Time при помощи последовательного порта (со строковыми сообщениями)
  • TimeTeensy3 — Синхронизация времени с помощью RTC на Teensy

Compact Alarm with Card Reader and RTC

With this alarm, you can tell whenever someone enters your house which can be turned on and off with a card reader and also automatically activated with the RTC!

What do you need?

  • Arduino Uno Rev3 / Seeeduino V4.2 ($6.90)
  • Bread board Clear – 8.2 x 5.3cm
  • LED (Generic)
  • Resistor 221 ohm
  • Grove – Ultrasonic Distance Sensor
  • Grove – Buzzer
  • Grove – RTC
  • RC522 Card Reader

Interested? You can check out the full tutorial by Simonee Adobs on Arduino Project Hub here!

OLED RTC Clock

With an RTC module, you can of course also make your OLED digital clock with the Arduino which shows the date, time and day!

What do you need

  • Arduino Uno Rev3 / Seeeduino V4.2 ($6.90) or Arduino Nano v3 / Seeeduino Nano 
  • Grove – RTC
  • Grove – OLED Display 1.12” V2
  • 2 x Grove – Button
  • 32.768KHz crystal oscillator
  • 2 x 10K ohm resistor
  • 3V coin cell battery

Interested? You can find the full tutorial on Simple Projects!

Code 1 : Setting the time and date of the module and showing it on the serial monitor

This code will permit you to set the DS1302 and then display date and time on the serial monitor.

Please read carefully the code below, the line

myRTC.setDS1302Time(15, 22, 21, 7, 14, 1, 2018);

1 myRTC.setDS1302Time(15,22,21,7,14,1,2018);

Permits you to set the module on the given values (numbers typed there), you have to set it up to your current date/time and then comment it

//myRTC.setDS1302Time(15, 22, 21, 7, 14, 1, 2018);

1 //myRTC.setDS1302Time(15, 22, 21, 7, 14, 1, 2018);

And reupload the code again to the Arduino with removed or commented (//) setDS1302Time function, so when you restart your Arduino the program doesn’t execute the function again.

Code 1:

//This code is to use with DS1302 RTC module, it permits you to setup the actual time and date
//And you can visualize them on the serial monitor
//This code is a modified version of the code provided in virtuabotixRTC library
//Refer to https://Surtrtech.com for more information

#include <virtuabotixRTC.h> //Library used

//Wiring SCLK -> 6, I/O -> 7, CE -> 8
//Or CLK -> 6 , DAT -> 7, Reset -> 8

virtuabotixRTC myRTC(6, 7, 8); //If you change the wiring change the pins here also

void setup() {
Serial.begin(9600);

// Set the current date, and time in the following format:
// seconds, minutes, hours, day of the week, day of the month, month, year
myRTC.setDS1302Time(15, 22, 21, 7, 14, 1, 2018); //Here you write your actual time/date as shown above
//but remember to «comment/remove» this function once you’re done
//The setup is done only one time and the module will continue counting it automatically
}

void loop() {
// This allows for the update of variables for time or accessing the individual elements.
myRTC.updateTime();

// Start printing elements as individuals
Serial.print(«Current Date / Time: «);
Serial.print(myRTC.dayofmonth); //You can switch between day and month if you’re using American system
Serial.print(«/»);
Serial.print(myRTC.month);
Serial.print(«/»);
Serial.print(myRTC.year);
Serial.print(» «);
Serial.print(myRTC.hours);
Serial.print(«:»);
Serial.print(myRTC.minutes);
Serial.print(«:»);
Serial.println(myRTC.seconds);

// Delay so the program doesn’t print non-stop
delay(1000);
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43

//This code is to use with DS1302 RTC module, it permits you to setup the actual time and date
//And you can visualize them on the serial monitor
//This code is a modified version of the code provided in virtuabotixRTC library

 
#include <virtuabotixRTC.h> //Library used
 
//Wiring SCLK -> 6, I/O -> 7, CE -> 8
//Or CLK -> 6 , DAT -> 7, Reset -> 8
 

virtuabotixRTC myRTC(6,7,8);//If you change the wiring change the pins here also

voidsetup(){

Serial.begin(9600);

 
// Set the current date, and time in the following format:

// seconds, minutes, hours, day of the week, day of the month, month, year

myRTC.setDS1302Time(15,22,21,7,14,1,2018);//Here you write your actual time/date as shown above

//but remember to «comment/remove» this function once you’re done

//The setup is done only one time and the module will continue counting it automatically

}
 

voidloop(){

// This allows for the update of variables for time or accessing the individual elements.

myRTC.updateTime();

 
// Start printing elements as individuals

Serial.print(«Current Date / Time: «);

Serial.print(myRTC.dayofmonth);//You can switch between day and month if you’re using American system

Serial.print(«/»);

Serial.print(myRTC.month);

Serial.print(«/»);

Serial.print(myRTC.year);

Serial.print(» «);

Serial.print(myRTC.hours);

Serial.print(«:»);

Serial.print(myRTC.minutes);

Serial.print(«:»);

Serial.println(myRTC.seconds);

 
// Delay so the program doesn’t print non-stop

delay(1000);

}

Code 2: Showing the Date/Time on a LCD i2c screen

This code uses the LCD i²c screen, optional of course, be careful again with “SetDS1302Time” function again (read above).

Библиотеки для работы с датой и временем ардуино

Библиотека RTClib

Библиотека для работы с часами реального времени, упрощающая взаимодействие с Ардуино.

Пример использования:

#include <RTClib.h>

RTC_DS1307 RTC; – выбор датчика (в данном случае DS1307).

rtc.adjust(DateTime( Date, Time)); – настройка времени и календаря.

dayOfTheWeek () – вывод дня недели. Аргумент от 0 до 6, 0 – воскресенье.

Библиотека Timelib

Позволяет Ардуино получать информацию о дате и времени в данный момент.

Пример использования:

#include <TimeLib.h>

Time(); – создание экземпляра.

setTime (t); – установка времени. Аргумент t – час, минута, секунда, день, месяц и год.

timeStatus(); – показывает, установлено ли время.

adjustTime(adjustment); – настройка времени.

Библиотека Ds1307

Библиотека для удобного взаимодействия часов DS1307 с Ардуино c использованием библиотеки Wire.

Пример использования:

#include <DS1307RTC.h>

class DS1307RTC – создание объекта DS1307.

SetTime() – установка времени.

get() – считывает RTC, возвращает полученную дату в формате POSIX.

Set(time_t t) – запись даты в RTC

Библиотека DS 3231

Предназначена для управления датой и временем в модуле ds3231.

#include “ds3231.h”

DS3231  Clock(SDA, SCL); – создание объекта DS3231, подключение к линии тактирования и линии данных.

getTime(); – считывание даты и времени с часов.

setDate(date, mon, year); – установка даты.

Часы с выводом на экран Nokia 5110

Следующий урок — часы на Arduino, которые также простые для сборки, где вы сможете установить дату и время на последовательном мониторе.

В этом уроке используются лишь несколько компонентов — только перемычки, Arduino и дисплей Nokia 5110/3110.

Комплектующие

Детали, используемые в этом проекте ниже.

Оборудование

  • Arduino UNO и Genuino UNO × 1
  • Adafruit дисплей Nokia 5110 × 1
  • Соединительные провода (универсальные) × 1
  • Резистор 221 Ом × 1

Программное обеспечение

Схема соединения

Соединяем детали часов на Ардуино как на схеме выше:

  • контакт pin 3 — последовательный тактовый выход (SCLK) // pin 3 — Serial clock out (SCLK)
  • контакт pin 4 — выход серийных данных (DIN) // pin 4 — Serial date out (DIN)
  • контакт pin 5 — дата / выбор команды (D / C) // pin 5 — date/Command select (D/C)
  • контакт pin 6 — выбор ЖК-чипа (CS / CE) // pin 6 — LCD chip select (CS/CE)
  • контакт pin 7 — сброс ЖК (RST) // pin 7 — LCD reset (RST)

Код урока

Код второй версии часов вы можете скачать или скопировать ниже.

#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>

Adafruit_PCD8544 display = Adafruit_PCD8544(3,4,5,6,7);

int second,minute, hour, day, mounth,year; 
unsigned long UtlTime; 

void setup() 
pinMode(2,OUTPUT);
UtlTime=0;   {   

minute=0;   
hour=0;   
day=0;   
mounth=0;   
year=0;   
Serial.begin(9600);   
  display.begin();
  display.setContrast(50); // Adjust the display contrast
  display.clearDisplay();   //Apaga o buffer e o display
  display.setTextSize(1);  //Seta o tamanho do texto
  display.setTextColor(BLACK); //Seta a cor do texto      
   
display.print(" date e hour ");   
display.setCursor(0,10);   
display.print(" com Arduino");   
display.display();
delay (5000); 

//Configura o minute   
display.clearDisplay();   
display.setCursor(0,0);   
display.print("minute: ");
display.display();
Serial.print("\nin between minute:");  
while(minute==0)   {     
if (Serial.available() > 0)     
{       
minute= Serial.parseInt();     
}   
}   
display.print(minute);   
display.display();
delay(1000); 

//Configura a hour   
display.clearDisplay();   
display.setCursor(0,0);   
display.print("hour: ");   
display.display();
Serial.print("\nin between hour:"); 
while(hour==0)   
{     
if (Serial.available() > 0)     
{       
hour= Serial.parseInt();     
}   
}   
display.print(hour);   
display.display();
delay(1000);    

//Configura o day   
display.clearDisplay();   
display.setCursor(0,0);   
display.print("day: ");
display.display();   
Serial.print("\nin between day:");   
while(day==0)   
{     
if (Serial.available() > 0)     
{       
day= Serial.parseInt();     
}   
}   
display.print(day);   
display.display();
delay(1000);    

//Configura o mês   
display.clearDisplay();   
display.setCursor(0,0);   
display.print("mounth: "); 
display.display();  
Serial.print("\nin between mounth:");  
while(mounth==0)   
{     
if (Serial.available() > 0)     
{       
mounth= Serial.parseInt();     
}   
}   
display.print(mounth);  
 display.display();
delay(1000);    

//Configura o year   
display.clearDisplay();   
display.setCursor(0,0);   
display.print("year: ");   
display.display();
Serial.print("\nin between year:");   
while(year==0)   
{     
if (Serial.available() > 0)     
{       
year= Serial.parseInt();     
}   
}   
display.print(year);   

display.display();   
delay(1000);
display.clearDisplay(); 

} 

void loop() 
{   

if(millis()-UtlTime<0)   
{     
UtlTime=millis();   
}   
else   
{     
second=int((millis()-UtlTime)/1000);   
}   
if(second>59)   
{     
second=0;     
minute++;     
UtlTime=millis();     
if(minute>59)     
{       
hour++;       
minute=0;       
if(hour>23)       
{         
day++;         
hour=0;         
if(mounth==1||mounth==3||mounth==5||mounth==7||mounth==8||mounth==10||mounth==12)         
{           
if(day>31)           
{             
day=1;             
mounth++;             
if(mounth>12)             
{               
year++;               
mounth=1;             
}           
}         
}         
else if(mounth==2)         
{           
if(year%400==0)           
{             
if(day>29)             
{               
day=1;               
mounth++;             
}           
}           
else if((year%4==0)&&(year%100!=0))           
{             
if(day>29)             
{              
day=1;               
mounth++;             
}           
}           
else           
{             
if(day>28)             
{               
day=1;               
mounth++;             
}           
}         
}         
else         
{           
if(day>30)           
{             
day=1;             
mounth++;           
}         
}       
}     
}   
}    

display.clearDisplay(); 
delay(1000); 
Serial.print(day);   
Serial.print("/");   
Serial.print(mounth);   
Serial.print("/");   
Serial.print(year);   
Serial.println();      

display.setCursor(0,0);   
display.print("date ");   
display.print(day);   
display.print("/");   
display.print(mounth);   
display.print("/");   
display.print(year);

 
display.display();
Serial.print(hour);   
Serial.print(":");   
Serial.print(minute);   
Serial.print(":");   
Serial.print(second);   
Serial.print("\n");   
Serial.println();      

display.setCursor(0,10);   
display.print("hour ");   
display.print(hour);   
display.print(":");   
display.print(minute);   
display.print(":");   
display.print(second); 
display.display();
char tecla;
tecla = Serial.read();
if(tecla=='1'){
digitalWrite(2,LOW);
}
if(tecla=='2'){
  digitalWrite(2, HIGH);
}

}