Esp32 Bluetooth yardım.

ş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);
}
deviceConnected = false; // kopma sorunu için eklendi kodunda bool eklide değildi. ekledim ama yine aynı ESP32 yayın yapıyor telefondan bulup bağlan dediğinde işlem başlatılıyor . bağlantı kesildikten sonra tekrar bağlanmıyor.
1709535747083.png
 
deviceConnected = false; // kopma sorunu için eklendi kodunda bool eklide değildi. ekledim ama yine aynı ESP32 yayın yapıyor telefondan bulup bağlan dediğinde işlem başlatılıyor . bağlantı kesildikten sonra tekrar bağlanmıyor. 31414 eklentisine bak
Bir de o tanımlama satırını silip dener misin derliyor mu

Ben de internetten bakarak uyarladım o değişkeni biz kullanmıyoruz ama kutuphane ile ilgili diye yorumladım
Önemli olan
pServer->getAdvertising()->start();
Bu komut kopmadan sonra gerekli olan advertising prosesini başlatıyor
 
Ben mi bir şeyi kaçırıyorum anlamadım?
void setup içine yazılan tüm kodlar sadece ilk açılışta çalışır. Birdaha da reset atana kadar çalışmaz.
void loop içindeki kodlar sürekli döngü halinde tekrar eder.
Şimdi kodlara bakıyorum her şey void setup içinde. void loop içinde sadece kapı kontrolü var.
Bu cihaz bağlantı koptuğunu nasıl anlayacak? Tekrar bağlanmak için nasıl komut çalıştıracak?
 
Ben mi bir şeyi kaçırıyorum anlamadım?
void setup içine yazılan tüm kodlar sadece ilk açılışta çalışır. Birdaha da reset atana kadar çalışmaz.
void loop içindeki kodlar sürekli döngü halinde tekrar eder.
Şimdi kodlara bakıyorum her şey void setup içinde. void loop içinde sadece kapı kontrolü var.
Bu cihaz bağlantı koptuğunu nasıl anlayacak? Tekrar bağlanmak için nasıl komut çalıştıracak?
Setupdaki kodlar ayar ve init işleri için setupın da üstünde void ile başlayan fonksyonlar var onlar çağrıldığında çalişir ama onları kim çağırıyor bilmiyorum kutuphaneler ile ilgişi sanıyorum
 
eğer yine çalişmassa on disconnect fonsyonunda eklediğim yer yerine
BLEDevice::startAdvertising();

Eklemeyi dene
 
Bir de o tanımlama satırını silip dener misin derliyor mu

Ben de internetten bakarak uyarladım o değişkeni biz kullanmıyoruz ama kutuphane ile ilgili diye yorumladım
Önemli olan
pServer->getAdvertising()->start();
Bu komut kopmadan sonra gerekli olan advertising prosesini başlatıyor
bool deviceConnected = false; // Kopma sorunu için eklendi/ kaldırıldıktan sonra derleme yapılamıyor.
 
eğer yine çalişmassa on disconnect fonsyonunda eklediğim yer yerine
BLEDevice::startAdvertising();

Eklemeyi dene
satırı kladırıp disconnet alanına BLEDevice::startAdvertising(); eklediğimde derleme yaptı ama yine bağlantı kesildikten sonra otomatik bağlanmıyor. ble servisini çalıştırsa dahi hangi cihaza bağlanmak istediğini bildirmesi gerekli bunu MAC adresi ile yapmaya çalıştım oda olmadı. UUID diye bir olay var ama fazla bir bilgi bulamadım.Acaba MAC adres yerine oyle birşey olur mu.
 
satırı kladırıp disconnet alanına BLEDevice::startAdvertising(); eklediğimde derleme yaptı ama yine bağlantı kesildikten sonra otomatik bağlanmıyor. ble servisini çalıştırsa dahi hangi cihaza bağlanmak istediğini bildirmesi gerekli bunu MAC adresi ile yapmaya çalıştım oda olmadı. UUID diye bir olay var ama fazla bir bilgi bulamadım.Acaba MAC adres yerine oyle birşey olur mu.
Bluetooth un kendi sitesinde makaleler var orayı arastırabilirsin belki işe yarar bilgiler çıkar
Esp ve bluetooth ile pek uğraşmadım konuya cok hakim değlim
 
peki şöyle bir şey olur mu bletooth değilde kartın WİFİ özelliğine çevirsem kartın WİFİ ağına bağlandığında komutlar devreye girse. kod üzerinde değişiklikleri yaptım denedim ama cihaz da veri olmadığından yani internet telefon doğal olarak interneti olmayan WİFİ seçmiyor.
 
peki şöyle bir şey olur mu bletooth değilde kartın WİFİ özelliğine çevirsem kartın WİFİ ağına bağlandığında komutlar devreye girse. kod üzerinde değişiklikleri yaptım denedim ama cihaz da veri olmadığından yani internet telefon doğal olarak interneti olmayan WİFİ seçmiyor.
telefonun lişisel erişim noktasını açıp esp ile taryabilirsiniz ama telefonun pilini çabuk bitirecektir

Bluetooth altında daha uygun çözümler olmalı mutlaka
Mesela şu kaynağa bakabilirsin

 
telefonun lişisel erişim noktasını açıp esp ile taryabilirsiniz ama telefonun pilini çabuk bitirecektir

Bluetooth altında daha uygun çözümler olmalı mutlaka
Mesela şu kaynağa bakabilirsin

makaleyi inceledim örneğide çalıştırmaya çalıştım ama video altına da yorumlarda belirtmişler derleme hatası veriyor.
 
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

Bu kodu derledim. Ben sadece bağlantı kopması ve yeniden bağlanma bakımından test ettim. Bağlantı testlerinde bir sorun göremedim. Hatta veri de gönderdim. Cihaz yeniden bağlanmakta sorun yaşamıyor.

Zaten senin senaryoda yeniden bağlanacak olan mobil uygulama tarafı. Bu nedenle bağlantın koptuğunu anladığında, tekrar aramaya başlamalı ve bulduğunda tekrar bağlanmalısın. Mobil uygulama tarafında özellikle Android bu işte tam bir işkence. Fakat yinede sorunlar önemli ölçüde çözülebiliyor.

Sanıyorum çok fazla şey denediğin için kod yapın biraz karışmış. Bu karışıklık da seni yanıltıyor olabilir.
 
Bu kodu derledim. Ben sadece bağlantı kopması ve yeniden bağlanma bakımından test ettim. Bağlantı testlerinde bir sorun göremedim. Hatta veri de gönderdim. Cihaz yeniden bağlanmakta sorun yaşamıyor.

Zaten senin senaryoda yeniden bağlanacak olan mobil uygulama tarafı. Bu nedenle bağlantın koptuğunu anladığında, tekrar aramaya başlamalı ve bulduğunda tekrar bağlanmalısın. Mobil uygulama tarafında özellikle Android bu işte tam bir işkence. Fakat yinede sorunlar önemli ölçüde çözülebiliyor.

Sanıyorum çok fazla şey denediğin için kod yapın biraz karışmış. Bu karışıklık da seni yanıltıyor olabilir.
hocam mobil uygulama ile bağlanıyorum zaten sorun yok. ben uygulama kullanmadan telefonum kulaklık nasıl otomatik bağlanıyorsa telefon telefon esp32 kapsama alanına girdiginde otomatik bağlansın istiyorum
 
Eşleşmiş cihaz kapsama alanına girdiğinde tekrar erişilebilir. Senin cihaz da bunu sağlıyor.

Kulaklık gibi cihazların servisleri bunu otomatik yapıyor. Senin mobil uygulaman da aynı şekilde kapsama alanına girdiğinde tekrar ilgili sevise otomatik bağlanmalı.

Daha öncede söylediğim gibi projende BLE kullanırsan, eşleştirme ile hiç uğraşman gerekmez. Bu projeyi ben yapacak olsam öyle ilerlerdim. Şu aşamada o kısım gereksiz.

Ben test uygulamasını şu şekilde ayarladığımda tekrar bağlantıda sorun yaşamadım.


1709633093390.png
 
Eşleşmiş cihaz kapsama alanına girdiğinde tekrar erişilebilir. Senin cihaz da bunu sağlıyor.

Kulaklık gibi cihazların servisleri bunu otomatik yapıyor. Senin mobil uygulaman da aynı şekilde kapsama alanına girdiğinde tekrar ilgili sevise otomatik bağlanmalı.

Daha öncede söylediğim gibi projende BLE kullanırsan, eşleştirme ile hiç uğraşman gerekmez. Bu projeyi ben yapacak olsam öyle ilerlerdim. Şu aşamada o kısım gereksiz.

Ben test uygulamasını şu şekilde ayarladığımda tekrar bağlantıda sorun yaşamadım.


31474 eklentisine bak
Bilgi için teşekkürler hocam bende bunu böyle yapabildim fakat uygulama telefonda sonlandırıldigina otomatik bağlanmıyor illaki uygulamanin içerisine girip connect demek gerekli. Mesela uygulama akıllı saatime otomatik bağlanıyor ama esp32 için outo connet bile seçili olsa baglanmiyor
 
Uygulama sonlandığında, telefon hangi servise otomatik bağlanacak?
 

Forum istatistikleri

Konular
5,841
Mesajlar
99,630
Üyeler
2,480
Son üye
mozcelikors

Son kaynaklar

Son profil mesajları

gruptaki arkadaşlara selamlar. sıteyi bu gün fark ettim. Asansör için 2x7 segment LCD gösterge üretmek istiyorum. acaba bu sayfadaki arkadaşlardan destek alabilirmiyim. LCD nin mantık açılımı ektedir.
deneyci wrote on TA3UIS's profile.
Selam.
Amatör telsiz lisansı nasıl alınıyor?
Lisansı olmayanı forumlarına almıyorlar. :)
Bilgi alamıyoruz.
cemalettin keçeci wrote on HaydarBaris's profile.
barış kardeşim bende bu sene akıllı denizaltı projesine girdim ve sensörleri arastırıyorum tam olarak hangi sensör ve markaları kullandınız yardımcı olabilir misin?
m.white wrote on Altair's profile.
İyi akşamlar.Arabanız ne marka ve sorunu nedir.Ben araba tamircisi değilim ama tamirden anlarım.
* En mühim ve feyizli vazifelerimiz millî eğitim işleridir. Millî eğitim işlerinde mutlaka muzaffer olmak lâzımdır. Bir milletin hakikî kurtuluşu ancak bu suretle olur. (1922)
Back
Top