86 lines
2.4 KiB
C++
86 lines
2.4 KiB
C++
#include "Relays.h"
|
|
|
|
static unsigned long last_relay_off_ts=0, last_relay_hold_ts=0;
|
|
enum RelayState { RELAY_STATE_OFF=0, RELAY_STATE_ON_EVEN_MINUTE, RELAY_STATE_ON_ODD_MINUTE };
|
|
static RelayState relaysState = RELAY_STATE_OFF;
|
|
static RelayState lastRelayOnState = RELAY_STATE_ON_EVEN_MINUTE;
|
|
static bool relayCanSwitch=true;
|
|
|
|
void Relays::begin(int _relay1Pin, int _relay2Pin) {
|
|
relay1Pin = _relay1Pin;
|
|
relay2Pin = _relay2Pin;
|
|
pinMode(relay1Pin, OUTPUT);
|
|
pinMode(relay2Pin, OUTPUT);
|
|
digitalWrite(relay1Pin, LOW);
|
|
digitalWrite(relay2Pin, LOW);
|
|
}
|
|
|
|
void Relays::toggle() {
|
|
if (relayCanSwitch) {
|
|
if (lastRelayOnState == RELAY_STATE_ON_EVEN_MINUTE) {
|
|
digitalWrite(relay1Pin, HIGH);
|
|
digitalWrite(relay2Pin, LOW);
|
|
relaysState = RELAY_STATE_ON_ODD_MINUTE;
|
|
// P.print("R-OEv");
|
|
} else {
|
|
digitalWrite(relay1Pin, LOW);
|
|
digitalWrite(relay2Pin, HIGH);
|
|
relaysState = RELAY_STATE_ON_EVEN_MINUTE;
|
|
// P.print("R-OOd");
|
|
}
|
|
lastRelayOnState = relaysState;
|
|
} // else P.print("R-OErr");
|
|
relayCanSwitch = false;
|
|
last_relay_hold_ts = millis();
|
|
// increment displayed time
|
|
displayedTime_minutes++;
|
|
if (displayedTime_minutes >= 60) {
|
|
displayedTime_hours++;
|
|
displayedTime_minutes -= 60;
|
|
if (displayedTime_hours >= 24) {
|
|
displayedTime_hours = 0;
|
|
}
|
|
}
|
|
if (fastforwardMode) {
|
|
if (displayedTime_hours == targetHours && displayedTime_minutes == targetMinutes) {
|
|
// wanted time reached!
|
|
fastforwardMode = false;
|
|
}
|
|
}
|
|
Serial.println(F("Toggle Relays"));
|
|
}
|
|
|
|
void Relays::off(void) {
|
|
digitalWrite(relay1Pin, LOW);
|
|
digitalWrite(relay2Pin, LOW);
|
|
last_relay_off_ts = millis();
|
|
relaysState = RELAY_STATE_OFF;
|
|
// P.print("R-Off");
|
|
}
|
|
|
|
void Relays::loop(void) {
|
|
if (relaysState == RELAY_STATE_OFF) {
|
|
if (millis() - last_relay_off_ts > minOffTime_ms) {
|
|
relayCanSwitch = true;
|
|
if (fastforwardMode) toggle();
|
|
}
|
|
} else {
|
|
if (millis() - last_relay_hold_ts > holdTime_ms) {
|
|
off();
|
|
}
|
|
}
|
|
}
|
|
|
|
void Relays::fwdToTime(unsigned int hours, unsigned int minutes) {
|
|
// @TODO
|
|
// as we have a 12h clock, we adjust displayedTime to be before the wanted time
|
|
if (hours < displayedTime_hours ||
|
|
(hours == displayedTime_hours && minutes < displayedTime_minutes)) {
|
|
displayedTime_hours -= 12;
|
|
if (displayedTime_hours < 0) displayedTime_hours += 24;
|
|
}
|
|
targetHours = hours;
|
|
targetMinutes = minutes;
|
|
fastforwardMode = true;
|
|
}
|