#include <RTClib.h> // https://github.com/adafruit/RTClib
#include <TimeLib.h> // https://github.com/PaulStoffregen/Time
#define relePin 2
#define LED 13 // built-in led
#define SWITCH_PIN 3
#define SUNDAY 0
#define SATURDAY 6
#define RING_SECONDS 7
#define TZ_OFFSET 180 // MSK
#define HOURS 60
RTC_DS3231 rtc;
bool status_led = false;
const char* daysOfTheWeek[7] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
const uint16_t raspisanie[] = {
8 * HOURS + 30,
9 * HOURS + 15,
9 * HOURS + 25,
10 * HOURS + 10,
10 * HOURS + 30,
11 * HOURS + 15,
11 * HOURS + 35,
12 * HOURS + 20,
12 * HOURS + 30,
13 * HOURS + 15,
13 * HOURS + 25,
14 * HOURS + 10,
14 * HOURS + 20,
15 * HOURS + 5,
15 * HOURS + 10,
15 * HOURS + 50,
};
const uint16_t raspisanie2[] = {
8 * HOURS + 30,
9 * HOURS + 5,
9 * HOURS + 10,
9 * HOURS + 45,
10 * HOURS + 1,
10 * HOURS + 35,
10 * HOURS + 50,
11 * HOURS + 25,
11 * HOURS + 30,
12 * HOURS + 5,
12 * HOURS + 10,
12 * HOURS + 45,
12 * HOURS + 50,
13 * HOURS + 25,
};
void zvonok(DateTime &dt){
for (int i = 0; i != sizeof(raspisanie)/sizeof(uint16_t); ++i ){
if ( (dt.hour() * HOURS + dt.minute()) == raspisanie[i] ){
digitalWrite(relePin, dt.second() < RING_SECONDS ? LOW : HIGH );
if (digitalRead(relePin)) digitalWrite(LED_BUILTIN, HIGH);
if (dt.second() < RING_SECONDS){
Serial.print("Raspisanie 1: Ring for ");
Serial.print(RING_SECONDS - dt.second());
Serial.println(" seconds more");
}
}
}
};
void zvonok2(DateTime &dt){
for (int i = 0; i != sizeof(raspisanie2)/sizeof(uint16_t); ++i ){
if ( (dt.hour() * HOURS + dt.minute()) == raspisanie2[i] ){
digitalWrite(relePin, dt.second() < RING_SECONDS ? LOW : HIGH );
if (digitalRead(relePin)) digitalWrite(LED_BUILTIN, HIGH);
if (dt.second() < RING_SECONDS){
Serial.print("Raspisanie 2: Ring for ");
Serial.print(RING_SECONDS - dt.second());
Serial.println(" seconds more");
}
}
}
};
void setup() {
pinMode(relePin, OUTPUT); // выход на реле
pinMode(LED, OUTPUT); // Встроенный светодиод, например на Nano имеется...
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
digitalWrite(relePin, HIGH);
digitalWrite(LED, LOW);
Serial.begin(9600); // Скорость Serial-порта
while (!rtc.begin()) {
Serial.println("Couldn't find RTC");
digitalWrite(LED, !digitalRead(LED)); // И мигаем при этом встроенным светодиодом, сообщая о проблеме...
delay(200);
}
DateTime time_now = rtc.now();
adjustTime(TZ_OFFSET * SECS_PER_MIN);
setTime(time_now.hour(), time_now.minute(), time_now.second(), time_now.day(), time_now.month(), time_now.year());
}
void loop() {
//DateTime time_now = rtc.now();
DateTime time_now = rtc.now();
setTime(time_now.hour(), time_now.minute(), time_now.second(), time_now.day(), time_now.month(), time_now.year());
// DateTime time_now = now(); // use internal clock
/*
Serial.print("Raspisanie: ");
Serial.println(digitalRead(SWITCH_PIN) ? 1 : 2 );
Serial.print("Current Date & Time: ");
Serial.print(time_now.year(), DEC);
Serial.print('/');
Serial.print(time_now.month(), DEC);
Serial.print('/');
Serial.print(time_now.day(), DEC);
Serial.print(" (");
Serial.print(daysOfTheWeek[time_now.dayOfTheWeek()]);
Serial.print(") ");
Serial.print(time_now.hour(), DEC);
Serial.print(':');
Serial.print(time_now.minute(), DEC);
Serial.print(':');
Serial.print(time_now.second(), DEC);
Serial.println();
*/
digitalWrite(LED_BUILTIN, status_led);
status_led = !status_led;
if (time_now.dayOfTheWeek() != SUNDAY) { // Если сегодня не воскресенье.
if (digitalRead(SWITCH_PIN)){
zvonok(time_now);
digitalWrite(4, HIGH);
digitalWrite(5, LOW);
} else {
zvonok2(time_now);
digitalWrite(5, HIGH);
digitalWrite(4, LOW);
}
}
delay(1000);
}