/*
https://forum.arduino.cc/t/arduino-relais-schaltung/1240112/13
https://wokwi.com/projects/393447859184037889
Relay active HIGH
2024-03-26 by noiasca (based on the schematic of Kai-R)
to be deleted 2024-07
*/
#include <OneButton.h>
// Global constants and variables
constexpr uint8_t relayPin {5}; // output pin
constexpr uint8_t signalPin {6}; // indicator for Interval/Wait
constexpr uint32_t intervalOn {1000}; // interval ON (the pulse)
constexpr uint32_t intervalWait {5000}; // interval / OFF phase
OneButton button(4, true, true); // a button
uint32_t previousMillis = 0; // time management
enum class Status : uint8_t { IDLE, SINGLE, INTERVAL, WAIT} status;
// action for short button press
void click() {
Serial.println("click");
if (status == Status::IDLE) {
previousMillis = millis();
digitalWrite(relayPin, HIGH);
status = Status::SINGLE;
}
else {
digitalWrite(relayPin, LOW);
digitalWrite(signalPin, LOW);
status = Status::IDLE;
}
}
// action for long button press
void longPressStart() {
Serial.println("long");
if (status == Status::IDLE) {
previousMillis = millis();
digitalWrite(relayPin, HIGH);
digitalWrite(signalPin, HIGH);
status = Status::INTERVAL;
}
}
void fsmRun() {
switch (status) {
case Status::SINGLE :
if (millis() - previousMillis > intervalOn) {
digitalWrite(relayPin, LOW);
status = Status::IDLE;
}
break;
case Status::INTERVAL :
if (millis() - previousMillis > intervalOn) {
previousMillis = millis();
digitalWrite(relayPin, LOW);
status = Status::WAIT;
}
break;
case Status::WAIT :
if (millis() - previousMillis > intervalWait) {
previousMillis = millis();
digitalWrite(relayPin, HIGH);
status = Status::INTERVAL;
}
break;
}
}
void setup() {
Serial.begin(115200);
pinMode(relayPin, OUTPUT);
pinMode(signalPin, OUTPUT);
button.attachClick(click); // register callback for single click
button.attachLongPressStart(longPressStart); // register callback for long press
button.setPressMs(2000); // set # millisec after press is assumed.
}
void loop() {
fsmRun();
button.tick();
}
//Kurzer Tastendruck: Relais für 1 Sekunde an.
Langer Tastendruck (3 Sek.): Intervall 1 Sek. an 5 Sek. aus
Kurzer Tastendruck im Intervall-Modus, schaltet diesen aus.