enum {
IDLE,
ALLON,
ALLOFF,
ZEROONE,
ZEROTWOFOUR,
ONETHREE,
PROGRAMMED,
TOGGLE1,
TOGGLE2
} BlinkType;
int BlinkState = IDLE;
struct LEDType {
unsigned long LastMillis = 0;
unsigned long interval = 500;
boolean isOn = false;
boolean letBlink = true;
int Pin;
};
const int NoOfLEDs = 5;
LEDType LED[NoOfLEDs];
void SetLED(int No, int State) {
LED[No].isOn = State;
digitalWrite(LED[No].Pin, LED[No].isOn);
}
void BlinkLedNo(int No) {
if (LED[No].letBlink) {
if (millis() - LED[No].LastMillis > LED[No].interval) {
LED[No].LastMillis = millis();
LED[No].isOn = !LED[No].isOn;
SetLED(No, LED[No].isOn);
}
} else {
if (LED[No].isOn) SetLED(No, LOW);
}
}
void BlinkLEDs() {
for (int i = 0; i < NoOfLEDs; i++) {
BlinkLedNo(i);
}
}
void AllLEDs(int Value) {
for (int i = 0; i < NoOfLEDs; i++) {
SetLED(i, Value);
}
}
void StateMachine() {
switch (BlinkState) {
case IDLE :
break;
case ALLOFF :
AllLEDs(LOW);
BlinkState = IDLE;
break;
case ALLON :
AllLEDs(HIGH);
BlinkState = IDLE;
break;
case ZEROONE :
AllLEDs(LOW);
SetLED(0, HIGH);
SetLED(1, HIGH);
BlinkState = IDLE;
break;
case ZEROTWOFOUR :
AllLEDs(LOW);
SetLED(0, HIGH);
SetLED(2, HIGH);
SetLED(4, HIGH);
BlinkState = IDLE;
break;
case ONETHREE :
AllLEDs(LOW);
SetLED(1, HIGH);
SetLED(3, HIGH);
BlinkState = IDLE;
break;
case TOGGLE1 :
break;
case PROGRAMMED :
BlinkLEDs();
break;
default : break;
}
}
void AllowAllToBlink() {
for (int i = 0; i < NoOfLEDs; i++ ) {
LED[i].letBlink = true;
};
}
void DisableToBlink(int No) {
LED[No].letBlink = false;
}
void getSerialCommand() {
if (Serial.available()) {
char c = Serial.read();
switch (c) {
case 'A' :
BlinkState = ALLON;
break;
case 'a' :
BlinkState = ALLOFF;
break;
case 'P' :
AllowAllToBlink();
BlinkState = PROGRAMMED;
break;
case 'I' :
BlinkState = IDLE; // Leaves LED states as they are at time of key pressure
break;
case '0' :
BlinkState = ZEROONE;
break;
case '1' :
BlinkState = ZEROTWOFOUR;
break;
case '2' :
BlinkState = ONETHREE;
break;
case 'T' :
AllowAllToBlink();
DisableToBlink(0);
DisableToBlink(2);
DisableToBlink(4);
BlinkState = PROGRAMMED;
break;
case 't' :
AllowAllToBlink();
DisableToBlink(1);
DisableToBlink(3);
BlinkState = PROGRAMMED;
break;
default : break;
}
c = ' ';
}
}
void setup() {
Serial.begin(115200);
// Just a quick initialization
for (int i = 0; i < NoOfLEDs; i++ ) {
LED[i].interval = 300 * (i + 1);
LED[i].Pin = 9 + i; // Do this only in this case as 9 + 4 = 13 !!!
pinMode(LED[i].Pin, OUTPUT);
}
AllLEDs(HIGH);
delay(500);
AllLEDs(LOW);
Serial.println("Use keys A,a, P, I, 0, 1 ,2 , T, t on Serial to switch LED control");
}
void loop() {
getSerialCommand();
StateMachine();
}