// MACRO-START * MACRO-START * MACRO-START * MACRO-START * MACRO-START * MACRO-START *
// a detailed explanation how these macros work is given in this tutorial
// https://forum.arduino.cc/t/comfortable-serial-debug-output-short-to-write-fixed-text-name-and-content-of-any-variable-code-example/888298
#define dbg(myFixedText, variableName) \
Serial.print( F(#myFixedText " " #variableName"=") ); \
Serial.println(variableName);
#define dbgi(myFixedText, variableName,timeInterval) \
{ \
static unsigned long intervalStartTime; \
if ( millis() - intervalStartTime >= timeInterval ){ \
intervalStartTime = millis(); \
Serial.print( F(#myFixedText " " #variableName"=") ); \
Serial.println(variableName); \
} \
}
#define dbgc(myFixedText, variableName) \
{ \
static long lastState; \
if ( lastState != variableName ){ \
Serial.print( F(#myFixedText " " #variableName" changed from ") ); \
Serial.print(lastState); \
Serial.print( F(" to ") ); \
Serial.println(variableName); \
lastState = variableName; \
} \
}
#define dbgcf(myFixedText, variableName) \
{ \
static float lastState; \
if ( lastState != variableName ){ \
Serial.print( F(#myFixedText " " #variableName" changed from ") ); \
Serial.print(lastState); \
Serial.print( F(" to ") ); \
Serial.println(variableName); \
lastState = variableName; \
} \
}
// MACRO-END * MACRO-END * MACRO-END * MACRO-END * MACRO-END * MACRO-END * MACRO-END *
#define pressed LOW
#define released HIGH
int LED1 = 13;
int LED2 = 12;
int LED3 = 11;
int LED4 = 10;
int LED5 = 9;
int LED6 = 8;
int LED7 = 7;
int LED8 = 6;
int S1 = 5;
int S2 = 4;
int S3 = 3;
int S4 = 2;
const byte LEDs[9] = {0, 13, 12, 11, 10, 9, 8, 7, 6};
const byte Switch[5] = {0, 5, 4, 3, 2};
boolean allSwitchesOff = true;
int val = HIGH;
byte switchState = 0;
int oneSec = 1000;
void setup() {
Serial.begin(115200);
Serial.println("Setup-Start");
for (byte Idx = 1; Idx <= 8; Idx++) {
pinMode(LEDs[Idx], OUTPUT);
}
for (byte Idx = 1; Idx <= 4; Idx++) {
pinMode(Switch[Idx], INPUT_PULLUP);
}
}
void allLEDsOff() {
for (byte Idx = 1; Idx <= 8; Idx++) {
digitalWrite(LEDs[Idx], LOW);
}
}
// returns zero if all switches are switched OFF
// otherwise returns 1,2,3,4
byte readSwitches() {
byte result = 0;
for (byte Idx = 1; Idx <= 4; Idx++) {
if (digitalRead(Switch[Idx]) == pressed) {
result += Idx;
}
}
return result;
}
void waitWithSwitchChecking(unsigned long waitTime) {
unsigned long millisecCounter = 0;
switchState = readSwitches();
if (switchState == 0) {
return;
}
// switchState != 0 means a switch is ON
while ( (switchState != 0) && (millisecCounter < waitTime) ) {
switchState = readSwitches();
millisecCounter++;
delay(1);
}
}
void loop() {
switchState = readSwitches();
dbgi("ToL",switchState,500);
if (digitalRead(S1) == pressed) {
digitalWrite(LED1, HIGH);//First row
waitWithSwitchChecking(oneSec);
digitalWrite(LED2, HIGH);//Secondo row
waitWithSwitchChecking(oneSec);
digitalWrite(LED1, LOW);
digitalWrite(LED3, HIGH);//Third row
waitWithSwitchChecking(oneSec);
digitalWrite(LED2, LOW);
digitalWrite(LED4, HIGH);//Fourth row
waitWithSwitchChecking(oneSec);
digitalWrite(LED3, LOW);//FIFTH
digitalWrite(LED5, HIGH);//FIFTH
waitWithSwitchChecking(oneSec);
digitalWrite(LED4, LOW);//SIXTH
digitalWrite(LED6, HIGH);//SIXTH
waitWithSwitchChecking(oneSec);
digitalWrite(LED5, LOW);//SEVENTH
digitalWrite(LED7, HIGH);//SEVENTH
waitWithSwitchChecking(oneSec);
digitalWrite(LED6, LOW);//EIGHTH
digitalWrite(LED8, HIGH);//EIGHTH
waitWithSwitchChecking(oneSec);
digitalWrite(LED7, LOW);//NINETH
waitWithSwitchChecking(oneSec);
digitalWrite(LED8, LOW);
}
if (digitalRead(S2) == pressed) {
digitalWrite(LED1, HIGH);
waitWithSwitchChecking(oneSec);
digitalWrite(LED1, LOW);
digitalWrite(LED2, HIGH);
waitWithSwitchChecking(oneSec);
digitalWrite(LED2, LOW);
digitalWrite(LED1, HIGH);
digitalWrite(LED3, HIGH);
digitalWrite(LED1, HIGH);
digitalWrite(LED3, HIGH);
waitWithSwitchChecking(oneSec);
digitalWrite(LED1, LOW);
digitalWrite(LED3, LOW);
digitalWrite(LED2, HIGH);
digitalWrite(LED4, HIGH);
digitalWrite(LED2, HIGH);
digitalWrite(LED4, HIGH);
waitWithSwitchChecking(oneSec);
digitalWrite(LED2, LOW);
digitalWrite(LED4, LOW);
digitalWrite(LED3, HIGH);
digitalWrite(LED5, HIGH);
digitalWrite(LED3, HIGH);
digitalWrite(LED5, HIGH);
waitWithSwitchChecking(oneSec);
digitalWrite(LED3, LOW);
digitalWrite(LED5, LOW);
digitalWrite(LED4, HIGH);
digitalWrite(LED6, HIGH);
digitalWrite(LED4, HIGH);
digitalWrite(LED6, HIGH);
waitWithSwitchChecking(oneSec);
digitalWrite(LED4, LOW);
digitalWrite(LED6, LOW);
digitalWrite(LED5, HIGH);
digitalWrite(LED7, HIGH);
digitalWrite(LED5, HIGH);
digitalWrite(LED7, HIGH);
waitWithSwitchChecking(oneSec);
digitalWrite(LED5, LOW);
digitalWrite(LED7, LOW);
digitalWrite(LED6, HIGH);
digitalWrite(LED8, HIGH);
digitalWrite(LED6, HIGH);
digitalWrite(LED8, HIGH);
waitWithSwitchChecking(oneSec);
digitalWrite(LED6, LOW);
digitalWrite(LED8, LOW);
digitalWrite(LED7, HIGH);
waitWithSwitchChecking(oneSec);
digitalWrite(LED7, LOW);
digitalWrite(LED8, HIGH);
waitWithSwitchChecking(oneSec);
digitalWrite(LED8, LOW);
}
if (digitalRead(S3) == pressed) {
digitalWrite(LED1, HIGH);
waitWithSwitchChecking(oneSec);
digitalWrite(LED1, LOW);//1st row
digitalWrite(LED2, HIGH);
waitWithSwitchChecking(oneSec);
digitalWrite(LED2, LOW);//2nd row
digitalWrite(LED3, HIGH);
waitWithSwitchChecking(oneSec);
digitalWrite(LED3, LOW);//3rd row
digitalWrite(LED4, HIGH);
waitWithSwitchChecking(oneSec);
digitalWrite(LED4, LOW);//4th row
digitalWrite(LED5, HIGH);
waitWithSwitchChecking(oneSec);
digitalWrite(LED5, LOW);//5th row
digitalWrite(LED6, HIGH);
waitWithSwitchChecking(oneSec);
digitalWrite(LED6, LOW);//6th row
digitalWrite(LED7, HIGH);
waitWithSwitchChecking(oneSec);
digitalWrite(LED7, LOW);//7th row
digitalWrite(LED8, HIGH);
waitWithSwitchChecking(oneSec);
digitalWrite(LED8, LOW);//8th row
digitalWrite(LED7, HIGH);
waitWithSwitchChecking(oneSec);
digitalWrite(LED7, LOW);//9th row
digitalWrite(LED6, HIGH);
waitWithSwitchChecking(oneSec);
digitalWrite(LED6, LOW);//10th row
digitalWrite(LED5, HIGH);
waitWithSwitchChecking(oneSec);
digitalWrite(LED5, LOW);//11th row
digitalWrite(LED4, HIGH);
waitWithSwitchChecking(oneSec);
digitalWrite(LED4, LOW);//12th row
digitalWrite(LED3, HIGH);
waitWithSwitchChecking(oneSec);
digitalWrite(LED3, LOW);//13th row
digitalWrite(LED2, HIGH);
waitWithSwitchChecking(oneSec);
digitalWrite(LED2, LOW);//14th row
digitalWrite(LED1, HIGH);//15th row
waitWithSwitchChecking(oneSec);
}
if (digitalRead(S4) == pressed) {
digitalWrite(LED1, HIGH);
waitWithSwitchChecking(oneSec);
digitalWrite(LED2, HIGH);
waitWithSwitchChecking(oneSec);
digitalWrite(LED3, HIGH);
waitWithSwitchChecking(oneSec);
digitalWrite(LED4, HIGH);
waitWithSwitchChecking(oneSec);
digitalWrite(LED5, HIGH);
waitWithSwitchChecking(oneSec);
digitalWrite(LED6, HIGH);
waitWithSwitchChecking(oneSec);
digitalWrite(LED7, HIGH);
waitWithSwitchChecking(oneSec);
digitalWrite(LED8, HIGH);
waitWithSwitchChecking(oneSec);
digitalWrite(LED8, LOW);
waitWithSwitchChecking(oneSec);
digitalWrite(LED7, LOW);
waitWithSwitchChecking(oneSec);
digitalWrite(LED6, LOW);
waitWithSwitchChecking(oneSec);
digitalWrite(LED5, LOW);
waitWithSwitchChecking(oneSec);
digitalWrite(LED4, LOW);
waitWithSwitchChecking(oneSec);
digitalWrite(LED3, LOW);
waitWithSwitchChecking(oneSec);
digitalWrite(LED2, LOW);
waitWithSwitchChecking(oneSec);
}
switchState = readSwitches();
dbgi("BoL",switchState,500);
if (switchState == 0) {
allLEDsOff();
}
}