// https://forum.arduino.cc/t/on-off-with-soft-start/1048649
const int button = 8; //button on my shield TL2
const int relay1 = 7; //relay1 this relay on for 3 sec when LED_R + LED_G is light (in shield is YELLOW LED)
const int relay2 = 6; //relay2 this relay is on when the LED_G is light (in shield is BLUE LED)
const int led_R = 5; //this LED light when is START mode or OFF mode
const int led_G = 4; //this LED ligh when is START mode or ON mode
enum { Off = LOW, On = HIGH }; // relay on when HIGH
int buttonState;
# define RelayPeriod 5000 // how long to relay1 is ON
unsigned char state;
# define OFF 0
# define STARTING 1
# define RUNING 2
void setup () {
Serial.begin(115200);
Serial.println("soft start world!\n");
pinMode (button, INPUT_PULLUP);
pinMode (relay1, OUTPUT);
pinMode (relay2, OUTPUT);
pinMode (led_R, OUTPUT);
pinMode (led_G, OUTPUT);
digitalWrite (relay1, Off);
digitalWrite (relay2, Off);
digitalWrite (led_R, On);
digitalWrite (led_G, Off);
buttonState = digitalRead (button);
state = OFF; // the machine is off.
}
void loop () {
unsigned char timesUp;
unsigned char buttonEvent;
unsigned char releaseEvent;
unsigned long now = millis ();
unsigned char buttonIs = digitalRead (button); // LOW = pressed here
// INPUT (and timer(s))
buttonEvent = 0; // innocent until proven guilty
releaseEvent = 0; // auch
timesUp = 0; // auch - und es verwenden oder verlieren
static unsigned long lastButtonTime;
if (now - lastButtonTime > 20) {
if (buttonState != buttonIs) {
buttonState = buttonIs;
if (buttonIs == LOW) buttonEvent = 1;
if (buttonIs == HIGH) releaseEvent = 1;
lastButtonTime = now;
}
}
static unsigned long startStartTime;
if (now - startStartTime > RelayPeriod) timesUp = 1;
// PROCESS
switch (state) {
case OFF :
if (buttonEvent) {
startStartTime = now;
state = STARTING;
}
break;
case STARTING :
if (timesUp) state = RUNING;
if (buttonEvent)
state = OFF;
break;
case RUNING :
if (buttonEvent)
state = OFF;
break;
}
// OUTPUT
switch (state) {
case OFF :
digitalWrite (relay1, Off);
digitalWrite (relay2, Off);
digitalWrite (led_G, Off);
digitalWrite (led_R, On);
digitalWrite (led_G, Off); // or... make it wink:
// digitalWrite(led_G, (millis() & 0x3ff) > 960 ? On : Off);
break;
case STARTING :
digitalWrite (relay1, On);
digitalWrite (relay2, Off);
digitalWrite (led_R, On); // or... make it blink:
// digitalWrite (led_R, millis() & 0x100 ? On : Off);
digitalWrite (led_G, On);
break;
case RUNING :
digitalWrite (relay1, Off);
digitalWrite (relay2, On);
// digitalWrite (led_R, On);
digitalWrite (led_R, Off);
digitalWrite (led_G, On);
break;
}
}
/*
if (releaseEvent) state = RUNING;
*/
/*
if (timesUp) {
digitalWrite (led_G, Off);
state = OFF;
}
if (buttonEvent) {
startStartTime = now;
state = RUNING;
}
if (state == RUNING) digitalWrite(led_G, millis() & 0x100 ? On : Off);
*/
/*
switch (state) {
case OFF :
break;
case STARTING :
break;
case RUNNING :
break;
}
switch (state) {
case OFF :
break;
case STARTING :
break;
case RUNING :
break;
}
}
void testLoop1() {
static unsigned long startStartTime;
if (now - startStartTime > RelayPeriod) timesUp = 1;
if (timesUp) {
digitalWrite (led_G, Off);
state = OFF;
}
if (buttonEvent) {
startStartTime = now;
state = RUNING;
}
if (state == RUNING) digitalWrite(led_G, millis() & 0x100 ? On : Off);
}
void testLoop0() {
if (timesUp) digitalWrite (led_G, Off);
if (buttonEvent) {
startStartTime = now;
digitalWrite (led_G, On);
}
}
*/
/*
// check for button press
byte but = digitalRead (button);
if (buttonState != but) {
buttonState = but;
delay (25); // debounce
if (LOW == but) {
if (On == digitalRead (relay1)) {
digitalWrite (relay1, Off);
digitalWrite (relay2, Off);
relayState = 0;
digitalWrite (led_G, Off);
digitalWrite (led_R, On);
}
else {
digitalWrite (relay1, On);
digitalWrite (relay2, Off);
digitalWrite (led_R, On);
digitalWrite (led_G, On);
relayState = 1;
msecRelay = msec;
}
}
}
if (relayState && (msec - msecRelay) >= RelayPeriod) {
// turn off
digitalWrite (relay1, Off);
digitalWrite (relay2, On);
digitalWrite (led_G, On);
digitalWrite (led_R, Off);
relayState = 0;
}
}
*/