Esp32 Bluetooth yardım.

Bütün bir sistemi oturup yazamam. Kodum ticari olduğu için tamamını da açamam.

Fakat adım adım ve basit temeller üzerinden ilerlersen takıldığın yerlerde yardımcı olabilirim.

Örneğin başlangıç için klasik Bluetooth bağlantısı yerine, Bluetooth Low Energy ve GATT servisleri filan araştırmanı tavsiye ederim. Bu sayede eşleşme zorunluluğu ortadan kalkar ve belirli bir UUID yakaladığında otomatik bağlantı kurup, haberleşebilrisin.
 
O zaman şöyle sorayim hocam kodlarım tamam.calismasinda sorun yok tek sorun şu ben Bluetooth terminal uygulaması kullanmıyorum. Direk telefonun Bluetooth sekmesinden aygıt buldan esp32 bulup etkinlestir dediğimde cihaz eslesiyor ve kapı açma kodu olan 1234 mesajını gönderi kapı açılıyor. Sonra kapasama alanından cikiyorum bağlantı kesildi olarak serial monitörde görüyorum. Ama sonra kapsama alanına girdiğimde otomatik bağlanmıyor. Telefondan esp32 aygıtının bağlantısını kesip tekrar etkinlestir dediğimde çalışıyor. Kapsama alanına girdiğinde nasıl bir kod eklemem gerekli. Çalışan kodum su sekilde Kod
Çalışan kodum bu:
#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);
}
 
O zaman şöyle sorayim hocam kodlarım tamam.calismasinda sorun yok tek sorun şu ben Bluetooth terminal uygulaması kullanmıyorum. Direk telefonun Bluetooth sekmesinden aygıt buldan esp32 bulup etkinlestir dediğimde cihaz eslesiyor ve kapı açma kodu olan 1234 mesajını gönderi kapı açılıyor. Sonra kapasama alanından cikiyorum bağlantı kesildi olarak serial monitörde görüyorum. Ama sonra kapsama alanına girdiğimde otomatik bağlanmıyor. Telefondan esp32 aygıtının bağlantısını kesip tekrar etkinlestir dediğimde çalışıyor. Kapsama alanına girdiğinde nasıl bir kod eklemem gerekli. Çalışan kodum su sekilde Kod
Çalışan kodum bu:
#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);
}
Bir fonksiyon oluştur. İçine bluetooth bağlantısını kontrol eden kodu yaz.
bir if bloğu oluşturarak "eğer bağlantı koptuysa" kontrolü yap ve altınada tekrar bağlanma komutlarını ekle.
Sonra bu fonksiyonu void loop içinde çağır. Void loop sürekli tekrar ettiğinden, sürekli bağlantıyı kontrol etmiş olursun ve koptuysa bağlanırsın.
 
Bir fonksiyon oluştur. İçine bluetooth bağlantısını kontrol eden kodu yaz.
bir if bloğu oluşturarak "eğer bağlantı koptuysa" kontrolü yap ve altınada tekrar bağlanma komutlarını ekle.
Sonra bu fonksiyonu void loop içinde çağır. Void loop sürekli tekrar ettiğinden, sürekli bağlantıyı kontrol etmiş olursun ve koptuysa bağlanırsın.
Cevap için teşekkür. Esp32 kart aslında MAC adresime göre direk telefona baglanamasi gerek ama o bağlanmadigi için ben bağlanıyorum. Gönül isterki o bağlansın. Vallah o kadar şey denedim ki patates oldu kafa. Ama ne yaparsam yapayım otomatik esp32 benim telefonuma ben bağlanmadan bağlanmıyor.
 
Cevap için teşekkür. Esp32 kart aslında MAC adresime göre direk telefona baglanamasi gerek ama o bağlanmadigi için ben bağlanıyorum. Gönül isterki o bağlansın. Vallah o kadar şey denedim ki patates oldu kafa. Ama ne yaparsam yapayım otomatik esp32 benim telefonuma ben bağlanmadan bağlanmıyor.
Sen muhtemelen telefondan ESP yi taratıyorsun ve bağlan diyorsun, o da bağlanıyor.
Aynı şeyi ESP ye yaptırmazsan nereden bilecek bağlanması derektiğini? O yüzden benim yukarıda dediğim şekilde bağlantıyı kontrol edip kopmuşsa bağlan komutu döndürmen gerekiyor.

o kadar şey denedim ki patates oldu kafa
Arada mola verip başka şeylerle ilgilen. Kafanı dağıt. Yoksa çırpındıkça batarsın. Benim kodlama bilgim çok iyi değil. O yüzden yardımcı olamıyorum.
Ama eğer bir projeye başlarsam sıkıştığım yerde soru sorup, aldığım cevaba göre kod araştırıyorum. Ve mutlaka bir çözüm çıkıyor. Çıkmasa bile bir adım ilerletyor. Sonra bir daha soru soruyorum.
 
Cevap için teşekkürler yarın daha farklı yaklaşacağız olaya önerilen kodları denemee çalışacağım bakalım. Olmaz ise phyton dilinde yardımcı olacak arakadaş.
 
evet sorunu buldum esp32 mac taraması yaptırdım benim telefonumu daha doğrusu telefonların mac adresini bulmuyor akıllı saat gibi client aygıtları (Bluetooth Low Energy) buluyor. telefonun neden mac adresini bulmaz.yada telefonu (Bluetooth Low Energy) olarak nasıl yayın yaptıra bilirim @Sercan
1709279415262.png
 
Son düzenleme:
bu koda mac adresi eklemedim telefondan esp32 aygıtına bağlandığımda işlem sağlıyor ama otomatik tekrar geri bağlanmıyor.
kod:
#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>
#include <ESP32Servo.h>
#include <EEPROM.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;

bool doorIsOpen = false;

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ı");

    // Cihaz bağlandığında kapının durumunu kontrol et
    if (!doorIsOpen) {
      Serial.println("Kapı kilitli. Otomatik olarak '1234' mesajı gönderiliyor...");

      // "1234" mesajını otomatik olarak gönder
      pCharacteristic->setValue("1234");
      pCharacteristic->notify();
      Serial.println("Otomatik '1234' mesajı gönderildi.");

      // Kapıyı aç
      openDoor();
      Serial.println("Kapı açık");
    } else {
      Serial.println("Kapı zaten açık. İşlem yapılmayacak.");
      // Buraya başka bir işlem ekleyebilirsiniz.
    }
  }

  void onDisconnect(BLEServer *pServer) {
    Serial.println("Cihaz bağlantısı kesildi");
  }
};

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) {
          openDoor();
          Serial.println("Kapı açık");
        } else {
          Serial.println("Kapı zaten açık. İşlem yapılmadı.");
        }
      }
    }
  }
};

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();

  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 (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);
}
MAC adresli olan koddumda var onda esp32 kartını cliet olarak başlatıyorum o zamanda telefonu görmediğinden işleme başlatamıyorum @Sercan
 
abi esp32 micropyton destekliyor madem yazılım kısmında zayıfsın neden c ya da c++
python kullan kodu türkçe yazdır gpt ye python dersi izle

py bir kompozisyon yazmak gibi düşün giriş gelişme sonuç
senin için daha kolay olur diye diyorum

bu arada telifimi reddetti dolapdaki arkadaş
 
Hocam birçok forum ve eğitimlere göz attım ama şu olay sanırım olmuyor.yada ben bulamadım. Esp32 Bluetooth server olarak kullanırsan telefon otomatik bağlanmıyor. Client olarak kullanırsan da telefonda client olarak yayın yaptığından bağlanmıyor. Hiç bir örnek video ve eğitime denk gelmedim esp32 otomatik olarak Bluetooth bağlantısı geldiğinde kullanan. Herkes İot bylnk kullanıyor. Bunu bu işin üst duzeyleri sizler olduğunuzdan size sormak istedim. Ben kodlamami gelistire bilirim ama mantık oluyormu olmuyormu önemli olan bu. Benim değil projem değil mesela esp32 bir role takip ben eve geldiğimde Bluetooth bağlantısı kurduğunda yansın istiyorum.her seferinde telefon Bluetooth aygitlarindan esp32 kaldırıp tekrar bağlan demek gerekli.Bunu bile yapamadım gpt de yapamadı @nt
 
abi esp32 micropyton destekliyor madem yazılım kısmında zayıfsın neden c ya da c++
python kullan kodu türkçe yazdır gpt ye python dersi izle

py bir kompozisyon yazmak gibi düşün giriş gelişme sonuç
senin için daha kolay olur diye diyorum

bu arada telifimi reddetti dolapdaki arkadaş
Projeme Bulabildiğim en yakın video
buda nasıl yapıldığını anlatmıyor zaten.
 
Hocam birçok forum ve eğitimlere göz attım ama şu olay sanırım olmuyor.yada ben bulamadım. Esp32 Bluetooth server olarak kullanırsan telefon otomatik bağlanmıyor. Client olarak kullanırsan da telefonda client olarak yayın yaptığından bağlanmıyor. Hiç bir örnek video ve eğitime denk gelmedim esp32 otomatik olarak Bluetooth bağlantısı geldiğinde kullanan. Herkes İot bylnk kullanıyor. Bunu bu işin üst duzeyleri sizler olduğunuzdan size sormak istedim. Ben kodlamami gelistire bilirim ama mantık oluyormu olmuyormu önemli olan bu. Benim değil projem değil mesela esp32 bir role takip ben eve geldiğimde Bluetooth bağlantısı kurduğunda yansın istiyorum.her seferinde telefon Bluetooth aygitlarindan esp32 kaldırıp tekrar bağlan demek gerekli.Bunu bile yapamadım gpt de yapamadı @nt
Telefon Bluetooth ları bence sıkıntılı standart farkı felan da olabilir
Mesela devasa sirketlerin geliştirdiği bluetooth kulaklık ile telefon arasındaki bağlantıda bile sıkıntı yaşıyorum kulaklıgı açımca otomatik bluetooth a bağlanabiliyorum baglantı kopacak kadar uzaklaşıp geri geldiğimde otomatik bağlanmıyor kulaklıgı kapatıp tekrar açmam felan gerekiyor
Telefonun bluetooth konusunda daha pasif davrandıgını düşünüyorum sürekli yayın yapmak yerine dinlemede kalıp bir uyandırma komutu bekliyor olabilir

En azından ben tasarlasam öyle tasarlardım ama tabi bluetooth standardını arastırmak gerek
 
  • Beğen
Reactions: nt
Denemeleriniz sırasında telefon ne durumda oluyor

Telefon bluetooth cihaz arama modunda ikem kodunuzu çalıştırmayı denediniz mi

Ve son olarak telefonunuz android mi yoksa ios mu
 
Denemeleriniz sırasında telefon ne durumda oluyor

Telefon bluetooth cihaz arama modunda ikem kodunuzu çalıştırmayı denediniz mi

Ve son olarak telefonunuz android mi yoksa ios mu
Telefonum Androidarama.modu devamlı aktif zaten ama.telefon esp32 ile etkinlestirildi uyarısı geliyor serial monitörde bağlandı uyarısı veriyor. Fakat telefon Bluetooth kapanıp açıldığında yada kapsama alanından çıkıp girdiğinde esp32 otomatik bağlanmıyor. Esp32 Bluetooth server servisini yeniden de baslatsamda yine bağlanmıyor.
 
şu kodu dener misiniz kütüphaneler olmadıgından derleyemedim
C++:
#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>
#include <ESP32Servo.h>
#include <EEPROM.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;

bool doorIsOpen = false;
deviceConnected = false;   // kopma sorunu için eklendi

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) {
    deviceConnected = true; // kopma sorunu için eklendi
    Serial.println("Cihaz bağlandı");

    // Cihaz bağlandığında kapının durumunu kontrol et
    if (!doorIsOpen) {
      Serial.println("Kapı kilitli. Otomatik olarak '1234' mesajı gönderiliyor...");

      // "1234" mesajını otomatik olarak gönder
      pCharacteristic->setValue("1234");
      pCharacteristic->notify();
      Serial.println("Otomatik '1234' mesajı gönderildi.");

      // Kapıyı aç
      openDoor();
      Serial.println("Kapı açık");
    } else {
      Serial.println("Kapı zaten açık. İşlem yapılmayacak.");
      // Buraya başka bir işlem ekleyebilirsiniz.
    }
  }

  void onDisconnect(BLEServer *pServer) {
      deviceConnected = false; // kopma sorunu için eklendi
      Serial.println("Cihaz bağlantısı kesildi");
      pServer->getAdvertising()->start();  // kopma sorunu için eklendi
 
  }
};

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) {
          openDoor();
          Serial.println("Kapı açık");
        } else {
          Serial.println("Kapı zaten açık. İşlem yapılmadı.");
        }
      }
    }
  }
};

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();

  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 (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);
}
 
şu kodu dener misiniz kütüphaneler olmadıgından derleyemedim
C++:
#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>
#include <ESP32Servo.h>
#include <EEPROM.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;

bool doorIsOpen = false;
deviceConnected = false;   // kopma sorunu için eklendi

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) {
    deviceConnected = true; // kopma sorunu için eklendi
    Serial.println("Cihaz bağlandı");

    // Cihaz bağlandığında kapının durumunu kontrol et
    if (!doorIsOpen) {
      Serial.println("Kapı kilitli. Otomatik olarak '1234' mesajı gönderiliyor...");

      // "1234" mesajını otomatik olarak gönder
      pCharacteristic->setValue("1234");
      pCharacteristic->notify();
      Serial.println("Otomatik '1234' mesajı gönderildi.");

      // Kapıyı aç
      openDoor();
      Serial.println("Kapı açık");
    } else {
      Serial.println("Kapı zaten açık. İşlem yapılmayacak.");
      // Buraya başka bir işlem ekleyebilirsiniz.
    }
  }

  void onDisconnect(BLEServer *pServer) {
      deviceConnected = false; // kopma sorunu için eklendi
      Serial.println("Cihaz bağlantısı kesildi");
      pServer->getAdvertising()->start();  // kopma sorunu için eklendi
 
  }
};

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) {
          openDoor();
          Serial.println("Kapı açık");
        } else {
          Serial.println("Kapı zaten açık. İşlem yapılmadı.");
        }
      }
    }
  }
};

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();

  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 (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);
}
Tamam hocam bilgisayar geçince deneyeyim.
 
kodu revize ettim pin, mac adresi gibi yerleri güncellersin kod bluetooth algılandıgında çalışcak şekilde

Python:
import time
from machine import Pin, PWM
import ubluetooth as bluetooth

servo_pin = 2
servo = PWM(Pin(servo_pin), freq=50)
acma_buton_pin = 4
kapama_buton_pin = 5
acma_butonu = Pin(acma_buton_pin, Pin.IN, Pin.PULL_UP)
kapama_butonu = Pin(kapama_buton_pin, Pin.IN, Pin.PULL_UP)
bluetooth_baglantisi = None
bluetooth_algilandi = False

def kapıyı_ac():
    servo.duty(40)
    time.sleep(3)
    servo.duty(0) 
    time.sleep(1)
    servo.duty(80)

def kapıyı_kapat():
    servo.duty(80)
    time.sleep(2)

def bluetooth_bağlan():
    global bluetooth_baglantisi
    while not bluetooth_baglantisi:
        try:
            bluetooth_baglantisi = bluetooth.BLE()
            bluetooth_baglantisi.active(True)
            print("blue ok")
        except OSError as e:
            pass

def main():
    global bluetooth_baglantisi, bluetooth_algilandi
    try:
        while True:
            if acma_butonu.value() == 0:
                kapıyı_ac()
            elif kapama_butonu.value() == 0:
                kapıyı_kapat()
            if not bluetooth_baglantisi:
                bluetooth_bağlan()
            if bluetooth_baglantisi:
                try:
                    bluetooth_baglantisi.gap_advertise(100, b'\x02\x01\x02\x06\x03\x03\x19\x01\x03\x03\x0a')                 
                    while True:
                        event = bluetooth_baglantisi.events().get()
                        if event:
                            event_type, event_data = event
                            if event_type == bluetooth.EVT_GAP_ADVERTISING_REPORT:
                                bluetooth_algilandi = True
                                break
                        if bluetooth_algilandi:
                            kapıyı_ac()
                            bluetooth_algilandi = False
                except OSError:
                    bluetooth_baglantisi = None
    except Exception as e:
        print("hata:", e)
    finally:
        servo.deinit()
        if bluetooth_baglantisi:
            bluetooth_baglantisi.stop_advertising()

if __name__ == "__main__":
    main()
buradaki "if event_type == bluetooth.EVT_GAP_ADVERTISING_REPORT:" tam olarak bunun için
baglantı kopacak kadar uzaklaşıp geri geldiğimde otomatik bağlanmıyor kulaklıgı kapatıp tekrar açmam felan gerekiyor
 

Çevrimiçi üyeler

Forum istatistikleri

Konular
6,985
Mesajlar
119,304
Üyeler
2,835
Son üye
alpermete

Son kaynaklar

Son profil mesajları

hakan8470 wrote on Dede's profile.
1717172721760.png
Dedecim bu gul mu karanfil mi? Gerci ne farkeder onu da anlamam. Gerci bunun anlamini da bilmem :gulus2:
Lyewor_ wrote on hakan8470's profile.
Takip edilmeye başlanmışım :D ❤️
Merhaba elektronik tutsakları...
Lyewor_ wrote on taydin's profile.
Merhabalar. Elektrik laboratuvarınız varsa bunun hakkında bir konunuz var mı acaba? Sizin laboratuvarınızı merak ettim de :)
Lyewor_ wrote on taydin's profile.
Merhabalar forumda yeniyim! Bir sorum olacaktı lcr meterler hakkında. Hem bobini ölçen hemde bobin direnci ölçen bir lcr meter var mı acaba?
Back
Top