7 min read 40 - 55 min practice

ESP32 Project 7 - Bluetooth

Hallo semuanya, jumpa lagii, pada project ke tujuh ini kita akan mencoba bereksperimen menggunakan Bluetooth Classic (BT) dan Bluetooth Low Energy (BLE). Referensi yang digunakan pada project ini adalah Bluetooth Classic (BT) dan Bluetooth Low Energy (BLE).

Bluetooth Classic (BT)

dirancang untuk aliran data yang terus menerus contohnyaa transfer file yang cukup besar atau audio (speaker/headset yang selalu aktif). Nah, pada ESP32, menggunakan profil SPP (Serial Port Profile) yang membuat Bluetooth bekerja seperti kabel data. Untuk eksperimen kali ini kita akan mengontrol lampu LED melalui Bluetooth Classic dari HP.

Komponen

Komponen yang digunakan adalah sebagai berikut

  1. Board ESP32
  2. Breadboard
  3. Lampu LED 1 buah
  4. Resistor 200 Ohm 1 buah
  5. Kabel Jumper
  6. HP Android dengan aplikasi “Serial Bluetooth Teriminal

Rangkaian

Berikut rancangan rangkaian yang digunakan

Gambar rancangan rangkaian
Gambar rancangan rangkaian

Berikut hasil rangkaian yang dilakukan

Gambar hasil rangkaian
Gambar hasil rangkaian

Persiapan HP Android

Untuk menjalankan eksperimen ini kita memerlukan aplikasi bluetooth terminal di HP Android ini, silahkan cari dan install aplikasi “Serial Bluetooth Teriminal” melalui google playstore.

Gambar aplikasi serial bluetooth terminal di playstore

Gambar aplikasi serial bluetooth terminal di playstore

Code

Berikut adalah kode yang digunakan untuk ekperimen pertama ini:

#include "BluetoothSerial.h"

String device_name = "ESP32-BT";

#if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)
#error Bluetooth is not enabled! Please run `make menuconfig` to and enable it
#endif

#if !defined(CONFIG_BT_SPP_ENABLED)
#error Serial Port Profile for Bluetooth is not available or not enabled. It is only available for the ESP32 chip.
#endif

BluetoothSerial SerialBT;

const int ledPin = 23;

void setup() {
  Serial.begin(115200);

  // Memberikan jeda agar Serial Monitor siap
  delay(1000);

  if(!SerialBT.begin(device_name)){
    Serial.println("Gagal memulai Bluetooth!");
    Serial.println("Silahkan matikan dan nyalakan kembali perangkat ESP32");
  } else {
    Serial.println("--- Memulai Sistem ---");
    Serial.println(("ESP32 BT Test"));
    Serial.println("Eksperimen menyalakan lampu LED dengan Bluetooth Classic");
    Serial.println("Bluetooth Berhasil Aktif");
  }

  pinMode(ledPin, OUTPUT);
}

void loop() {
  // Menerima pesan dari BT HP
  if (SerialBT.available()) {
    char data = SerialBT.read(); // Membaca satu karakter

    if (data == '1') {
      digitalWrite(ledPin, HIGH);
      Serial.println("LED on");
      SerialBT.println("LED dinyalakan via Classic");
    }
    else if (data == '0') {
      digitalWrite(ledPin, LOW);
      Serial.println("LED off");
      SerialBT.println("LED dimatikan via Classic");
    }
  }
  delay(20);
}

Silahkan upload kode tersebut dan mari kita coba

Gambar serial monitor BT sudah aktif
Gambar serial monitor BT sudah aktif

Uji Coba Turn On/OFF LED

Saat nya kita coba menyalakan lampu LED dengan BT dari HP Android kita, langkahnya adalah sebagai berikut:

  1. Install aplikasi “Serial Bluetooth Terminal” dari Google Playstore
  2. Buka aplikasi tersebut, pilih menu Devices > Bluetooth Classic lalu cari nama bluetooth board ESP32 kita, dalam hal ini saya namai ESP32test. Pastikan mengaktifkan fitur bluetooth pada HP kita.
  3. Kembali pada beranda aplikasi di “Serial Bluetooth Terminal”, akan muncul pesan “Connected” dan ikon connected pada menu atasnya.
IMG-20260305-WA0026IMG-20260305-WA0025IMG-20260305-WA0024

Gambar rangkaian setting aplikasi Serial Bluetooth Teriminal

  1. Silahkan coba ketik angka “1” untuk menyalakan lampu LED dan angka “0” untuk mematikan lampu LEDnya

Video uji coba menyalakan lampu LED dengan BT

Bluetooth Low Energy (BLE)

didesain untuk hemat energy dengan sistem Client-Server dan GATT (Generic Attribute Profile). Aliran data pada sistem kerja BLE tidak mengalir terus menerus, melainkan menampilkan data pada karakteristik tertentu. Pada eksperimen kali ini kita akan melakukan pembacaan sensor BMP180 via BLE yang ditampilkan pada smartphone kita.

Client-Server

Pada BLE, terdapat pembagian dua peran berikut:

  • Server (ESP32), berpern seperti penyedia data, seperti mengiklankan atau advertising keberadaannya agar bisa ditemukan, Contoh ESP32 yang terhubung ke sensor suhu.
  • Client (HP atau ESP32 lainnya), berperan sebagai pencari data, melakukan pemindaian atau scanning untuk menemukan server lalu menghubungkan agar membaca datanya.

GATT (Generic Attributes)

BLE menggunakan struktur hirarki yang disebut GATT untuk mengatur bagaimana informasi itu dikirim. Teman2 bisa bayangkan sebuah lemari arsip:

  • Profile, lemari utamanya (contoh profile ruangan)
  • Service, laci dalam lemari (contoh layanan suhu ruangan)
  • Characteristic, map dalam laci yang berisi data (contoh angka suhu ruangan)

UUID (Universally Unique Identifier)

Nah untuk setiap service dan karakteristik memiliki UUID, agar perangkat client tidak tertukar saat mencari data.

Komponen

Komponen yang digunakan pada eksperimen kali ini adalah:

  1. Board ESP32
  2. Breadboard
  3. Sensor BMP180
  4. Kabel Jumper 4 buah
  5. HP Android dengan aplikasi “nRF Connect

Rangkaian

Rangkaian yang digunakan pada eksperimen kali ini adalah:

Gambar rancangan rangkaian
Gambar rancangan rangkaian

Berikut adalah hasil rangkaian yang dilakukan:

Gambar hasil rangkaian
Gambar hasil rangkaian

Persiapan HP Android

Pada eksperimen kedua ini kita menggunakan aplikasi nRF Connect berbeda dengan eksperimen yang pertama, silahkan install melalui goole playsotre. Aplikasi nRF Connect ditujukan untuk pengembangan (development), pengujian, dan debugging perangkat Bluetooth Low Energy (BLE) [Google Playstore], sedangkan Serial Bluetooth Terminal ditujukan untuk komunikasi data serial sederhana antara smartphone dan perangkat Bluetooth Klasik (SPP - Serial Port Profile) dan BLE (via UART Service) [Google Playstore].

Gambar aplikasi nRF Connect
Gambar aplikasi nRF Connect

Code

Jika teman2 langsung lompat pada project tujuh ini, ada beberapa library yang perlu diinstall, tata cara installnya ada pada project sebelumnya ya. Library yang perlu diinstall yaitu Adafruit BMP085.

Sebernya sudah ada banyak contoh kode yang sudah disediakan, teman2 bisa lihat langsung melalui menu File > Examples > BLE disitu ada belasan kode yang bisa kita uji coba. Code yang saya gunakan merupakan modifikasi dari kode example yang notify dengan menambahkan dua karakteristik yaitu nilai temperatur dan tekanan pada sensor BMP180, berikut adalah kode yang telah dimodifikasi

#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>

#include <Wire.h>
#include <Adafruit_BMP085.h>  // Library tambahan untuk sensor suhu

// Konfigurasi Sensor
Adafruit_BMP085 bmp;

BLEServer *pServer = NULL;
BLECharacteristic *pTemperatureCharacteristic = NULL;
BLECharacteristic *pPressureCharacteristic = NULL;

bool deviceConnected = false;
bool oldDeviceConnected = false;

// UUID
#define SERVICE_UUID "4fafc201-1fb5-459e-8fcc-c5c9c331914b"

#define TEMP_CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"
#define PRES_CHARACTERISTIC_UUID "1c93d5ad-323d-4950-8433-2884218820c4"

class MyServerCallbacks : public BLEServerCallbacks {
  void onConnect(BLEServer *pServer) {
    deviceConnected = true;
  };
  void onDisconnect(BLEServer *pServer) {
    deviceConnected = false;
  }
};

void setup() {
  Serial.begin(115200);
  // Inisialisasi sensor suhu
  if (!bmp.begin()) {
    Serial.println("Could not find a valid BMP085/BMP180 sensor, check wiring!");
    while (1) {}
  }

  // Inisialisasi Device
  BLEDevice::init("ESP32_Sensor");

  // Setup Server
  pServer = BLEDevice::createServer();
  pServer->setCallbacks(new MyServerCallbacks());

  // Setup Service
  BLEService *pService = pServer->createService(SERVICE_UUID);

  // 1. Karakteristik Suhu
  pTemperatureCharacteristic = pService->createCharacteristic(
    TEMP_CHARACTERISTIC_UUID,
    BLECharacteristic::PROPERTY_READ | BLECharacteristic::PROPERTY_NOTIFY);
  pTemperatureCharacteristic->addDescriptor(new BLE2902());

  // 2. Karakteristik Tekanan
  pPressureCharacteristic = pService->createCharacteristic(
    PRES_CHARACTERISTIC_UUID,
    BLECharacteristic::PROPERTY_READ | BLECharacteristic::PROPERTY_NOTIFY);
  pPressureCharacteristic->addDescriptor(new BLE2902());

  pService->start();

  // Mulai Advertising
  BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
  pAdvertising->addServiceUUID(SERVICE_UUID);
  pAdvertising->setScanResponse(false);
  pAdvertising->setMinPreferred(0x0);
  BLEDevice::startAdvertising();
  Serial.println("Menunggu koneksi untuk mengirim data sensor...");
}

void loop() {
  if (deviceConnected) {
    // Membaca suhu dari sensor
    float t = bmp.readTemperature();
    float p = bmp.readPressure();

    // Cek apakah pembacaan sensor berhasil
    if (isnan(t) || isnan(p)) {
      Serial.println("Gagal membaca sensor!");
    } else {
      // Kirim Suhu
      String tStr = String(t, 2);
      pTemperatureCharacteristic->setValue(tStr.c_str());
      pTemperatureCharacteristic->notify();

      // Kirim Tekanan
      String pStr = String(p, 0);  // Tekanan biasanya bulat (Pa)
      pPressureCharacteristic->setValue(pStr.c_str());
      pPressureCharacteristic->notify();

      Serial.printf("Terkirim -> Suhu: %s C, Tekanan: %s Pa\n", tStr.c_str(), pStr.c_str());
    }

    // Kirim data setiap 2 detik
    delay(2000);
  }

  // Logika Re-Advertising jika terputus
  if (!deviceConnected && oldDeviceConnected) {
    delay(500);
    pServer->startAdvertising();
    Serial.println("Koneksi terputus, mulai advertising ulang...");
    oldDeviceConnected = deviceConnected;
  }

  if (deviceConnected && !oldDeviceConnected) {
    oldDeviceConnected = deviceConnected;
  }
}

Silahkan upload kode tersebut dan mari kita coba

Gambar serial monitor hasil status bluetooth low energy
Gambar serial monitor hasil status bluetooth low energy

Uji Coba Scan ESP32-BLE Sensor

Saat nya kita coba lakukan scan Server ESP32 BLE melalui HP Android kita, langkahnya adalah sebagai berikut:

  1. Install aplikasi “nRF Connect” dari Google Playstore

  2. Buka aplikasi tersebut, pilih tab menu SCANNER lalu klik tombol SCAN, cari nama Bluetooth ESP32_Sensor. Selanjutnya klik “CONNECT”. Jangan lupa mengaktifkan fitur bluetooth pada HP kita.

IMG-20260305-WA0026IMG-20260305-WA0025

Gambar koneksi ke ESP32 BLE

  1. Pada tab ESP32_Sensor, terdapat Unknown Service dengan dua Characteristic, silahkan klik tombol download agar selalu mendapatkan notifikasi data sensor dari perangkat ESP32 kita.
Gambar download karakteristik dengan mengaktifkan notify
Gambar download karakteristik dengan mengaktifkan notify

Beirkut adalah rekaman uji coba scan ESP32-BLE sensor melalui perangkat HP Android denga aplikasi nRF Connect

Video uji coba scan ESP32-BLE Sensor

Sebagai catatan, terdapat kendala saat uji coba BLE ini yaitu:

  1. Karena sudah beberapa kali uji coba kode contoh BLE dengan satu karakteristik lalu saat menambahkan menjadi dua karakteristik, di aplikasi nRF Connectnya hanya terdeteksi satu karakteristik saja, solusinya adalah reset bluetooth di HP kemudian hapus tab sensor yang sudah terhubung di aplikasi nRF Connect, atau sederhananya silahkan hapus cache di nRF Connect.
  2. Pernah uji coba menggunakan deep sleep mode agar perangkat ESP32 kita super hemat daya, namun menjadi kelemahan karena di pengaturan hp androidnya perlu connect secara manual, namun hal ini ternyata bisa diakali dengan auto connect dari aplikasi nRF Connectnya.

Oke sampai sini dulu aja ya laporannya, terimakasih sudah mampir kesini!

Bagaimana tanggapan Anda tentang tulisan ini?

Kembali ke daftar tulisan