I'm doing my best on learning state machine, this is what I came up with,
don't know where did I make mistakes....
const byte ledPins[] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 45};
byte LEDCOUNT = sizeof(ledPins) / sizeof(ledPins[0]);
byte ledIndex = 0;
const unsigned long FIVESECS = 5000;
unsigned long currentTime;
unsigned long startTime;
enum states
{
ALL_FADE_UP_TOGETHER,
ALL_ON_FOR_5_SECS,
ALL_FADE_DOWN_TOGETHER,
ALL_FADE_UP_DOWN_IN_SEQUENCE,
LED7_IN_OUT,
LED6_8_IN_OUT,
DO_NOTHING
};
byte currentState = ALL_FADE_UP_TOGETHER;
void setup()
{
Serial.begin(115200);
for (int pin = 0; pin < LEDCOUNT; pin ++)
{
pinMode(ledPins[pin], OUTPUT);
digitalWrite(ledPins[pin], HIGH);
}
Serial.println("Fading all up together");
}
void loop()
{
currentTime = millis();
switch (currentState)
{
case ALL_FADE_UP_TOGETHER:
{
static int pwmLevel = 255;
static int pwmIncrement = -1;
unsigned long period = 20;
if (currentTime - startTime >= period)
{
setPwmLevelForAllLeds(pwmLevel);
startTime = millis();
pwmLevel += pwmIncrement;
if (pwmLevel <= 0)
{
setPwmLevelForAllLeds(255);
currentState = ALL_ON_FOR_5_SECS;
startTime = currentTime;
setPwmLevelForAllLeds(0); //all on
Serial.println("Waiting 5 seconds");
}
}
}
break;
//*****
case ALL_ON_FOR_5_SECS:
if (currentTime - startTime >= FIVESECS)
{
currentState = ALL_FADE_DOWN_TOGETHER;
Serial.println("Fading all down together");
startTime = currentTime;
setPwmLevelForAllLeds(0); //all on
}
break;
//*****
case ALL_FADE_DOWN_TOGETHER:
// case ALL_FADE_UP_TOGETHER:
{
static int pwmLevel = 0;
static int pwmIncrement = 1;
unsigned long period = 20;
if (currentTime - startTime >= period)
{
setPwmLevelForAllLeds(pwmLevel);
startTime = millis();
pwmLevel += pwmIncrement;
if (pwmLevel >= 255)
{
setPwmLevelForAllLeds(255); //all off
currentState = ALL_FADE_UP_DOWN_IN_SEQUENCE;
startTime = currentTime;
setPwmLevelForAllLeds(255); //all off
Serial.println("Fading all up down in sequence");
}
}
}
break;
//*****
case LED7_IN_OUT:
{
static unsigned long startTime;
static int pwmLevel = 0;
static int pwmIncrement = 1;
unsigned long period = 5;
if (currentTime - startTime >= FIVESECS)
{
currentState = ALL_FADE_DOWN_TOGETHER;
Serial.println("Fading all down together");
startTime = currentTime;
setPwmLevelForLed7(0);
}
}
break;
//----
case LED6_8_IN_OUT:
{
static unsigned long startTime;
static int pwmLevel = 0;
static int pwmIncrement = 1;
unsigned long period = 5;
if (currentTime - startTime >= FIVESECS)
{
currentState = ALL_FADE_DOWN_TOGETHER;
Serial.println("Fading all down together");
startTime = currentTime;
setPwmLevelForLed6_8(0);
}
}
break;
//*****
case ALL_FADE_UP_DOWN_IN_SEQUENCE:
{
static unsigned long startTime;
static int pwmLevel = 255;
static int pwmIncrement = -1;
unsigned long period = 5;
if (currentTime - startTime >= period)
{
analogWrite(ledPins[ledIndex], pwmLevel);
startTime = millis();
pwmLevel += pwmIncrement;
if (pwmLevel <= 0)
{
pwmIncrement *= -1;
pwmLevel += pwmIncrement;
}
if (pwmLevel >= 255)
{
pwmLevel = 255;
analogWrite(ledPins[ledIndex], pwmLevel); //make sure that the LED is off
pwmIncrement *= -1;
ledIndex++;
if (ledIndex >= LEDCOUNT)
{
currentState = DO_NOTHING;
Serial.println("Doing nothing forever");
}
}
break;
}
}
//*****
case DO_NOTHING:
{
break;
}
}
}
void setPwmLevelForAllLeds(byte pwmLevel)
{
for (int ledIndex = 0; ledIndex < LEDCOUNT; ledIndex++)
{
analogWrite(ledPins[ledIndex], pwmLevel);
}
}
void setPwmLevelForLed7(byte pwmLevel)
{
for (int ledIndex = 0; ledIndex < LEDCOUNT; ledIndex++)
{
analogWrite(ledPins[7], pwmLevel);
}
}
void setPwmLevelForLed6_8(byte pwmLevel)
{
for (int ledIndex = 0; ledIndex < LEDCOUNT; ledIndex++)
{
analogWrite(ledPins[6], pwmLevel);
analogWrite(ledPins[8], pwmLevel);
}
}