Wemos8266RelaysLedDisplay/src/Relays.cpp

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;
}