#include <LiquidCrystal.h>
#include <Keypad.h>
#include <Servo.h>
const int rs = 12;   // Pin 7  on Arduino to pin 4  (RS) on LCD
const int en = 11;   // Pin 6  on Arduino to pin 6  (E)  on LCD
const int d4 = 10;  // Pin 12 on Arduino to pin 11 (D4) on LCD
const int d5 = 9;  // Pin 10 on Arduino to pin 12 (D5) on LCD
const int d6 = 8;   // Pin 9  on Arduino to pin 13 (D6) on LCD
const int d7 = 7;   // Pin 8  on Arduino to pin 14 (D7) on LCD   // Pin 8  on Arduino to pin 14 (D7) on LCD
LiquidCrystal lcd (rs,en,d4,d5,d6,d7);
Servo myservo;

const uint8_t ROWS = 4;
const uint8_t COLS = 4;
char keys[ROWS][COLS] = {
  { '1', '2', '3', 'A' },
  { '4', '5', '6', 'B' },
  { '7', '8', '9', 'C' },
  { '*', '0', '#', 'D' }
};

uint8_t colPins[COLS] = { 5, 4, 3, 2 }; // Pins connected to C1, C2, C3, C4
uint8_t rowPins[ROWS] = { A0, A1, A2, A3}; // Pins connected to R1, R2, R3, R4

Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);

int angle = 0;

void setup() {
  // inisialisasi servo pada pin 13
  myservo.attach(6);

  // inisialisasi LCD dengan 16 kolom dan 2 baris
  lcd.begin(16, 2);
}

void loop() {
  // membaca tombol yang ditekan pada keypad
  char key = keypad.getKey();

  // jika tombol ditekan, proses input sudut servo
  if (key != NO_KEY) {
    // jika tombol yang ditekan adalah angka
    if (key >= '0' && key <= '9') {
      // tambahkan angka ke nilai sudut yang sudah ada
      angle = angle * 10 + (key - '0');
      // batasi nilai sudut menjadi 0-180
      angle = constrain(angle, 0, 180);
      // tampilkan nilai sudut pada LCD
      lcd.setCursor(0, 0);
      lcd.print("Sudut: ");
      lcd.print(angle);
    }
    // jika tombol yang ditekan adalah tombol #, set sudut servo sesuai nilai sudut yang telah diinput
    else if (key == '#') {
      myservo.write(angle);
      delay(500);
    }
    // jika tombol yang ditekan adalah tombol *, reset nilai sudut menjadi 0
    else if (key == '*') {
      angle = 0;
      lcd.clear();
    }
  }
}