ESP32 Projeleri
#15Orta

Bluetooth Classic A2DP ile Kablosuz Ses Akışı Alıcısı

~1 saatYok

Proje Amacı

ESP32'yi bir Bluetooth hoparlör gibi davranan A2DP (Advanced Audio Distribution Profile) alıcısına dönüştürüp, telefondan gelen kablosuz ses akışını I2S dijital ses arayüzü üzerinden bir harici DAC/amplifikatöre aktarmayı öğretir. ESP32'nin dahili Bluetooth Classic (BR/EDR) radyosu A2DP profilini donanımsal olarak destekler ve I2S çevre birimi, gelen ses verisini örnekleme hatası olmadan gerçek zamanlı olarak harici bir DAC'a aktarabilir. Bu ses akışı Arduino Uno'da işlenemez: ne Bluetooth Classic radyosu ne de I2S çevre birimi bulunur; Uno'nun tek ses çıkışı seçeneği tone() ile basit kare dalga üretmektir, gerçek zamanlı bir ses akışını işleyemez.

Gerekli Malzemeler

  • ESP32 DevKit V1 (38 pin)
  • PCM5102 I2S DAC modülü (veya MAX98357A I2S amplifikatör)
  • Küçük hoparlör (MAX98357A kullanılıyorsa doğrudan, PCM5102 kullanılıyorsa aktif hoparlör/kulaklık)
  • Breadboard
  • Jumper kablolar

Gerekli Kütüphaneler

ESP32-A2DP by pschatzmann (Library Manager'dan kurulabilir, sürüm >= 1.7). BluetoothA2DPSink sınıfı I2S çıkışını otomatik yönetir, ayrı bir I2S kütüphanesi gerekmez.

Pin Bağlantıları

Bileşen PiniBağlantı
I2S BCLK
GPIO26
I2S LRC (WS)
GPIO25
I2S DIN (DOUT)
GPIO22
DAC/Amplifikatör VCC
5V (VIN)
DAC/Amplifikatör GND
GND

Devre Şeması

ESP32 Kodu

esp32-15-bluetooth-classic-a2dp-ile-kablosuz-ses-akisi-alicisi.ino
1#include <BluetoothA2DPSink.h>
2
3BluetoothA2DPSink a2dpAlici;
4
5void sarkiBilgisiDegisti(const uint8_t* veri, uint32_t uzunluk) {
6 Serial.println("Şarkı meta verisi güncellendi.");
7}
8
9void setup() {
10 Serial.begin(115200);
11
12 i2s_pin_config_t i2sPinleri = {
13 .bck_io_num = 26,
14 .ws_io_num = 25,
15 .data_out_num = 22,
16 .data_in_num = I2S_PIN_NO_CHANGE
17 };
18 a2dpAlici.set_pin_config(i2sPinleri);
19
20 a2dpAlici.set_avrc_metadata_callback(sarkiBilgisiDegisti);
21 a2dpAlici.start("DevreAI-Hoparlor"); // telefonun Bluetooth listesinde görünecek isim
22
23 Serial.println("Bluetooth A2DP alıcı hazır. Telefonunuzdan 'DevreAI-Hoparlor'a bağlanın.");
24}
25
26void loop() {
27 delay(1000); // ses işleme tamamen kütüphane içinde arka planda (ayrı görevde) yürütülür
28}

Çalışma Açıklaması

ESP32-A2DP kütüphanesi Bluetooth Classic (BR/EDR) kullanır, BLE (proje #12'deki) ile karıştırılmamalıdır — ikisi aynı anda çalışabilir ama ayrı stack'lerdir ve toplam RAM kullanımı yüksektir. MAX98357A kullanıyorsanız DAC'a ek olarak dahili amplifikatör içerdiği için hoparlörü doğrudan sürebilir; PCM5102 ise sadece analog çıkış verir, bu durumda ayrı bir amplifikatör veya aktif hoparlör/kulaklık gerekir.

Test Bilgisi

Kodu yükleyin, telefonunuzun Bluetooth ayarlarından 'DevreAI-Hoparlor' cihazını bulup eşleştirin (ses cihazı olarak). Herhangi bir müzik veya video uygulamasından ses çalın; DAC/amplifikatöre bağlı hoparlörden net, kesintisiz ses duyulmalı. Telefonda ses seviyesini değiştirip hoparlör çıkışının buna göre değiştiğini doğrulayın; ayrıca telefonu farklı odalara götürerek Bluetooth'un tipik menzil sınırını (yaklaşık 10 metre) gözlemleyebilirsiniz.

Olası Sorunlar ve Çözümleri

Ses hiç gelmiyor ama Bluetooth bağlandıysa: I2S pin numaralarının (26/25/22) DAC modülünüzün BCK/LRCK/DIN etiketleriyle doğru eşleştiğinden emin olun, modüle göre etiketler değişebilir. Ses kesik kesik veya cızırtılı geliyorsa: ESP32'nin WiFi'si de aktifse (bu projede kullanılmıyor ama başka kodla birleştirilirse) Bluetooth ile radyo zaman paylaşımı ses kalitesini düşürebilir, mümkünse WiFi.mode(WIFI_OFF) ekleyin. Telefon cihazı Bluetooth listesinde hiç göstermiyorsa: BluetoothA2DPSink kütüphanesinin ESP32 core'un Bluetooth Classic desteğini gerektirdiğini ve bunun bazı 'sadece BLE' partition şemalarıyla çakışabileceğini kontrol edin, 'Default' partition şemasını deneyin.

Alternatif Çözümler

set_avrc_metadata_callback ile şarkı adı ve sanatçı bilgisi alınıp bir OLED ekranda (proje #10'daki gibi) gösterilebilir. a2dpAlici.set_volume() ile yazılımsal ses seviyesi kontrolü eklenip fiziksel bir potansiyometre veya buton ile ayarlanabilir hale getirilebilir. A2DP sink yerine A2DP source moduna geçilerek ESP32'nin kendisi bir ses kaynağından (örn. SD karttan) telefona veya hoparlöre kablosuz müzik göndermesi sağlanabilir.

Bu projenin kodunu AI ile özelleştir

Farklı pin, ek özellik ya da başka bir sensör mü istiyorsun?

Benzer Projeler

Orta

OTA Kablosuz Firmware Güncelleme Sistemi

ESP32'nin dahili çift OTA (Over-The-Air) flash partisyon şemasını kullanarak, sahaya kurulmuş bir cihaza tekrar USB kablosu takmadan tamamen kablosuz şekilde yeni firmware yüklemeyi öğretir — özellikle tavana, duvara veya erişimi zor bir noktaya monte edilmiş onlarca cihazı yönetirken zaman ve emek kazandıran pratik bir yetenektir. ESP32'nin flash belleği kalkınma sırasında bir 'factory' bölümü ile iki ayrı OTA partisyonuna bölünebilir; cihaz yeni kodu ağdan indirip o an boş olan partisyona yazar, bütünlük kontrolünden geçerse oradan açılış yapar ve önceki çalışan sürüm otomatik olarak yedek konumunda kalır, böylece yarım kalan veya bozuk bir güncelleme cihazı kullanılamaz hale getirmez. Bu iki katmanlı flash mimarisi ESP32'ye özgüdür: Arduino Uno'nun ATmega328P'sinde toplam flash belleği zaten 32KB'dir ve sketch kodunun kendisi bu alanın büyük bölümünü kapladığından ikinci bir tam firmware kopyasına yer kalmaz; kartta WiFi donanımı da bulunmadığından ağ üzerinden güncelleme almak zaten söz konusu değildir.

Orta

TLS/SSL ile Şifreli MQTT Veri Yayını

Sıcaklık/nem verisini, sertifika tabanlı TLS/SSL şifrelemesiyle (WiFiClientSecure) bir MQTT broker'a güvenli şekilde yayınlamayı öğretir — düz metin (plaintext) MQTT'nin aksine veri yolda kimse tarafından okunamaz veya değiştirilemez. ESP32'nin donanımsal AES/SHA kripto hızlandırıcısı, TLS el sıkışmasını (handshake) makul bir sürede tamamlayacak işlem gücünü sağlar; 520KB SRAM'i ise TLS oturum arabelleklerini, sertifika zincirini ve şifreleme durumunu aynı anda bellekte tutabilir. Bu kapasite Arduino Uno'da bulunmaz: kartın sadece 2KB SRAM'i vardır ve tek bir TLS sertifikası bile bu belleğe sığmaz; kripto hızlandırma donanımı ve WiFi radyosu da zaten mevcut değildir, dolayısıyla şifreli bir ağ bağlantısı kurmanın önünde temel bir donanım sınırı vardır.

Orta

Watchdog + Otomatik Yeniden Bağlanma ile Endüstriyel Güvenilirlik

ESP-IDF'in görev bazlı donanımsal Task Watchdog Timer'ını (TWDT) kullanarak, ana döngü belirli bir süre 'nefes almazsa' (donarsa) cihazı otomatik olarak yeniden başlatmayı; ayrıca WiFi bağlantısı koptuğunda üstel geri çekilmeyle (exponential backoff) otomatik yeniden bağlanmayı öğretir — insansız çalışan sahadaki bir cihazın kendi kendini toparlaması için endüstriyel projelerde standart kabul edilen bir güvenilirlik desenidir. ESP32'nin FreeRTOS çekirdeği, her görevi (task) ayrı ayrı izleyebilen donanım destekli bir watchdog mekanizması sunar. Bu düzeyde bir izleme Arduino Uno'da kurulamaz: Uno'nun donanımsal watchdog'u (WDT) çok daha kaba bir genel zamanlayıcıdır, görev/task kavramı yoktur (bir RTOS çalıştıramaz) ve zaten yeniden bağlanacak bir WiFi bağlantısı da bulunmaz.