#include <LiquidCrystal.h>
#include <Keypad.h>
#include <ESP32Servo.h>
#include <WiFi.h>
#include <WebServer.h>
// --- Wi-Fi Ayarları ---
const char* ssid = "ESP32_Kapi_Kilidi"; // Telefonunda görünecek Wi-Fi adı
const char* password = "password123"; // Wi-Fi şifresi (en az 8 karakter)
WebServer server(80);
// --- LCD Pin Tanımlamaları ---
const int rs = 21, en = 22, d4 = 17, d5 = 15, d6 = 2, d7 = 4;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
// --- Servo Tanımlaması ---
Servo myServo;
const int servoPin = 18;
// --- Buzzer ve LED Tanımlamaları ---
const int buzzerPin = 19;
const int greenLed = 23;
const int redLed = 5;
// --- Keypad Tanımlamaları ---
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {15, 2, 4, 16};
byte colPins[COLS] = {17, 27, 14, 12};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
// --- Şifre Değişkenleri ---
const String dogruSifre = "1234";
String girilenSifre = "";
const int sifreUzunlugu = 4;
// --- HTML Arayüzü (Web Sayfası) ---
String htmlSayfasi() {
String ptr = "<!DOCTYPE html><html>\n";
ptr += "<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=no\">\n";
ptr += "<title>ESP32 Akilli Kilit</title>\n";
ptr += "<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}\n";
ptr += "body{margin-top: 50px;} h1 {color: #444444;margin: 50px auto 30px;}\n";
ptr += ".button {display: block;width: 200px;background-color: #4CAF50;border: none;color: white;padding: 13px 30px;text-decoration: none;font-size: 25px;margin: 0px auto 35px;cursor: pointer;border-radius: 4px;}\n";
ptr += ".button:active {background-color: #3e8e41;}\n";
ptr += "</style></head><body>\n";
ptr += "<h1>ESP32 Akilli Kapı Kilidi</h1>\n";
ptr += "<p>Kapıyı açmak için aşağıdaki butona basınız.</p>\n";
ptr += "<a class=\"button\" href=\"/ac\">KILIDI AC</a>\n";
ptr += "</body></html>\n";
return ptr;
}
void setup() {
// LCD Başlatma
lcd.begin(16, 2);
lcd.print("Sistem Aciliyor");
// Servo Başlatma
myServo.attach(servoPin);
myServo.write(0); // Kilitli pozisyon
// Pin Modları
pinMode(buzzerPin, OUTPUT);
pinMode(greenLed, OUTPUT);
pinMode(redLed, OUTPUT);
digitalWrite(redLed, HIGH);
digitalWrite(greenLed, LOW);
// Wi-Fi Erişim Noktası (Access Point) Kurulumu
lcd.clear();
lcd.print("Wi-Fi Kuruluyor");
WiFi.softAP(ssid, password);
delay(1000);
// Web sunucu yönlendirmeleri
server.on("/", HTTP_GET, []() {
server.send(200, "text/html", htmlSayfasi());
});
server.on("/ac", HTTP_GET, []() {
server.send(200, "text/html", htmlSayfasi());
kapiyiAc(); // Wi-Fi üzerinden tetiklenen açma fonksiyonu
});
server.begin();
// IP adresini ekranda gösterelim (Varsayılan: 192.168.4.1)
lcd.clear();
lcd.print("IP: ");
lcd.print(WiFi.softAPIP());
lcd.setCursor(0, 1);
lcd.print("Ag: ");
lcd.print(ssid);
delay(4000); // IP'yi okumak için kısa bir bekleme
ekraniGuncelle();
}
void loop() {
// Web sunucusunu dinle
server.handleClient();
// Keypad'i dinle
char key = keypad.getKey();
if (key) {
if (key == '*') {
tusSesi();
girilenSifre = "";
ekraniGuncelle();
}
else if (key == '#') {
sifreKontrol();
}
else if (key == 'A' || key == 'B' || key == 'C' || key == 'D') {
hataSesi();
}
else {
if (girilenSifre.length() < sifreUzunlugu) {
tusSesi();
girilenSifre += key;
ekraniGuncelle();
}
}
}
}
void ekraniGuncelle() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Sifre Giriniz:");
lcd.setCursor(0, 1);
for (int i = 0; i < girilenSifre.length(); i++) {
lcd.print("*");
}
}
// Kilidi açma ve geri kilitleme senaryosu
void kapiyiAc() {
lcd.clear();
lcd.print("Erisim Onaylandi");
lcd.setCursor(0, 1);
lcd.print("Kilit Acildi");
digitalWrite(redLed, LOW);
digitalWrite(greenLed, HIGH);
myServo.write(90); // Servo açılıyor
// Melodi
digitalWrite(buzzerPin, HIGH); delay(100); digitalWrite(buzzerPin, LOW); delay(50);
digitalWrite(buzzerPin, HIGH); delay(100); digitalWrite(buzzerPin, LOW); delay(50);
digitalWrite(buzzerPin, HIGH); delay(200); digitalWrite(buzzerPin, LOW);
delay(4000); // 4 saniye kapı açık kalır
lcd.clear();
lcd.print("Kilitleniyor...");
myServo.write(0); // Servo kilitleniyor
digitalWrite(greenLed, LOW);
digitalWrite(redLed, HIGH);
delay(1000);
girilenSifre = "";
ekraniGuncelle();
}
void sifreKontrol() {
if (girilenSifre == dogruSifre) {
kapiyiAc();
}
else {
lcd.clear();
lcd.print("Hatali Sifre!");
digitalWrite(redLed, LOW);
for(int i = 0; i < 3; i++){
digitalWrite(redLed, HIGH);
digitalWrite(buzzerPin, HIGH);
delay(150);
digitalWrite(redLed, LOW);
digitalWrite(buzzerPin, LOW);
delay(100);
}
digitalWrite(redLed, HIGH);
girilenSifre = "";
ekraniGuncelle();
}
}
void tusSesi() {
digitalWrite(buzzerPin, HIGH);
delay(40);
digitalWrite(buzzerPin, LOW);
}
void hataSesi() {
digitalWrite(buzzerPin, HIGH);
delay(150);
digitalWrite(buzzerPin, LOW);
}