#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#include <ESP32Servo.h>

// Inisialisasi LCD
LiquidCrystal_I2C LCD(0x27, 16, 2);

// Inisialisasi Servo
Servo myServo;

// Konfigurasi Keypad
const byte ROWS = 4; // Jumlah baris
const byte COLS = 4; // Jumlah kolom
char keys[ROWS][COLS] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {27, 26, 25, 33}; // Pin baris keypad
byte colPins[COLS] = {17, 5, 18, 19};  // Pin kolom keypad (disesuaikan)

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

String input = ""; // Menyimpan input dari keypad

void setup() {
  Serial.begin(9600);
  LCD.init();
  LCD.backlight();
  myServo.attach(14); // Pin servo
  myServo.write(0);   // Servo pada posisi awal 0 derajat
  LCD.setCursor(0, 0);
  LCD.print("Servo Control");
  delay(2000);
  LCD.clear();
}

void loop() {
  char key = keypad.getKey(); // Baca input keypad

  if (key) { // Jika ada tombol ditekan
    if (key >= '0' && key <= '9') { // Jika tombol angka
      input += key; // Tambahkan angka ke input
      LCD.clear();
      LCD.setCursor(0, 0);
      LCD.print("Input: ");
      LCD.print(input);
    } else if (key == '#') { // Tombol konfirmasi input
      int angle = input.toInt(); // Ubah input menjadi integer
      if (angle >= 0 && angle <= 180) { // Validasi sudut
        myServo.write(angle); // Putar servo ke sudut
        LCD.clear();
        LCD.setCursor(0, 0);
        LCD.print("Angle: ");
        LCD.print(angle);
        LCD.print(" deg");
        Serial.print("Servo angle: ");
        Serial.println(angle);
      } else {
        LCD.clear();
        LCD.setCursor(0, 0);
        LCD.print("Invalid Angle!");
      }
      input = ""; // Reset input
    } else if (key == '*') { // Tombol untuk menghapus input
      input = "";
      LCD.clear();
      LCD.setCursor(0, 0);
      LCD.print("Input Cleared");
    }
  }
}