#include <Wire.h>
#include <RTClib.h>
#define RED_PIN 9
#define GREEN_PIN 10
#define BLUE_PIN 11
RTC_DS3231 rtc;
int dawnStartHour, dawnStartMinute, dawnStartSecond;
int dawnDurationSeconds;
bool simulateDawn = false;
void setup() {
Serial.begin(9600);
// Налаштування RTC модуля
if (!rtc.begin()) {
Serial.println("Не вдалося знайти RTC");
while (1);
}
if (rtc.lostPower()) {
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
// Налаштування пінів RGB LED
pinMode(RED_PIN, OUTPUT);
pinMode(GREEN_PIN, OUTPUT);
pinMode(BLUE_PIN, OUTPUT);
// Початковий ефект плавного переливання кольорами
for (int i = 0; i < 256; i++) {
setColor(i, 255 - i, i / 2); // Плавний перехід від одного кольору до іншого
delay(20);
}
delay(5000); // Чекаємо 5 секунд
// Введення часу початку світанку і тривалості
getUserInput();
}
void loop() {
DateTime now = rtc.now();
int currentHour = now.hour();
int currentMinute = now.minute();
int currentSecond = now.second();
if (!simulateDawn && currentHour == dawnStartHour && currentMinute == dawnStartMinute && currentSecond == dawnStartSecond) {
simulateDawn = true;
}
if (simulateDawn) {
for (int i = 0; i < dawnDurationSeconds * 100; i++) {
int brightness = map(i, 0, dawnDurationSeconds * 100, 0, 255);
setColor(brightness, brightness, 0); // Плавний перехід до жовтого кольору
delay(10); // Пауза для плавної зміни кольору
}
simulateDawn = false;
// Затримка 6 секунд на остаточному відтінку жовтого кольору
setColor(255, 255, 0);
delay(6000);
// Блимаємо фіолетовим кольором 3 рази
for (int i = 0; i < 3; i++) {
setColor(128, 0, 128); // Фіолетовий колір
delay(500);
setColor(0, 0, 0);
delay(500);
}
// Вимикаємо світлодіод
setColor(0, 0, 0);
// Знову запитуємо введення часу початку і тривалості світанку
getUserInput();
}
delay(1000); // Основний цикл затримки
}
void getUserInput() {
// Введення часу початку світанку
Serial.println("Введіть час початку світанку (година, хвилина, секунда) через пробіл:");
while (!Serial.available()) {
// Чекаємо, поки користувач введе дані
}
String input = Serial.readStringUntil('\n');
sscanf(input.c_str(), "%d %d %d", &dawnStartHour, &dawnStartMinute, &dawnStartSecond);
// Введення тривалості світанку
Serial.println("Введіть тривалість світанку (години, хвилини, секунди) через пробіл:");
while (!Serial.available()) {
// Чекаємо, поки користувач введе дані
}
input = Serial.readStringUntil('\n');
int dawnDurationHours, dawnDurationMinutes, dawnDurationSecondsInput;
sscanf(input.c_str(), "%d %d %d", &dawnDurationHours, &dawnDurationMinutes, &dawnDurationSecondsInput);
dawnDurationSeconds = dawnDurationHours * 3600 + dawnDurationMinutes * 60 + dawnDurationSecondsInput;
Serial.println("Налаштування прийнято. Симуляція світанку почнеться в заданий час.");
// Блимаємо фіолетовим кольором 3 рази
for (int i = 0; i < 3; i++) {
setColor(128, 0, 128); // Фіолетовий колір
delay(500);
setColor(0, 0, 0);
delay(500);
}
}
void setColor(int red, int green, int blue) {
analogWrite(RED_PIN, red);
analogWrite(GREEN_PIN, green);
analogWrite(BLUE_PIN, blue);
}