// Init Pins
const uint8_t buttonPins[] = { 12, 11, 10, 9, 7, 6, 5, 4 };
const uint8_t ledPins[] = { 8, 2, 3 };
const int numButton = sizeof(buttonPins) / sizeof(buttonPins[0]);
const int numLed = sizeof(ledPins) / sizeof(ledPins[0]);
int buttonRead[] = {LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW};
// Init Mode Button
int mode = 0; // Mode 0 & 1
int modeButtonLastState = HIGH;
int modeButtonCurrentState;
// Init Animation Button
int animButtonLastState[] = {HIGH, HIGH, HIGH, HIGH};
int animButtonCurrentState[] = {HIGH, HIGH, HIGH, HIGH};
int animMode[] = {0,0,0,0}; // 0 = Off, 1 = On
int animButtonCounter = 0;
int animButtonLastPressed;
uint32_t animCurrentMillis;
boolean animLedFlag[] = {false, false, false};
class Flasher
{
// Class Member Variables
// These are initialized at startup
int ledPin; // the number of the LED pin
int ledPinIndex;
// These maintain the current state
int ledState; // ledState used to set the LED
unsigned long previousMillis; // will store last time LED was updated
// Constructor - creates a Flasher
// and initializes the member variables and state
public:
Flasher(int pin) {
ledPin = pin;
pinMode(ledPin, OUTPUT);
ledState = LOW;
previousMillis = 0;
}
void Update(long OnTime, long OffTime) {
// check to see if it's time to change the state of the LED
unsigned long currentMillis = millis();
// Get Index for LED Pin
for(uint8_t i = 0; i < numLed; i++) {
if(ledPin == ledPins[i]) {ledPinIndex=i;}
}
if((ledState == HIGH) && (currentMillis - previousMillis >= OnTime)) {
// Global Variable
animLedFlag[ledPinIndex] = false; // Set corresponding led is in animation Off
ledState = LOW; // Turn it off
previousMillis = currentMillis; // Remember the time
digitalWrite(ledPin, ledState); // Update the actual LED
} else if ((ledState == LOW) && (currentMillis - previousMillis >= OffTime)) {
// Global Variable
animLedFlag[ledPinIndex] = true; // Set corresponding led is in animation On
ledState = HIGH; // turn it on
previousMillis = currentMillis; // Remember the time
digitalWrite(ledPin, ledState); // Update the actual LED
}
}
};
// Flasher Animation
Flasher f1(ledPins[0]);
Flasher f2(ledPins[1]);
Flasher f3(ledPins[2]);
void setup() {
Serial.begin(9600);
for (uint8_t i = 0; i < numButton; i++) {
pinMode(buttonPins[i], INPUT_PULLUP);
}
for (uint8_t i = 0; i < numLed; i++) {
pinMode(ledPins[i], OUTPUT);
}
}
void loop() {
for (uint8_t i = 0; i < numButton; i++) {
buttonRead[i] = digitalRead(buttonPins[i]);
}
modeButtonFunction(3);
int manualButton[] = {buttonRead[5],buttonRead[6],buttonRead[7]};
manualButtonFunction(manualButton);
int animButton[] = {buttonRead[0],buttonRead[1],buttonRead[2],buttonRead[4]};
animButtonFunction(animButton);
// led1.Update();
}
void modeButtonFunction(int button) {
modeButtonCurrentState = buttonRead[button];
if(modeButtonLastState == LOW && modeButtonCurrentState == HIGH) {
mode = !mode;
Serial.println(mode);
}
modeButtonLastState = modeButtonCurrentState;
}
void manualButtonFunction(int button[]) {
for(uint8_t i = 0; i < 3; i++) {
if(button[i] == LOW){
digitalWrite(ledPins[i], HIGH);
} else {
if(animLedFlag[i] == false){
digitalWrite(ledPins[i], LOW);
}
}
}
}
void animButtonFunction(int button[]) {
for(uint8_t i = 0; i < 4; i++) {
animButtonCurrentState[i] = button[i];
if(animButtonLastState[i] == LOW && animButtonCurrentState[i] == HIGH) {
animMode[i] = !animMode[i];
if(millis() - animCurrentMillis < 100) {
animButtonCounter += 1;
} else {
animButtonCounter = 0;
}
if(animButtonCounter > 1) {
animButtonCounter = 0;
}
// Turn off other buttons
if(animButtonCounter == 0) {
for(uint8_t y = 0; y < 4; y++) {
if(y == i) {continue;}
animMode[y] = 0;
}
}
Serial.println(mode);
Serial.println("-------------");
Serial.println(animMode[0]);
Serial.println(animMode[1]);
Serial.println(animMode[2]);
Serial.println(animMode[3]);
Serial.println("-------------");
animCurrentMillis = millis();
turnOffAllLeds();
}
animButtonLastState[i] = animButtonCurrentState[i];
}
// Animation Mode
int animModeArray[] = {animMode[0], animMode[1], animMode[2], animMode[3]};
int a1[] = {1,0,0,0};
int a2[] = {0,1,0,0};
int a3[] = {0,0,1,0};
int a4[] = {0,0,0,1};
int a5[] = {1,1,0,0};
int a6[] = {1,0,1,0};
int a7[] = {1,0,0,1};
int a8[] = {0,1,1,0};
int a9[] = {0,1,0,1};
int a10[] = {0,0,1,1};
int animation[] = {a1,a2,a3,a4,a5,a6,a7,a8,a9,a10};
for(uint8_t i = 0; i < 11; i++) {
if(compareArray(animModeArray, animation[i])) {
startAnim(i);
}
}
}
boolean compareArray(int a[], int b[]) {
boolean res = true;
for (int i = 0; i < 4; i++) {
if( a[i] != b[i] ) {
// Serial.println("not equal");
//set your boolean flag here
res = false;
break;
}
}
return res;
}
// ANIMASI
void startAnim(int anim) {
if(mode == 0) {
if(anim == 0) {anim1();}
if(anim == 1) {anim2();}
if(anim == 2) {anim3();}
if(anim == 3) {anim4();}
if(anim == 4) {anim5();}
if(anim == 5) {anim6();}
if(anim == 6) {anim7();}
if(anim == 7) {anim8();}
if(anim == 8) {anim9();}
if(anim == 9) {anim10();}
} else {
if(anim == 0) {anim11();}
if(anim == 1) {anim12();}
if(anim == 2) {anim13();}
if(anim == 3) {anim14();}
if(anim == 4) {anim15();}
if(anim == 5) {anim16();}
if(anim == 6) {anim17();}
if(anim == 7) {anim18();}
if(anim == 8) {anim19();}
if(anim == 9) {anim20();}
}
}
void turnOffAllLeds() {
for(uint8_t i = 0; i < numLed; i++) {
digitalWrite(ledPins[i], LOW);
}
}
// Ubah animasi disini
// Mode 1 = 1 - 10
void anim1() {
f1.Update(500, 500);
}
void anim2() {
f2.Update(500, 500);
}
void anim3() {
f3.Update(500, 500);
}
void anim4() {
f1.Update(500, 500);
f2.Update(500, 500);
}
void anim5() {
f1.Update(500, 500);
f3.Update(500, 500);
}
void anim6() {
f2.Update(500, 500);
f3.Update(500, 500);
}
void anim7() {
f1.Update(500, 500);
f2.Update(500, 500);
f3.Update(500, 500);
}
void anim8() {
f1.Update(500, 500);
}
void anim9() {
f2.Update(500, 500);
}
void anim10() {
f3.Update(500, 500);
}
// Mode 2 = 11 - 20
void anim11() {
f1.Update(500, 500);
}
void anim12() {
f2.Update(500, 500);
}
void anim13() {
f3.Update(500, 500);
}
void anim14() {
f1.Update(500, 500);
f2.Update(500, 500);
}
void anim15() {
f1.Update(500, 500);
f3.Update(500, 500);
}
void anim16() {
f2.Update(500, 500);
f3.Update(500, 500);
}
void anim17() {
f1.Update(500, 500);
f2.Update(500, 500);
f3.Update(500, 500);
}
void anim18() {
f1.Update(500, 500);
}
void anim19() {
f2.Update(500, 500);
}
void anim20() {
f3.Update(500, 500);
}