#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
#define BUZZER 19
#define SERVO_PIN 18
int rowPins[4] = {13,12,14,27};
int colPins[4] = {26,25,33,32};
char keys[4][4] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
void setup() {
Serial.begin(115200);
lcd.init();
lcd.backlight();
pinMode(BUZZER, OUTPUT);
pinMode(SERVO_PIN, OUTPUT);
for(int i=0;i<4;i++){
pinMode(rowPins[i], OUTPUT);
digitalWrite(rowPins[i], HIGH);
pinMode(colPins[i], INPUT_PULLUP);
}
lcd.print("System Ready");
}
void loop() {
char key = scanKeypad();
if(key){
// Print to Serial
Serial.print("Pressed: ");
Serial.println(key);
// Show on LCD
lcd.clear();
lcd.print("Key: ");
lcd.print(key);
// Beep
digitalWrite(BUZZER, HIGH);
delay(100);
digitalWrite(BUZZER, LOW);
// If A pressed → Move servo
if(key == 'A'){
moveServo();
}
}
}
char scanKeypad(){
for(int row=0; row<4; row++){
digitalWrite(rowPins[row], LOW);
for(int col=0; col<4; col++){
if(digitalRead(colPins[col]) == LOW){
delay(200);
digitalWrite(rowPins[row], HIGH);
return keys[row][col];
}
}
digitalWrite(rowPins[row], HIGH);
}
return 0;
}
// Simple manual servo control (no library)
void servoPulse(int microseconds){
digitalWrite(SERVO_PIN, HIGH);
delayMicroseconds(microseconds);
digitalWrite(SERVO_PIN, LOW);
delay(20);
}
void moveServo(){
// Move to 0°
for(int i=0;i<40;i++)
servoPulse(500);
delay(300);
// Move to 180°
for(int i=0;i<40;i++)
servoPulse(2500);
delay(300);
// Back to 90°
for(int i=0;i<40;i++)
servoPulse(1500);
}