Bluetooth Classic dan Bluetooth Low Energy (BLE) adalah dua teknologi komunikasi nirkabel yang berbeda dengan kelebihan dan kekurangannya masing-masing. Bluetooth Classic ideal untuk aplikasi yang membutuhkan transfer data berkecepatan tinggi atau jangkauan yang luas, sedangkan BLE ideal untuk aplikasi yang membutuhkan konsumsi daya rendah.
Perbandingan Bluetooth Classic dan BLE: enter image description here


Bluetooth Classic

Bluetooth Classic adalah teknologi komunikasi nirkabel yang memungkinkan perangkat untuk saling terhubung dan berkomunikasi. Teknologi ini menggunakan frekuensi radio 2.4 GHz dan memiliki jangkauan hingga 10 meter. ESP32 dilengkapi dengan Wi-Fi, Bluetooth Hemat Energi, dan Bluetooth Klasik. Dalam tutorial ini, Anda akan mempelajari cara menggunakan ESP32 Bluetooth Classic dengan Arduino IDE untuk bertukar data antara ESP32 dan smartphone Android. kita akan coba mengontrol output ESP32, dan mengirimkan pembacaan sensor ke Smartphone Android menggunakan Bluetooth Classic.

Yang perlu disiapkan

  • ESP32 DOIT DEVKIT V1 Board
  • Android Smartphone with Bluetooth
  • 5mm LED
  • 330 Ohm resistor
  • DS18B20 temperature sensor
  • 4.7k Ohm resistor
  • Jumper wires
  • Breadboard

Aplikasi Serial Bluetooth

Silahkan download dan install aplikasi Serial Bluetooth pada Android Smartphone melalui play store enter image description here

Kode Program

Kita akan menggunakan kode program example yang sudah ada pada Arduino IDE, pastikan arduino IDE sudah di instalsi dan di konfigurasi, bisa di baca pada artikel project-01
Buka Arduino IDE Anda, dan buka File > Contoh > BluetoothSerial > SerialtoSerialBT enter image description here

//This example code is in the Public Domain (or CC0 licensed, at your option.)
//By Evandro Copercini - 2018
//
//This example creates a bridge between Serial and Classical Bluetooth (SPP)
//and also demonstrate that SerialBT have the same functionalities of a normal Serial

#include "BluetoothSerial.h"

//#define USE_PIN // Uncomment this to use PIN during pairing. The pin is specified on the line below
const char *pin = "1234"; // Change this to more secure PIN.

String device_name = "ESP32-BT-Slave";

#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 Bluetooth not available or not enabled. It is only available for the ESP32 chip.
#endif

BluetoothSerial SerialBT;

void setup() {
  Serial.begin(115200);
  SerialBT.begin(device_name); //Bluetooth device name
  Serial.printf("The device with name \"%s\" is started.\nNow you can pair it with Bluetooth!\n", device_name.c_str());
  //Serial.printf("The device with name \"%s\" and MAC address %s is started.\nNow you can pair it with Bluetooth!\n", device_name.c_str(), SerialBT.getMacString()); // Use this after the MAC method is implemented
  #ifdef USE_PIN
    SerialBT.setPin(pin);
    Serial.println("Using PIN");
  #endif
}

void loop() {
  if (Serial.available()) {
    SerialBT.write(Serial.read());
  }
  if (SerialBT.available()) {
    Serial.write(SerialBT.read());
  }
  delay(20);
}

Cara Kerja Program

Kode ini melakukan komunikasi serial Bluetooth dua arah antara dua perangkat. Kode dimulai dengan memasukkan Library Serial Bluetooth.

#include "BluetoothSerial.h"

Kemudian akan diperiksa bluetoothnya aktif atau belum, terlihat pada kode berikut.

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

Selanjutnya akan dibuat sebuah instance dari Serial Bluetooth yang menghubungi SerialBT:

BluetoothSerial SerialBT;

Perintah selanjutnya akan mempersiapkan isialisasi komunikasi serial pada baud rate 115200

Serial.begin(115200);

Inisialisasi perangkat serial Bluetooth disesuaikan dengan devices nama yang dibuat, secara default pada kode ini nama Bluetoothnya adalah ESP32test, tetapi kita bisa menggantinya sesuai keingingan kita.

SerialBT.begin("ESP32test"); //Bluetooth device name

Selanjutnya pada bagian loop maka akan di periksa apakah ada komunikasi pada port serial dengan perangkat yang terhubung

if (Serial.available()) {
  SerialBT.write(Serial.read());
}

SerialBT.write --> mengirim data menggunakan serial bluetooth.

Serial.write --> mengembalikan data yang diterima di port serial.

Terakhir akan di periksa apakah ada byte yang tersedia untuk dibaca di port Serial Bluetooth. Jika ada, maka akan ditampilkan ke Serial Monitor.

if (SerialBT.available()) {
  Serial.write(SerialBT.read());
}

Uji Coba

Untuk lebih mudah kita memahami cara kerjanya bisa kita lihat pada gambaranya sebagai berikut : .Pertama kita upload terlebih dahulu kode programnya enter image description here Setelah berhasil upload kita buka serial monitor dan pastikan baud ratenya adalah 115000. enter image description here

Blutooth sudah siap, selanjutnya kita koneksikan Blutooth pada smartphone dengan bluetooth pada ESP enter image description here

Selanjutnya status pada aplikasi serial bluetooth statusnya akan tampil seperti ini : enter image description here

Kemudian kita coba untuk saling berkominikasi dengan mengirimkan sinyal berupa text : kita ketikan Hello pada aplikasi serial bluetooth enter image description here

dan pada serial monitor akan tampil text yang kita kirimkan tersebut enter image description here

Kita ketikan lagi text pada serial monitor " Apa Kabar " enter image description here

Maka pada aplikasi serial blutooth akan tampil : enter image description here

Membaca Suhu melalui Serial Data

Setelah kita mencoba pertukaran data sederahana melalui serial bluetooh, kali ini kita coba melaukan pertukaran data dengan membaca suhu, dalam hal ini kita akan menambahkan sensor suhu DS18B20.

Gambar Skema

enter image description here

Instal Library DS180

OneWire Library

  • Klik di sini untuk mengunduh library One Wire .
  • Unzip filenya, Ganti nama Foldernya menjadi OneWire, dan kopikan ke Folder Instalasi Arduino IDE pada folder library

Library DallasTemperature

  • Klik di sini untuk mengunduh Library DallasTemperature .
  • Extract filenya dan rename foldernya menjadi DallasTemperature
  • Pindahkan folder DallasTemperature ke folder library instalasi Arduino IDE Anda

Terakhir, buka kembali Arduino IDE Anda

Kode

Upload Kode berikut

/*********
  Rui Santos
  Complete project details at https://randomnerdtutorials.com
*********/

// Load libraries
#include "BluetoothSerial.h"
#include <OneWire.h>
#include <DallasTemperature.h>

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

// Bluetooth Serial object
BluetoothSerial SerialBT;

// GPIO where LED is connected to
const int ledPin =  25;

// GPIO where the DS18B20 is connected to
const int oneWireBus = 32;          
// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(oneWireBus);
// Pass our oneWire reference to Dallas Temperature sensor 
DallasTemperature sensors(&oneWire);

// Handle received and sent messages
String message = "";
char incomingChar;
String temperatureString = "";

// Timer: auxiliar variables
unsigned long previousMillis = 0;    // Stores last time temperature was published
const long interval = 10000;         // interval at which to publish sensor readings

void setup() {
  pinMode(ledPin, OUTPUT);
  Serial.begin(115200);
  // Bluetooth device name
  SerialBT.begin("ESP32");
  Serial.println("The device started, now you can pair it with bluetooth!");
}

void loop() {
  unsigned long currentMillis = millis();
  // Send temperature readings
  if (currentMillis - previousMillis >= interval){
    previousMillis = currentMillis;
    sensors.requestTemperatures(); 
    temperatureString = String(sensors.getTempCByIndex(0)) + "C  " +  String(sensors.getTempFByIndex(0)) + "F";
    SerialBT.println(temperatureString); 
  }
  // Read received messages (LED control command)
  if (SerialBT.available()){
    char incomingChar = SerialBT.read();
    if (incomingChar != '\n'){
      message += String(incomingChar);
    }
    else{
      message = "";
    }
    Serial.write(incomingChar);  
  }
  // Check received message and control output accordingly
  if (message =="led_on"){
    digitalWrite(ledPin, HIGH);
  }
  else if (message =="led_off"){
    digitalWrite(ledPin, LOW);
  }
  delay(20);
}

Hasil Uji Coba

enter image description here


Bluetooth Low Energy (BLE)

Bluetooth Low Energy (BLE), dikenal juga sebagai Bluetooth Smart, adalah teknologi komunikasi nirkabel yang dirancang untuk konsumsi daya rendah. BLE menggunakan frekuensi radio 2.4 GHz seperti Bluetooth klasik, namun dengan modulasi yang lebih sederhana dan hemat energi.
enter image description here

BLE didesain untuk perangkat yang membutuhkan koneksi nirkabel dengan konsumsi daya rendah, seperti:

  • Perangkat wearable: Smartwatch, fitness tracker, sensor kesehatan
  • IoT (Internet of Things): Sensor, beacon, perangkat rumah pintar
  • Perangkat medis: Alat bantu dengar, monitor glukosa darah Peralatan industri: Sensor, kontroler enter image description here

BLE Client - Server

Dalam komunikasi BLE, perangkat dapat bertindak sebagai klien atau server, tergantung fungsinya dalam pertukaran data. Model klien-server ini beroperasi di atas hubungan master-slave tingkat rendah yang ditentukan oleh Lapisan Tautan. Berikut rinciannya:

Perangkat Pusat (Klien): Memulai komunikasi dengan memindai periferal (server) dan membuat koneksi. Ini mengirimkan permintaan baca atau tulis untuk mengakses data dari server.
Perangkat Periferal (Server): Mengiklankan layanan dan karakteristiknya. Ia menunggu permintaan koneksi dari klien dan merespons permintaan baca atau tulis dengan menyediakan atau menyimpan data. Komunikasi ini biasa disebut sebagai koneksi pont-to-point.
selain itu, BLE juga mendukung Broadcast Mode dan Mesh Network Mode.
Broadcast Mode : server mengirimkan data ke banyak klien yang terhubung;
Mesh Network: semua perangkat terhubung, ini adalah koneksi banyak ke banyak.

enter image description here

GATT

GATT adalah singkatan dari Generic Attributes dan mendefinisikan struktur data hierarkis yang diekspos ke perangkat BLE yang terhubung. Artinya GATT mendefinisikan cara dua perangkat BLE mengirim dan menerima pesan standar. Memahami hierarki ini penting karena akan memudahkan Anda memahami cara menggunakan BLE dan menulis aplikasi Anda.
enter image description here

Sekarang kita akan melakukan percobaan, saya menggunakan 2 buah ESP32, yaitu ESP32 Devkit V1 saya jadikan sebagai server, dan ESP32 Dev Module saya jadikan sebagai Sebagai BLE Scan enter image description here

BLE with ESP32 as a Server

kita jalankan Arduino IDE di Menu File > Examples > ESP32 BLE Arduino > BLE_server enter image description here

/*
    Based on Neil Kolban example for IDF: https://github.com/nkolban/esp32-snippets/blob/master/cpp_utils/tests/BLE%20Tests/SampleServer.cpp
    Ported to Arduino ESP32 by Evandro Copercini
    updates by chegewara
*/

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

// See the following for generating UUIDs:
// https://www.uuidgenerator.net/

#define SERVICE_UUID        "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"

void setup() {
  Serial.begin(115200);
  Serial.println("Starting BLE work!");

  BLEDevice::init("Long name works now");
  BLEServer *pServer = BLEDevice::createServer();
  BLEService *pService = pServer->createService(SERVICE_UUID);
  BLECharacteristic *pCharacteristic = pService->createCharacteristic(
                                         CHARACTERISTIC_UUID,
                                         BLECharacteristic::PROPERTY_READ |
                                         BLECharacteristic::PROPERTY_WRITE
                                       );

  pCharacteristic->setValue("Hello World says Neil");
  pService->start();
  // BLEAdvertising *pAdvertising = pServer->getAdvertising();  // this still is working for backward compatibility
  BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
  pAdvertising->addServiceUUID(SERVICE_UUID);
  pAdvertising->setScanResponse(true);
  pAdvertising->setMinPreferred(0x06);  // functions that help with iPhone connections issue
  pAdvertising->setMinPreferred(0x12);
  BLEDevice::startAdvertising();
  Serial.println("Characteristic defined! Now you can read it in your phone!");
}

void loop() {
  // put your main code here, to run repeatedly:
  delay(2000);
}

Untuk membuat server BLE, kita perlu melakukan penyesuaian terhadap kode diatas dengan memperhatikan langkah-langkah berikut:

  1. Buat Server BLE. Dalam hal ini, ESP32 bertindak sebagai server BLE.
  2. Buat Layanan BLE.
  3. Buat Karakteristik BLE pada Layanan.
  4. Buat Deskriptor BLE pada Karakteristik.
  5. Mulai Layanan.
  6. Mulai beriklan, sehingga dapat ditemukan oleh perangkat lain.

Selanjutnya kita upload kode programnya : enter image description here

Cara kerja kodenya

Mari kita lihat sekilas cara kerja kode contoh server BLE. Ini dimulai dengan mengimpor library yang diperlukan untuk kemampuan BLE.

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

Kemudian, Anda perlu menentukan UUID untuk Layanan dan Karakteristik.

#define SERVICE_UUID "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"

Anda dapat membiarkan UUID default, atau Anda dapat membuka uuidgenerator.net untuk membuat UUID acak untuk layanan dan karakteristik Anda.

Tahap awal yaitu memulai komunikasi serial pada baud rate 115200.

Serial.begin(115200);

Kemudian, Anda membuat perangkat BLE yang disebut “ MyESP32 ”. Anda dapat mengubah nama ini menjadi apa pun yang Anda suka. Dalam percobaan ini saya mengganti Nama devicesnya menjadi ESP32 Server

// Create the BLE Device
BLEDevice::init("MyESP32");

Pada baris berikut, Anda mengatur perangkat BLE sebagai server.

BLEServer *pServer = BLEDevice::createServer();

Setelah itu akan dibuat layanan untuk server BLE dengan UUID yang telah ditentukan sebelumnya.

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

Kemudian, ditetapkan karakteristik untuk layanan tersebut. Seperti yang Anda lihat, Anda juga menggunakan UUID yang ditentukan sebelumnya, dan Anda harus meneruskan properti karakteristik sebagai argumen. Dalam hal ini, itu adalah: READ dan WRITE.

BLECharacteristic *pCharacteristic = pService->createCharacteristic(
                                     CHARACTERISTIC_UUID,
                                     BLECharacteristic::PROPERTY_READ |
                                     BLECharacteristic::PROPERTY_WRITE
                                     );

Setelah membuat karakteristik, di buat satu value, pada kode ini digunakan valuenya adalah "Hello World says Neil" Nilai ini hanya contoh, bisa diubah sesuka hati

pCharacteristic->setValue("Hello World says Neil");

Bila nanti pada keadaan sesungguhnya nilai ini akan digunakan untuk menginformasikan sesuatu, sesuai dengan project yang akan kita lakukan, misalkan saja dalam hal pembacaan sensor, contoh “Temperature” dan lain sebagainya.

Terakhir, melakukan advertise servicesnya, sehingga perangkat BLE lain dapat memindai dan menemukan perangkat BLE ini (server).

BLEAdvertising *pAdvertising = pServer->getAdvertising();
pAdvertising->start();

Setelah berhasil upload, kita bisa memantau melalui serial monitor

enter image description here

BLE with ESP32 as a scan

Membuat pemindai ESP32 BLE itu sederhana. Ambil ESP32 lain (saat yang lain menjalankan sketsa server BLE). Di Arduino IDE Anda, buka File > Examples > ESP32 BLE Arduino dan pilih BLE_scan
enter image description here

/*
   Based on Neil Kolban example for IDF: https://github.com/nkolban/esp32-snippets/blob/master/cpp_utils/tests/BLE%20Tests/SampleScan.cpp
   Ported to Arduino ESP32 by Evandro Copercini
*/

#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEScan.h>
#include <BLEAdvertisedDevice.h>

int scanTime = 5; //In seconds
BLEScan* pBLEScan;

class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks {
    void onResult(BLEAdvertisedDevice advertisedDevice) {
      Serial.printf("Advertised Device: %s \n", advertisedDevice.toString().c_str());
    }
};

void setup() {
  Serial.begin(115200);
  Serial.println("Scanning...");

  BLEDevice::init("");
  pBLEScan = BLEDevice::getScan(); //create new scan
  pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks());
  pBLEScan->setActiveScan(true); //active scan uses more power, but get results faster
  pBLEScan->setInterval(100);
  pBLEScan->setWindow(99);  // less or equal setInterval value
}

void loop() {
  // put your main code here, to run repeatedly:
  BLEScanResults foundDevices = pBLEScan->start(scanTime, false);
  Serial.print("Devices found: ");
  Serial.println(foundDevices.getCount());
  Serial.println("Scan done!");
  pBLEScan->clearResults();   // delete results fromBLEScan buffer to release memory
  delay(2000);
}

kemudian kita upload kode contoh tersebut, pastikan anda menyesuaikan kembali ESP32 dan port yang akan kita gunakan, dalam hal ini kita menggunakan ESP32 Dev Module

enter image description here

kita buka serial monitor, jangan lupa untuk menekan tombol EN/Reset pada ESP
enter image description here dalam serial monitor tersebut, terlihat ada beberapa devices yang ditemukan, karena kebetulan di kosan saya ada banyak Access Point, kita fokus pada yang saya tandai merah, yaitu ESP32 Server, itu adalah nama devices server yang telah kita buat sebelumnya.

Menguji dengan nRF Connect for mobile Smarphone

Pastikan terlebih dahulu kita install aplikasinya melalui Play Store bagi pengguna Android enter image description here

Kesimpulan

Dengan percobaan ini kita dapat menunjukkan prinsip dasar Bluetooth Hemat Energi, dari ini kita bisa menjadikan ini sebagai inspiratif penggunaan BLE ini untuk kebutuhan yang lebih bermanfaat. sampai jumpa ke next project.

Referensi

apa yang ditulis pada halaman ini bersumber dari :

  1. https://randomnerdtutorials.com/esp32-bluetooth-classic-arduino-ide/
  2. https://randomnerdtutorials.com/esp32-bluetooth-low-energy-ble-arduino-ide/