#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 10
#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[] = {
20 * HOURS + 39,
9 * HOURS + 15,
9 * HOURS + 25,
10 * HOURS + 30,
};
const uint16_t raspisanie2[] = {
1 * HOURS + 30,
2 * HOURS + 15,
3 * HOURS + 25,
21 * HOURS + 54,
};
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 ? HIGH : LOW );
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 ? HIGH : LOW );
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(4, HIGH);
//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 = 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(5, HIGH); не знаю что это
digitalWrite(LED_BUILTIN, status_led);
status_led = !status_led;
if (time_now.dayOfTheWeek() != SUNDAY && time_now.dayOfTheWeek() != SATURDAY) { // Если сегодня будний день (Пн...Пт), то...
if (digitalRead(SWITCH_PIN)){
zvonok(time_now);
} else {
zvonok2(time_now);
}
}
delay(1000);
}