//Library ----------------------------------------------
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
//------------------------------------------------------

//Define Pin -------------------------------------------
#define pinAdc A0
#define pinSw1 12
#define pinSw2 11
#define pinSw3 10
#define pinSw4 9
#define pinClock 6
#define pinData 5
#define pinLatch 4
#define pinClockLed 3
#define pinDataLed 2
#define pinLatchLed 13
//------------------------------------------------------

//Fungsi Macro -----------------------------------------
#define led1(x) digitalWrite(pinLed1, x)
#define led2(x) digitalWrite(pinLed2, x)
#define led3(x) digitalWrite(pinLed3, x)
#define led4(x) digitalWrite(pinLed4, x)

#define clockSeg(x) digitalWrite(pinClock, x)
#define dataSeg(x) digitalWrite(pinData, x)
#define latchSeg(x) digitalWrite(pinLatch, x)

#define clockLed(x) digitalWrite(pinClockLed, x)
#define dataLed(x) digitalWrite(pinDataLed, x)
#define latchLed(x) digitalWrite(pinLatchLed, x)

#define sw1 digitalRead(pinSw1)
#define sw2 digitalRead(pinSw2)
#define sw3 digitalRead(pinSw3)
#define sw4 digitalRead(pinSw4)

#define ADC analogRead(pinAdc)
//------------------------------------------------------

//Set alamat I2C dan ukuran LCD ------------------------
LiquidCrystal_I2C lcd(0x27,16,2);
//------------------------------------------------------

//Variabel ---------------------------------------------
uint8_t arraySegment[10] = {
  0b00000011, //0
  0b10011111, //1
  0b00100101, //2
  0b00001101, //3
  0b10011001, //4
  0b01001001, //5
  0b01000001, //6
  0b00011111, //7
  0b00000001, //8
  0b00001001 //9
};
uint16_t dataADC = 0;
int8_t dataGanjil = 0;
int8_t dataGenap = 0;
bool k1 = 0;
bool k2 = 0;
bool k3 = 0;
bool k4 = 0;
int8_t counterUp = 0;
int8_t counterDown = 0;
int8_t runningKn = 0;
bool kunci1 = 0;
int8_t menu = 1;
int8_t kunciMenu = 0;
bool kunciMenu1 = 0;
bool kunciMenu2 = 0;
bool kunciMenu3 = 0;
bool kunciMenu4 = 0;
//------------------------------------------------------

void setup(){
  pinMode(pinAdc, INPUT);
  pinMode(pinSw1, INPUT);
  pinMode(pinSw2, INPUT);
  pinMode(pinSw3, INPUT);
  pinMode(pinSw4, INPUT);
  pinMode(pinClock, OUTPUT);
  pinMode(pinData, OUTPUT);
  pinMode(pinLatch, OUTPUT);
  pinMode(pinClockLed, OUTPUT);
  pinMode(pinDataLed, OUTPUT);
  pinMode(pinLatchLed, OUTPUT);
  Serial.begin(9600);
  lcd.init();
  lcd.backlight();
  lcd.clear();
  // lcd.setCursor(0,0);
  // lcd.print("LKS ELECTRONICS");
  // lcd.setCursor(0,1);
  // lcd.print("SMKN 39 JAKARTA");
  // delay(2000);
  // lcd.clear();
}

void loop(){
  // dataADC = analogRead(pinAdc);
  // lcd.setCursor(0,0);
  // lcd.print("Putar Potensio  ");
  // lcd.setCursor(0,1);
  // lcd.print("Nilai ADC :");
  // lcd.print(dataADC);
  // lcd.print(" ");

  // task1_1();
  // task1_2();
  // task1_3();
  // task1_4();
  // task1_5();
  task2();


}

void task2(){
  lcd.setCursor(0,0);
  lcd.print("Putar Potensio  ");
  lcd.setCursor(0,1);
  lcd.print("Sampai Maksimum ");

  if(ADC > 1000){
    kunci1 = 1;
  }
  while(kunci1 == 1){
    //sw1---
    if(sw1 == 0 && k1 == 0){
      k1 = 1;
    }
    if(sw1 == 1 && k1 == 1){
      menu++;
      if(menu > 4){
        menu = 4;
      }
      //end---
      k1 = 0;
    }
    //sw3---
    if(sw3 == 0 && k3 == 0){
      k3 = 1;
    }
    if(sw3 == 1 && k3 == 1){
      menu--;
      if(menu < 1){
        menu = 1;
      }
      //end---
      k3 = 0;
    }
    //sw2---
    if(sw2 == 0 && k2 == 0){
      k2 = 1;
    }
    if(sw2 == 1 && k2 == 1){
      kunciMenu = menu;
      //end---
      k2 = 0;
    }

    switch(kunciMenu){
      case 1:
        lcd.setCursor(0,0);
        lcd.print("Menu - 1        ");
        lcd.setCursor(0,1);
        lcd.print("Running LED Kn  ");
        if(sw4 == 0 && k4 == 0){
          k4 = 1;
        }
        if(sw4 == 1 && k4 == 1){
          kunciMenu1 = 1;
          //end
          k4 = 0;
        }
        while(kunciMenu1 == 1){
          for(uint8_t i=1; i<=8; i++){
            shiftLED(i);
            shiftSeg(i);
            delay(500);
          }
          kunciMenu1 = 0;
        }
      break;
      case 2:
        lcd.setCursor(0,0);
        lcd.print("Menu - 2        ");
        lcd.setCursor(0,1);
        lcd.print("Running LED Kr  ");
        if(sw4 == 0 && k4 == 0){
          k4 = 1;
        }
        if(sw4 == 1 && k4 == 1){
          kunciMenu2 = 1;
          //end
          k4 = 0;
        }
        while(kunciMenu2 == 1){
          for(uint8_t i=8; i>0; i--){
            shiftLED(i);
            shiftSeg(i);
            delay(500);
          }
          kunciMenu2 = 0;
        }
      break;
      case 3:
        lcd.setCursor(0,0);
        lcd.print("Menu - 3        ");
        lcd.setCursor(0,1);
        lcd.print("Counter UP : ");
        lcd.print(counterUp);
        if(sw4 == 0 && k4 == 0 && ADC > 1000){
          k4 = 1;
        }
        if(sw4 == 1 && k4 == 1 && ADC > 1000){
          kunciMenu3 = 1;
          //end
          k4 = 0;
        }
        while(kunciMenu3 == 1){
          lcd.setCursor(0,0);
          lcd.print("Menu - 3        ");
          lcd.setCursor(0,1);
          lcd.print("Counter UP : ");
          lcd.print(counterUp);
          if(sw1 == 0 && k1 == 0){
            k1 = 1;
          }
          if(sw1 == 1 && k1 == 1){
            counterUp++;
            if(counterUp > 8){
              counterUp = 0;
            }
            //end
            k1 = 0;
          }
          shiftLED(counterUp);
          shiftSeg(counterUp);
        }
      break;
      case 4:
        lcd.setCursor(0,0);
        lcd.print("Menu - 4        ");
        lcd.setCursor(0,1);
        lcd.print("Counter Dwn : ");
        lcd.print(counterDown);
        if(sw4 == 0 && k4 == 0 && ADC > 1000){
          k4 = 1;
        }
        if(sw4 == 1 && k4 == 1 && ADC > 1000){
          kunciMenu4 = 1;
          //end
          k4 = 0;
        }
        while(kunciMenu4 == 1){
          lcd.setCursor(0,0);
          lcd.print("Menu - 4        ");
          lcd.setCursor(0,1);
          lcd.print("Counter Dwn : ");
          lcd.print(counterDown);
          if(sw2 == 0 && k2 == 0){
            k2 = 1;
          }
          if(sw2 == 1 && k2 == 1){
            counterDown--;
            if(counterDown < 0){
              counterDown = 8;
            }
            //end
            k2 = 0;
          }
          shiftLED(counterDown);
          shiftSeg(counterDown);
        }
      break;
      default:
        lcd.setCursor(0,0);
        lcd.print("Pilih Menu      ");
        lcd.setCursor(0,1);
        lcd.print("Menu : ");
        lcd.print(menu);
        lcd.print("        ");
      break;
    }
  }
}

void shiftLED(uint8_t dataLED){
  for(uint8_t i=0; i<8; i++){
    dataLed(((1 << (8 - dataLED))>>i)&1);
    clockLed(0);
    clockLed(1);
  }
  latchLed(0);
  latchLed(1);
}

void task1_5(){
  runningKn++;
  if(runningKn > 8){
    runningKn = 1;
  }
  lcd.setCursor(0,0);
  lcd.print("Nomor LED :");
  lcd.setCursor(0,1);
  lcd.print(runningKn);
  for(uint8_t i=0; i<8; i++){
    dataLed(((1 << (8 - runningKn))>>i)&1);
    clockLed(0);
    clockLed(1);
  }
  latchLed(0);
  latchLed(1);
  shiftSeg(runningKn);
  delay(1000);
}

void shiftSeg(uint8_t dataSeg){
  for(uint8_t i=0; i<8; i++){
    dataSeg((arraySegment[dataSeg] >> i)&1);
    clockSeg(0);
    clockSeg(1);
  }
  latchSeg(0);
  latchSeg(1);
}

void task1_4(){
  lcd.setCursor(0,0);
  lcd.print("Counter UP");
  lcd.setCursor(0,1);
  lcd.print("Nilai : ");
  lcd.print(counterUp);
  for(uint8_t i=0; i<8; i++){
    dataSeg((arraySegment[counterUp] >> i)&1);
    clockSeg(0);
    clockSeg(1);
  }
  latchSeg(0);
  latchSeg(1);
  delay(1000);
  counterUp++;
  if(counterUp > 8){
    counterUp = 0;
  }
}

void task1_3(){
  dataADC = analogRead(pinAdc);
  lcd.setCursor(0,0);
  lcd.print("Membaca ADC");
  lcd.setCursor(0,1);
  lcd.print("Nilai : ");
  lcd.print(dataADC);
  lcd.print(" ");
}

void task1_2(){
  lcd.setCursor(0,0);
  lcd.print("Ganjil : ");
  lcd.print(dataGanjil);
  lcd.print(" ");
  lcd.setCursor(0,1);
  lcd.print("Genap  : ");
  lcd.print(dataGenap);
  lcd.print(" ");

  //sw1----
  if(sw1 == 0 && k1 == 0){
    k1 = 1;
  }
  if(sw1 == 1 && k1 == 1){
    dataGanjil = dataGanjil + 2;
    if(dataGanjil == 2){
      dataGanjil = 1;
    }
    if(dataGanjil > 99){
      dataGanjil = 99;
    }
    //end-----
    k1 = 0;
  }
  //sw3----
  if(sw3 == 0 && k3 == 0){
    k3 = 1;
  }
  if(sw3 == 1 && k3 == 1){
    dataGanjil = dataGanjil - 2;
    if(dataGanjil < 0){
      dataGanjil = 0;
    }
    //end-----
    k3 = 0;
  }
  //sw2----
  if(sw2 == 0 && k2 == 0){
    k2 = 1;
  }
  if(sw2 == 1 && k2 == 1){
    dataGenap = dataGenap + 2;
    if(dataGenap > 100){
      dataGenap = 100;
    }
    //end-----
    k2 = 0;
  }
  //sw4----
  if(sw4 == 0 && k4 == 0){
    k4 = 1;
  }
  if(sw4 == 1 && k4 == 1){
    dataGenap = dataGenap - 2;
    if(dataGenap < 0){
      dataGenap = 0;
    }
    //end-----
    k4 = 0;
  }

}

void task1_1(){
  lcd.setCursor(0,0);
  lcd.print("Nama Peserta :  ");
  lcd.setCursor(0,1);
  lcd.print("Irfan Mahrubi   ");
  delay(2000);
  lcd.setCursor(0,0);
  lcd.print("Nomor Peserta : ");
  lcd.setCursor(0,1);
  lcd.print("6               ");
  delay(2000);

  // lcd.setCursor(0,0);
  // lcd.print("Nama Peserta : ");
  // lcd.setCursor(0,1);
  // lcd.print("Irfan Mahrubi");
  // delay(2000);
  // lcd.clear();
  // lcd.setCursor(0,0);
  // lcd.print("Nomor Peserta :");
  // lcd.setCursor(0,1);
  // lcd.print("6");
  // delay(2000);
  // lcd.clear();
}


nano:12
nano:11
nano:10
nano:9
nano:8
nano:7
nano:6
nano:5
nano:4
nano:3
nano:2
nano:GND.2
nano:RESET.2
nano:0
nano:1
nano:13
nano:3.3V
nano:AREF
nano:A0
nano:A1
nano:A2
nano:A3
nano:A4
nano:A5
nano:A6
nano:A7
nano:5V
nano:RESET
nano:GND.1
nano:VIN
nano:12.2
nano:5V.2
nano:13.2
nano:11.2
nano:RESET.3
nano:GND.3
pot1:GND
pot1:SIG
pot1:VCC
lcd1:GND
lcd1:VCC
lcd1:SDA
lcd1:SCL
74HC595
sr1:Q1
sr1:Q2
sr1:Q3
sr1:Q4
sr1:Q5
sr1:Q6
sr1:Q7
sr1:GND
sr1:Q7S
sr1:MR
sr1:SHCP
sr1:STCP
sr1:OE
sr1:DS
sr1:Q0
sr1:VCC
sevseg1:COM.1
sevseg1:COM.2
sevseg1:A
sevseg1:B
sevseg1:C
sevseg1:D
sevseg1:E
sevseg1:F
sevseg1:G
sevseg1:DP
74HC595
sr2:Q1
sr2:Q2
sr2:Q3
sr2:Q4
sr2:Q5
sr2:Q6
sr2:Q7
sr2:GND
sr2:Q7S
sr2:MR
sr2:SHCP
sr2:STCP
sr2:OE
sr2:DS
sr2:Q0
sr2:VCC
led5:A
led5:C
led6:A
led6:C
led7:A
led7:C
led8:A
led8:C
led9:A
led9:C
led10:A
led10:C
led11:A
led11:C
led12:A
led12:C
r1:1
r1:2
btn1:1.l
btn1:2.l
btn1:1.r
btn1:2.r
btn2:1.l
btn2:2.l
btn2:1.r
btn2:2.r
btn3:1.l
btn3:2.l
btn3:1.r
btn3:2.r
btn4:1.l
btn4:2.l
btn4:1.r
btn4:2.r
r2:1
r2:2
r3:1
r3:2
r4:1
r4:2
SW1
SW2
SW3
SW4
LED1
LED2
LED3
LED4
LED5
LED6
LED7
LED8