#include <Wire.h>
#include <RTClib.h>
RTC_DS3231 rtc;
const int pwmPin = 9; // PWM output pin
const int switchPin = 8; // External switch connected to digital pin 8
// Time constants for Mode 1
const int morningHour1 = 16;
const int morningMinute1 = 38;
const int eveningHour1 = 16;
const int eveningMinute1 = 39;
// Time constants for Mode 0
const int morningHour2 = 16; // Different start times for Mode 2
const int morningMinute2 = 41;
const int eveningHour2 = 16;
const int eveningMinute2 = 42;
const long duration = 0.5L * 60L; // 15 minutes in seconds, as long
void setup() {
Serial.begin(9600);
if (!rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1);
}
pinMode(pwmPin, OUTPUT);
pinMode(switchPin, INPUT_PULLUP); // Assuming a pull-up resistor is used
}
void loop() {
DateTime now = rtc.now();
static int lastPWMValue = 255; // Stores the last PWM value
bool mode = digitalRead(switchPin); // Read switch state
// Select mode based on switch state
int morningHour = mode ? morningHour1 : morningHour2;
int morningMinute = mode ? morningMinute1 : morningMinute2;
int eveningHour = mode ? eveningHour1 : eveningHour2;
int eveningMinute = mode ? eveningMinute1 : eveningMinute2;
if (isTransitionPeriod(now, morningHour, morningMinute)) {
lastPWMValue = interpolatePWM(now, morningHour, morningMinute, 255, 0);
} else if (isTransitionPeriod(now, eveningHour, eveningMinute)) {
lastPWMValue = interpolatePWM(now, eveningHour, eveningMinute, 0, 255);
}
Serial.print(mode, DEC);
Serial.print('/');
Serial.print(lastPWMValue, DEC);
Serial.print('/');
Serial.print(now.hour(), DEC);
Serial.print('/');
Serial.print(now.minute(), DEC);
Serial.println();
analogWrite(pwmPin, lastPWMValue);
delay(1000);
}
bool isTransitionPeriod(DateTime now, int hour, int minute) {
long nowSeconds = (long)now.hour() * 3600L + (long)now.minute() * 60L + now.second();
long startSeconds = (long)hour * 3600L + (long)minute * 60L;
return nowSeconds >= startSeconds && nowSeconds <= startSeconds + duration;
}
int interpolatePWM(DateTime now, int hour, int minute, int startPWM, int endPWM) {
long nowSeconds = (long)now.hour() * 3600L + (long)now.minute() * 60L + now.second();
long startSeconds = (long)hour * 3600L + (long)minute * 60L;
return map(nowSeconds, startSeconds, startSeconds + duration, startPWM, endPWM);
}