/*
DS3231: Real-Time Clock. Simple example
Read more: www.jarzebski.pl/arduino/komponenty/zegar-czasu-rzeczywistego-rtc-ds3231.html
GIT: https://github.com/jarzebski/Arduino-DS3231
Web: http://www.jarzebski.pl
(c) 2014 by Korneliusz Jarzebski
*****************************************************************************
*
* Автор Перевода: Обушенков Алексей Андреевич
* Группа в ВК https://vk.com/engineer24
* Канал на YouTube https://www.youtube.com/channel/UCih0Gcl9IEdkR8deDJCiodg
* Инженерка Engineering room
*
*****************************************************************************
* Модули в составе проекта:
* ESP8266 - 12E WIFI RobotDyn (3.68 $) https://goo.gl/k6TRUz
* ESP8266 - 12E WIFI GREAT WALL (3.44 $) https://goo.gl/DcqYMg
* Модуль часов реального времени:
* DS3231 Модуль RTC (1.95 $) https://goo.gl/3jMusY
* RTC DS3231 (часы реального времени)RobotDyn + аккумулятор (2.90 $) https://goo.gl/gGMRak
*/
// Модуль DS3231 имеет напряжения питания 3,3В и 5В
// Батарейка типа CR2032
// подключается по I2C:
// Плата ESP-12E подключаем SCL - D1(GPIO5) // SDA - D2(GPIO4)
// Плата Arduino UNO (NANO) SCL - А5 // SDA - А4
#include <Wire.h>
#include <DS3231.h>
DS3231 clock; // Создаем экземпляр класса DS3231 с именем clock
RTCDateTime dt; // Создаем структуру (объявленна в библиотеке) типа RTCDateTime с именем dt
RTCAlarmTime Alarm1; // Создаем структуру (объявленна в библиотеке) типа RTCDateTime с именем Alarm1
volatile boolean isAlarm = false; // Переменная для хранения сработал ли будильник
boolean alarmState = false; // Переменная для состояния будильника
#define alarmLED 16 // Номер вывода D0 (ESP8266)
#define PIN_SQW 14 // Номер вывода D5 прерывание (ESP8266)
int interval = 2; // Задаем интервал (В данном случае это 2 минуты, но то же самое может быть и для часов)
int count = 0; // Переменная которая хранит значение для будильника (в данном случае минуты)
// Функция для прерывания
void alarmFunction()
{
Serial.println("*** Interrupt ***");
isAlarm = true;
}
void setup()
{
// Setup LED Pin
pinMode(alarmLED, OUTPUT);
digitalWrite(alarmLED, HIGH); // задаем состояние светодиода
//
Serial.begin(9600);
// Initialize DS3231
Serial.println("Initialize DS3231");
clock.begin();
clock.enableOutput(false); // Определяем назначение вывода SQW (INT) для генерации прерываний при сработке будильников
// Disarm alarms and clear alarms for this example, because alarms is battery backed.
// Under normal conditions, the settings should be reset after power and restart microcontroller
// Отключить сигналы тревоги и сбросить аварийные сигналы для этого примера, так как сигналы тревоги поддерживаются батареей
// В нормальных условиях настройки должны быть сброшены после включения питания и перезапуска микроконтроллера
clock.armAlarm1(false);
clock.armAlarm2(false);
clock.clearAlarm1();
clock.clearAlarm2();
// Задаем время, например вручную
// Manual (Year, Month, Day, Hour, Minute, Second)
clock.setDateTime(2014, 4, 25, 0, 0, 0);
// Задаем будильник 1 - Каждую 0-ю секунду в каждой минуте
// Set Alarm1 - Every 10s in each minute
// setAlarm1(Date or Day, Hour, Minute, Second, Mode, Armed = true)
//clock.setAlarm1 (0, 0, 0, 10, DS3231_MATCH_S);
count+=interval;
clock.setAlarm2 (0, 0, count, DS3231_MATCH_M);
// Attach Interrput 0. In Arduino UNO connect DS3231 INT to Arduino Pin 2 (Для Arduino)
// Прикрепляем прерывание 0. Для Arduino UNO это PIN2
//pinMode(2, INPUT_PULLUP);
//attachInterrupt(0, alarmFunction, FALLING);
// Прикрепляем прерывание Для ESP8266 это D5 (gpio 14)
// У ESP8266 Прерывания могут быть назначены на любые контакты кроме GPIO16.
pinMode(PIN_SQW, INPUT_PULLUP);
//pinMode(PIN_SQW, INPUT);
attachInterrupt(digitalPinToInterrupt(PIN_SQW), alarmFunction, FALLING);
}
void loop()
{
dt = clock.getDateTime(); // Считываем в структуру dt дату и время из модуля DS3231
Alarm1 = clock.getAlarm1();
// Есть еще примеры вывода времени в примере из библиотеки DS3231_dateformat
Serial.println(clock.dateFormat("d-m-Y H:i:s - l", dt)); // Выводим время в Сериал Монитор
if (isAlarm) // это то же самое если написать if (isAlarm == true)
{
Serial.println("Alarm: " + String(clock.dateFormat("d-m-Y H:i:s - l", Alarm1))); // Выводим настройки будильника
Serial.println();
digitalWrite(alarmLED, alarmState); // задаем состояние светодиода
alarmState = !alarmState; // инвертируем значение состояния
isAlarm = false;
clock.clearAlarm1(); // Сбросить Аварийный сигнал с Будильника 1 RTC
clock.clearAlarm2(); // Сбросить Аварийный сигнал с Будильника 2 RTC
count+=interval;
if (count >= 60){count-=60;}
clock.setAlarm2 (0, 0, count, DS3231_MATCH_M);
}
delay(1000); // Ждет секунду
}