#include <EEPROM.h>
#define MODE_EEPROM_ADDR 10
// Init Pins
const uint8_t buttonPins[] = { 12, 11, 10, 9, 7, 6, 5, 4 };
const uint8_t ledPins[] = { 8, 2, 3 };
const uint8_t led4Pin = A0;
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 = LOW;
int modeButtonCurrentState;
// Init Animation Button
int animButtonLastState[] = {LOW, LOW, LOW, LOW};
int animButtonCurrentState[] = {LOW, LOW, LOW, LOW};
int animMode[] = {0,0,0,0}; // 0 = Off, 1 = On
int animButtonCounter = 0;
int animButtonLastPressed;
uint32_t animCurrentMillis;
bool isAnim = false;
unsigned long animPreviousMillis = 0;
uint32_t animBatch = 0;
unsigned long delayMillis = 10000;
void setup() {
Serial.begin(9600);
for (uint8_t i = 0; i < numButton; i++) {
pinMode(buttonPins[i], INPUT);
}
for (uint8_t i = 0; i < numLed; i++) {
pinMode(ledPins[i], OUTPUT);
}
pinMode(led4Pin, OUTPUT);
mode = readIntFromEEPROM(MODE_EEPROM_ADDR);
if(mode == -1) {mode = 0;} // init
Serial.println(mode);
}
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();
led4Function();
}
void led4Function() {
if(isAnim) {
digitalWrite(led4Pin, HIGH);
} else {
digitalWrite(led4Pin, LOW);
}
}
void modeButtonFunction(int button) {
modeButtonCurrentState = buttonRead[button];
if(modeButtonLastState == HIGH && modeButtonCurrentState == LOW) {
animBatch = 0;
mode = !mode;
writeIntIntoEEPROM(MODE_EEPROM_ADDR, mode); // Save Mode to EEPROM
Serial.println(mode);
}
modeButtonLastState = modeButtonCurrentState;
}
void manualButtonFunction(int button[]) {
for(uint8_t i = 0; i < numLed; i++) {
if(button[i] == HIGH){
digitalWrite(ledPins[i], HIGH);
digitalWrite(led4Pin, HIGH);
} else {
digitalWrite(ledPins[i], LOW);
// digitalWrite(led4Pin, LOW);
}
}
}
void animButtonFunction(int button[]) {
for(uint8_t i = 0; i < 4; i++) {
animButtonCurrentState[i] = button[i];
if(animButtonLastState[i] == HIGH && animButtonCurrentState[i] == LOW) {
animPreviousMillis = millis();
animBatch = 0;
animMode[i] = !animMode[i];
if(animButtonCounter > 1) {
animButtonCounter = 0;
}
if(millis() - animCurrentMillis < 100) {
animButtonCounter += 1;
} else {
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 a0[] = {0,0,0,0}; // Animation Off
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};
// If Animation is Off
if(compareArray(animModeArray, a0)) {
isAnim = false;
} else {
isAnim = true;
}
for(uint8_t i = 0; i < 11; i++) {
if(compareArray(animModeArray, animation[i])) {
startAnim(i);
}
}
}
// 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 resetAnim() {
animButtonCounter = 0;
for(uint8_t y = 0; y < 4; y++) {
animMode[y] = 0;
}
}
void turnOffAllLeds() {
for(uint8_t i = 0; i < numLed; i++) {
digitalWrite(ledPins[i], LOW);
}
}
// Ubah animasi disini
// Mode 1 = 1 - 10
void anim1() {
// Seperti delay pada umumnya namun tidak memblock program lain
// Tambah animasi dengan menambah else if animBatch +1
if(animBatch == 0) {
digitalWrite(ledPins[0], HIGH);
delayMillis = 500;
} else if(animBatch == 1) {
digitalWrite(ledPins[0], LOW);
delayMillis = 500;
} else if(animBatch == 2) {
digitalWrite(ledPins[1], HIGH);
delayMillis = 500;
} else if(animBatch == 3) {
digitalWrite(ledPins[1], LOW);
delayMillis = 500;
} else if(animBatch == 4) {
digitalWrite(ledPins[2], HIGH);
delayMillis = 500;
} else if(animBatch == 5) {
digitalWrite(ledPins[2], LOW);
delayMillis = 0; // Delay terakhir 0
}
// Millis function logic. Set parameter to max animBatch
animMillisFunction(5);
}
void anim2() {
if(animBatch == 0) {
digitalWrite(ledPins[1], HIGH);
delayMillis = 500;
} else if(animBatch == 1) {
digitalWrite(ledPins[1], LOW);
delayMillis = 500;
} else if(animBatch == 2) {
digitalWrite(ledPins[2], HIGH);
delayMillis = 500;
} else if(animBatch == 3) {
digitalWrite(ledPins[2], LOW);
delayMillis = 500;
} else if(animBatch == 4) {
digitalWrite(ledPins[1], HIGH);
delayMillis = 500;
} else if(animBatch == 5) {
digitalWrite(ledPins[1], LOW);
delayMillis = 500;
} else if(animBatch == 6) {
digitalWrite(ledPins[2], HIGH);
delayMillis = 500;
} else if(animBatch == 7) {
digitalWrite(ledPins[2], LOW);
delayMillis = 0;
}
animMillisFunction(7);
}
void anim3() {
if(animBatch == 0) {
digitalWrite(ledPins[2], HIGH);
delayMillis = 500;
} else if(animBatch == 1) {
digitalWrite(ledPins[2], LOW);
delayMillis = 500;
} else if(animBatch == 2) {
digitalWrite(ledPins[0], HIGH);
delayMillis = 500;
} else if(animBatch == 3) {
digitalWrite(ledPins[0], LOW);
delayMillis = 0;
}
animMillisFunction(3);
}
void anim4() {
if(animBatch == 0) {
digitalWrite(ledPins[2], HIGH);
delayMillis = 500;
} else if(animBatch == 1) {
digitalWrite(ledPins[2], LOW);
delayMillis = 500;
} else if(animBatch == 2) {
digitalWrite(ledPins[1], HIGH);
delayMillis = 500;
} else if(animBatch == 3) {
digitalWrite(ledPins[1], LOW);
delayMillis = 500;
} else if(animBatch == 4) {
digitalWrite(ledPins[0], HIGH);
delayMillis = 500;
} else if(animBatch == 5) {
digitalWrite(ledPins[0], LOW);
delayMillis = 0;
}
animMillisFunction(5);
}
void anim5() {
if(animBatch == 0) {
digitalWrite(ledPins[0], HIGH);
digitalWrite(ledPins[1], HIGH);
delayMillis = 500;
} else if(animBatch == 1) {
digitalWrite(ledPins[0], LOW);
digitalWrite(ledPins[1], LOW);
delayMillis = 500;
} else if(animBatch == 2) {
digitalWrite(ledPins[1], HIGH);
digitalWrite(ledPins[2], HIGH);
delayMillis = 500;
} else if(animBatch == 3) {
digitalWrite(ledPins[1], LOW);
digitalWrite(ledPins[2], LOW);
delayMillis = 500;
} else if(animBatch == 4) {
digitalWrite(ledPins[0], HIGH);
digitalWrite(ledPins[2], HIGH);
delayMillis = 500;
} else if(animBatch == 5) {
digitalWrite(ledPins[0], LOW);
digitalWrite(ledPins[2], LOW);
delayMillis = 0;
}
animMillisFunction(5);
}
void anim6() {
if(animBatch == 0) {
digitalWrite(ledPins[0], HIGH);
delayMillis = 300;
} else if(animBatch == 1) {
digitalWrite(ledPins[0], LOW);
delayMillis = 300;
} else if(animBatch == 2) {
digitalWrite(ledPins[1], HIGH);
delayMillis = 300;
} else if(animBatch == 3) {
digitalWrite(ledPins[1], LOW);
delayMillis = 300;
} else if(animBatch == 4) {
digitalWrite(ledPins[2], HIGH);
delayMillis = 300;
} else if(animBatch == 5) {
digitalWrite(ledPins[2], LOW);
delayMillis = 0;
}
animMillisFunction(5);
}
void anim7() {
if(animBatch == 0) {
digitalWrite(ledPins[0], HIGH);
delayMillis = 300;
} else if(animBatch == 1) {
digitalWrite(ledPins[0], LOW);
delayMillis = 300;
} else if(animBatch == 2) {
digitalWrite(ledPins[1], HIGH);
delayMillis = 300;
} else if(animBatch == 3) {
digitalWrite(ledPins[1], LOW);
delayMillis = 300;
} else if(animBatch == 4) {
digitalWrite(ledPins[2], HIGH);
delayMillis = 300;
} else if(animBatch == 5) {
digitalWrite(ledPins[2], LOW);
delayMillis = 300;
} else if(animBatch == 6) {
digitalWrite(ledPins[1], HIGH);
delayMillis = 300;
} else if(animBatch == 7) {
digitalWrite(ledPins[1], LOW);
delayMillis = 0;
}
animMillisFunction(7);
}
void anim8() {
if(animBatch == 0) {
digitalWrite(ledPins[0], HIGH);
delayMillis = 300;
} else if(animBatch == 1) {
digitalWrite(ledPins[0], LOW);
delayMillis = 300;
} else if(animBatch == 2) {
digitalWrite(ledPins[1], HIGH);
delayMillis = 300;
} else if(animBatch == 3) {
digitalWrite(ledPins[1], LOW);
delayMillis = 300;
} else if(animBatch == 4) {
digitalWrite(ledPins[2], HIGH);
delayMillis = 300;
} else if(animBatch == 5) {
digitalWrite(ledPins[2], LOW);
delayMillis = 300;
} else if(animBatch == 6) {
digitalWrite(ledPins[1], HIGH);
delayMillis = 300;
} else if(animBatch == 7) {
digitalWrite(ledPins[1], LOW);
delayMillis = 0;
}
animMillisFunction(7);
}
void anim9() {
if(animBatch == 0) {
digitalWrite(ledPins[0], HIGH);
delayMillis = 300;
} else if(animBatch == 1) {
digitalWrite(ledPins[0], LOW);
delayMillis = 300;
} else if(animBatch == 2) {
digitalWrite(ledPins[1], HIGH);
delayMillis = 300;
} else if(animBatch == 3) {
digitalWrite(ledPins[1], LOW);
delayMillis = 300;
} else if(animBatch == 4) {
digitalWrite(ledPins[2], HIGH);
delayMillis = 300;
} else if(animBatch == 5) {
digitalWrite(ledPins[2], LOW);
delayMillis = 300;
} else if(animBatch == 6) {
digitalWrite(ledPins[1], HIGH);
delayMillis = 300;
} else if(animBatch == 7) {
digitalWrite(ledPins[1], LOW);
delayMillis = 0;
}
animMillisFunction(7);
}
void anim10() {
if(animBatch == 0) {
digitalWrite(ledPins[0], HIGH);
delayMillis = 300;
} else if(animBatch == 1) {
digitalWrite(ledPins[0], LOW);
delayMillis = 300;
} else if(animBatch == 2) {
digitalWrite(ledPins[1], HIGH);
delayMillis = 300;
} else if(animBatch == 3) {
digitalWrite(ledPins[1], LOW);
delayMillis = 300;
} else if(animBatch == 4) {
digitalWrite(ledPins[2], HIGH);
delayMillis = 300;
} else if(animBatch == 5) {
digitalWrite(ledPins[2], LOW);
delayMillis = 300;
} else if(animBatch == 6) {
digitalWrite(ledPins[1], HIGH);
delayMillis = 300;
} else if(animBatch == 7) {
digitalWrite(ledPins[1], LOW);
delayMillis = 0;
}
animMillisFunction(7);
}
// Mode 2 = 11 - 20
void anim11() {
if(animBatch == 0) {
digitalWrite(ledPins[0], HIGH);
digitalWrite(ledPins[1], HIGH);
delayMillis = 200;
} else if(animBatch == 1) {
digitalWrite(ledPins[0], LOW);
digitalWrite(ledPins[1], LOW);
delayMillis = 200;
} else if(animBatch == 2) {
digitalWrite(ledPins[1], HIGH);
digitalWrite(ledPins[2], HIGH);
delayMillis = 200;
} else if(animBatch == 3) {
digitalWrite(ledPins[1], LOW);
digitalWrite(ledPins[2], LOW);
delayMillis = 200;
} else if(animBatch == 4) {
digitalWrite(ledPins[0], HIGH);
digitalWrite(ledPins[2], HIGH);
delayMillis = 200;
} else if(animBatch == 5) {
digitalWrite(ledPins[0], LOW);
digitalWrite(ledPins[2], LOW);
delayMillis = 0;
}
animMillisFunction(5);
}
void anim12() {
if(animBatch == 0) {
digitalWrite(ledPins[2], HIGH);
digitalWrite(ledPins[1], HIGH);
delayMillis = 200;
} else if(animBatch == 1) {
digitalWrite(ledPins[0], LOW);
digitalWrite(ledPins[2], LOW);
delayMillis = 200;
} else if(animBatch == 2) {
digitalWrite(ledPins[0], HIGH);
digitalWrite(ledPins[1], HIGH);
delayMillis = 200;
} else if(animBatch == 3) {
digitalWrite(ledPins[1], LOW);
digitalWrite(ledPins[2], LOW);
delayMillis = 200;
} else if(animBatch == 4) {
digitalWrite(ledPins[0], HIGH);
digitalWrite(ledPins[2], HIGH);
delayMillis = 200;
} else if(animBatch == 5) {
digitalWrite(ledPins[0], LOW);
digitalWrite(ledPins[2], LOW);
delayMillis = 0;
}
animMillisFunction(5);
}
void anim13() {
if(animBatch == 0) {
digitalWrite(ledPins[0], HIGH);
digitalWrite(ledPins[1], HIGH);
digitalWrite(ledPins[2], HIGH);
delayMillis = 250;
} else if(animBatch == 1) {
digitalWrite(ledPins[0], LOW);
digitalWrite(ledPins[1], LOW);
digitalWrite(ledPins[2], LOW);
delayMillis = 250;
} else if(animBatch == 2) {
digitalWrite(ledPins[0], HIGH);
digitalWrite(ledPins[1], HIGH);
digitalWrite(ledPins[2], HIGH);
delayMillis = 500;
} else if(animBatch == 3) {
digitalWrite(ledPins[0], LOW);
digitalWrite(ledPins[1], LOW);
digitalWrite(ledPins[2], LOW);
delayMillis = 500;
} else if(animBatch == 4) {
digitalWrite(ledPins[0], HIGH);
digitalWrite(ledPins[1], HIGH);
digitalWrite(ledPins[2], HIGH);
delayMillis = 700;
} else if(animBatch == 5) {
digitalWrite(ledPins[0], LOW);
digitalWrite(ledPins[1], LOW);
digitalWrite(ledPins[2], LOW);
delayMillis = 0;
}
animMillisFunction(5);
}
void anim14() {
if(animBatch == 0) {
digitalWrite(ledPins[0], HIGH);
digitalWrite(ledPins[1], HIGH);
digitalWrite(ledPins[2], HIGH);
delayMillis = 500;
} else if(animBatch == 1) {
digitalWrite(ledPins[0], LOW);
digitalWrite(ledPins[1], LOW);
digitalWrite(ledPins[2], LOW);
delayMillis = 500;
} else if(animBatch == 2) {
digitalWrite(ledPins[0], HIGH);
digitalWrite(ledPins[1], HIGH);
delayMillis = 500;
} else if(animBatch == 3) {
digitalWrite(ledPins[0], LOW);
digitalWrite(ledPins[1], HIGH);
digitalWrite(ledPins[2], HIGH);
delayMillis = 500;
} else if(animBatch == 4) {
digitalWrite(ledPins[0], LOW);
digitalWrite(ledPins[1], LOW);
digitalWrite(ledPins[2], LOW);
delayMillis = 500;
} else if(animBatch == 5) {
digitalWrite(ledPins[0], HIGH);
digitalWrite(ledPins[1], HIGH);
digitalWrite(ledPins[2], HIGH);
delayMillis = 500;
} else if(animBatch == 6) {
digitalWrite(ledPins[0], LOW);
digitalWrite(ledPins[1], LOW);
digitalWrite(ledPins[2], LOW);
delayMillis = 0;
}
animMillisFunction(6);
}
void anim15() {
}
void anim16() {
}
void anim17() {
}
void anim18() {
}
void anim19() {
}
void anim20() {
}
// Utility Function
void animMillisFunction(int maxBatch) {
if(millis() - animPreviousMillis > delayMillis) {
animPreviousMillis = millis();
// animBatch >= di sesuaikan dengan jumlah maksimal batch animasi
if(animBatch >= maxBatch) {
isAnim = false;
resetAnim();
} else {
animBatch += 1;
}
}
}
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;
}
void writeIntIntoEEPROM(int address, int number) {
EEPROM.write(address, number >> 8);
EEPROM.write(address + 1, number & 0xFF);
}
int readIntFromEEPROM(int address) {
return (EEPROM.read(address) << 8) + EEPROM.read(address + 1);
}