This is what I tried:
#include <OneButton.h>
#define BTN_PIN 5
const byte redPin = 2;
const byte greenPin = 3;
const byte bluePin = 4;
uint8_t patternCounter = 0;
bool isRunning = false;
void checkTimer();
// Push button connected between pin 7 and GND (no resistor required)
OneButton btn = OneButton(BTN_PIN, true, true);
#include "ElectricZero.h"
#include "RainbowOne.h"
void setup() {
pinMode(redPin, OUTPUT); //Red Relay
pinMode(greenPin, OUTPUT); //Green Relay
pinMode(bluePin, OUTPUT); //Blue Relay
btn.attachClick(nextPattern);
}
void loop() {
switch (patternCounter) {
case 0:
runElectricZero();
break;
case 1:
runRainbowOne();
break;
}
}
void nextPattern() {
isRunning = false;
patternCounter = (patternCounter + 1) % 2;
}
void runElectricZero(){
isRunning = true;
ElectricZero electricZero = ElectricZero();
while(isRunning) electricZero.runPattern();
}
void runRainbowOne(){
isRunning = true;
RainbowOne rainbowOne = RainbowOne();
while(isRunning) rainbowOne.runPattern();
}
ElectricZero.h
#include "Arduino.h"
const uint16_t interval[] {100, 1500, 100, 250, 100, 1000, 500, 1000}; // time to wait in each intervall
int prevRed,prevGreen, prevBlue;
class ElectricZero {
public:
ElectricZero(){
// Blank constructor
};
void runPattern();
private:
};
void colorRGB(int red, int green, int blue) {
red = constrain(red, 0, 255);
green = constrain(green, 0, 255);
blue = constrain(blue, 0, 255);
for (int i = 0; i < 50; i++) {
analogWrite(redPin, map(i, 0, 999, prevRed, red));
analogWrite(greenPin, map(i, 0, 999, prevGreen, green));
analogWrite(bluePin, map(i, 0, 999, prevBlue, blue));
delay(1);
}
prevRed = red;
prevGreen = green;
prevBlue = blue;
}
void ElectricZero()
{
static uint32_t previousMillis = 0;
static byte state = 7;
if (millis() - previousMillis >= interval[state])
{
// it's time for next state
state++;
state = state % 8;
Serial.print(F("state=")); Serial.println(state);
// act according state
switch (state)
{
case 0: // 1 1000
colorRGB(0, 0, 255); //blue
break;
case 1: // 2 2000
colorRGB(0, 255, 255); //cyan
break;
case 2: // 3 3000
colorRGB(0, 0, 255); //blue
break;
case 3: // 4 4000
colorRGB(255, 100, 0); //yellow
break;
case 4: // 5 5000
colorRGB(0, 0, 255); //blue
break;
case 5: // 6 6000
colorRGB(255, 100, 0); //yellow
break;
case 6: // 7 7000
colorRGB(0, 0, 255); //blue
break;
case 7: // 8 8000
colorRGB(0, 255, 255); //cyan
break;
}
previousMillis = millis();
}
}
RainbowOne.H (Trying just one page first)
#include "Arduino.h"
class RainbowOne {
public:
RainbowOne(){};
void runPattern();
private:
};
void RainbowOne::runPattern() {
digitalWrite(redPin, LOW); //Red Relay (OFF)
digitalWrite(greenPin, LOW); //Green Relay (ON)
digitalWrite(bluePin, HIGH); //Blue Relay (ON)
btn.tick();
}


