#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>
#include <ESP32Servo.h>
#include <EEPROM.h>
#include <BLEScan.h>
Servo myservo;
const int servoPin = 5; // Servo motor pin
const int openButtonPin = 4; // Kapı açma butonu pin
const int closeButtonPin = 2; // Kapı kapatma butonu pin
BLECharacteristic *pCharacteristic;
BLEServer *pServer;
BLEScan* pBLEScan;
BLEClient* pClient;
bool doorIsOpen = false;
bool isConnected = false;
BLEAddress connectedAddress("54:67:06:6e:df:ec"); // Başlangıçta bir yer tutucu adresle başlat
void performDoorAction(int angle, int duration) {
myservo.attach(servoPin);
myservo.write(angle);
delay(duration);
myservo.detach();
}
void openDoor() {
Serial.println("Kapı açma işlemi başlatılıyor...");
performDoorAction(180, 3000);
performDoorAction(97, 2000);
performDoorAction(0, 500);
doorIsOpen = true;
Serial.println("Kapı açma işlemi tamamlandı.");
}
void closeDoor() {
Serial.println("Kapı kapatma işlemi başlatılıyor...");
performDoorAction(0, 3000);
doorIsOpen = false;
Serial.println("Kapı kapatma işlemi tamamlandı.");
}
class MyServerCallbacks : public BLEServerCallbacks {
void onConnect(BLEServer *pServer) {
Serial.println("Cihaz bağlandı");
isConnected = true;
if (!doorIsOpen && connectedAddress.equals(BLEAddress("54:67:06:6e:df:ec"))) {
Serial.println("Belirli telefonla bağlantı kuruldu. Kapı kilitli. Otomatik olarak '1234' mesajı gönderiliyor...");
pCharacteristic->setValue("1234");
pCharacteristic->notify();
Serial.println("Otomatik '1234' mesajı gönderildi.");
openDoor();
Serial.println("Kapı açık");
} else {
Serial.println("Bağlantı kurulan telefon geçerli değil veya kapı zaten açık. İşlem yapılmayacak.");
}
}
void onDisconnect(BLEServer *pServer) {
Serial.println("Cihaz bağlantısı kesildi");
isConnected = false;
reconnectToKnownDevice();
}
};
class MyCharacteristicCallbacks : public BLECharacteristicCallbacks {
void onWrite(BLECharacteristic *pCharacteristic) {
std::string value = pCharacteristic->getValue();
if (value.length() > 0) {
Serial.println("Gelen Mesaj: ");
for (int i = 0; i < value.length(); i++)
Serial.print(value[i]);
Serial.println();
if (value == "1234") {
if (!doorIsOpen && connectedAddress.equals(BLEAddress("54:67:06:6e:df:ec"))) {
openDoor();
Serial.println("Kapı açık");
} else {
Serial.println("Belirli telefonla bağlantı kurulduğunda veya kapı zaten açıkken işlem yapılmadı.");
}
}
}
}
};
void notifyCallback(BLERemoteCharacteristic* pBLERemoteCharacteristic, uint8_t* pData, size_t length, bool isNotify) {
// Bu fonksiyon, belirli bir karakteristik üzerinde bildirimler alındığında çağrılır
// Burada gerekli işlemleri yapabilirsiniz
}
void reconnectToKnownDevice() {
Serial.println("Yeniden bağlanmaya çalışılıyor...");
BLEScanResults foundDevices = pBLEScan->start(5, false);
for (int i = 0; i < foundDevices.getCount(); i++) {
BLEAdvertisedDevice advertisedDevice = foundDevices.getDevice(i);
if (advertisedDevice.getAddress().equals(connectedAddress)) {
Serial.println("Cihaz bulundu. Bağlanılıyor...");
pClient = BLEDevice::createClient();
if (pClient->connect(&advertisedDevice)) {
BLERemoteService* pRemoteService = pClient->getService("0000180F-0000-1000-8000-00805F9B34FB");
if (pRemoteService != nullptr) {
BLERemoteCharacteristic* pRemoteCharacteristic = pRemoteService->getCharacteristic("00002A19-0000-1000-8000-00805F9B34FB");
if (pRemoteCharacteristic != nullptr) {
pRemoteCharacteristic->registerForNotify(notifyCallback);
}
}
}
break;
}
}
}
void setup() {
myservo.attach(servoPin);
pinMode(openButtonPin, INPUT_PULLUP);
pinMode(closeButtonPin, INPUT_PULLUP);
Serial.begin(115200);
delay(1000);
BLEDevice::init("ESP32_BT");
pServer = BLEDevice::createServer();
pServer->setCallbacks(new MyServerCallbacks());
BLEService *pService = pServer->createService(BLEUUID((uint16_t)0x180F));
pCharacteristic = pService->createCharacteristic(
BLEUUID((uint16_t)0x2A19),
BLECharacteristic::PROPERTY_READ |
BLECharacteristic::PROPERTY_WRITE |
BLECharacteristic::PROPERTY_NOTIFY);
pCharacteristic->addDescriptor(new BLE2902());
pCharacteristic->setCallbacks(new MyCharacteristicCallbacks());
pService->start();
pBLEScan = BLEDevice::getScan();
BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
pAdvertising->addServiceUUID(BLEUUID((uint16_t)0x180F));
pAdvertising->setScanResponse(true);
pAdvertising->setMinPreferred(0x06); // functions that help with iPhone
pAdvertising->setMinPreferred(0x12);
BLEDevice::startAdvertising();
}
void loop() {
if (!isConnected) {
Serial.println("Cihaz bağlı değil, tekrar bağlanmaya çalışılıyor...");
BLEDevice::startAdvertising();
delay(5000); // 5 saniye bekleme süresi, isteğe bağlı olarak değiştirilebilir
}
if (digitalRead(openButtonPin) == LOW && !doorIsOpen) {
openDoor();
Serial.println("Kapı açık");
} else if (digitalRead(closeButtonPin) == LOW && doorIsOpen) {
closeDoor();
Serial.println("İşlem tamamlandı. Kapı kapalı");
}
delay(3000);
}