#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");
}
}
}