[II2260 — Embedded System, 7th Project] ESP32 Bluetooth : Classic & Low Energy

— Pengantar

Hafidz Shidqi
6 min readMar 25, 2023

Setelah membuat project keenam (ESP32 Serial Communication), selanjutnya kita akan membahas tentang bluetooth. Bluetooth pada ESP32 memiliki dua mode yaitu Bluetooth Classic dan Bluetooth Low Energy (BLE).

Bluetooth Classic adalah mode Bluetooth yang umum digunakan pada perangkat seperti headset, speaker, dan keyboard. Bluetooth Classic mengirimkan data secara kontinu dengan throughput yang tinggi, namun memerlukan daya yang cukup besar.

Sementara itu, Bluetooth Low Energy (BLE) adalah mode Bluetooth yang dirancang untuk aplikasi dengan konsumsi daya yang rendah dan jangkauan yang lebih pendek. BLE mengirimkan data dengan kecepatan rendah dan dapat beroperasi dalam mode sleep untuk menghemat daya.

Keduanya memiliki kelebihan dan kekurangan masing-masing tergantung pada aplikasi yang digunakan. ESP32 dapat mendukung kedua mode Bluetooth tersebut, sehingga dapat digunakan dalam berbagai aplikasi seperti sensor, perangkat wearables, dan kontrol jarak jauh.

— Komponen

Komponen yang digunakan terbagi menjadi dua, yaitu perangkat lunak dan perangkat keras.

Adapun perangkat keras yang digunakan yaitu :

  1. ESP32 + Breadboard
  2. Kabel micro USB
  3. Kabel Jumper
  4. Resistor 330 ohm
  5. Lampu LED

Adapun perangkat lunak yang digunakan yaitu :

  1. Arduino IDE
  2. Serial Bluetooth Terminal
  3. nRF Connect for Mobile

— Hands-On

Adapun langkah-langkah untuk memulai ESP32 Bluetooth Classic yaitu

  1. Pastikan kalian sudah melakukan instalasi perangkat lunak (aplikasi) yang sudah aku sebutkan di atas.
  2. Sambungkan ESP32 kalian ke laptop menggunakan kabel micro USB
  3. Buka Arduino IDE kalian lalu upload code
//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"

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

BluetoothSerial SerialBT;

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

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

Pada code di atas, aku menamai bluetooth ESP32 aku dengan nama “Hafidz Shidqi”, kalian bisa mengubah namanya pada baris code SerialBT.begin("Hafidz Shidqi");

4. Silahkan buka serial monitor 115200 baud. Jika berhasil, maka tampilan serial monitornya akan seperti berikut.

Tampilan ketika berhasil connect bluetooth,

Adapun kotak merah merupakan code bagian Serial.println(“The device started, now you cann pair it with bluetooth” yang menandakan bahwasanya bluetooth dengan nama “Hafidz Shidqi” sudah bisa diconnect oleh device lain.

5. Setelah itu, buka aplikasi Serial Bluetooth Terminal, lalu connect ke nama bluetooth yang sudah kalian sesuaikan. Dalam kasus ini, aku menamai bluetooth aku dengan “Hafidz Shidqi”

6. Setelah berhasil terconnect, maka tampilannya akan seperti berikut

7. Setelah itu, kalian bisa mengirim pesan dari Serial Bluetooth Terminal ke Serial Monitor dan sebaliknya. Dalam kasus ini, aku mengirimkan pesan dari Serial Bluetooth Terminal dengan pesan “Hafidz Shidqi” dan mengirim pesan dari Serial Monitor dengan pesan “from arduino ide to bluetooth”.

Tampilan pada Serial Monitor
Tampilan pada Serial Bluetooth Terminal

Setelah melakukan percobaan Bluetooth Classic, selanjutnya kita akan mencoba ESP32 Bluetooth Low Energy. Adapun langkah-langkahnya sebagai berikut :

  1. Sambungkan ESP32 ke laptop kalian
  2. Buka Arduino IDE lalu upload code berikut
/*
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("Hafidz Shidqi");
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 Hafidz Shidqi");
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);
}

Kalian bisa mengubah nama device bluetooth kalian pada potongan code BLEDevice::init("Hafidz Shidqi"); dan kalian juga bisa mengubah pesan yang akan ditampilkan pada potongan code pCharacteristic->setValue("pesan kalian");

3. Setelah itu buka nRF Connect for Mobile, cari dan connect bluetooth kalian. Pilih data parser UTF-8 agar bisa menampilkan pesan dalam bentuk alphabet

Tampilan tombol merubah data parser | Tampilan option data parset menjadi UTF-8 | Tampilan pesan dalam bentuk UTF-8

— Extra Project

Setelah berhasil mengirimkan pesan menggunakan mode Bluetooth Classic dan Bluetooth Low Energy, selanjutkan kita akan melakukan variasi dengan mode Bluetooth Classic untuk mematikan dan menyalakan lampu LED.

Adapun langkah-langkahnya sebagai berikut :

  1. Sambungkan pin positif pada LED ke pin GPIO5 pada ESP32
  2. Sambungkan pin ground pada ESP32 ke ground pada breadboard
  3. Sambungkan pin negatif pada LED ke pin ground pada breadboard menggunakan resistor 330 ohm. Tampilan rangkaiannya seperti berikut
Tampilan rangkaian extra project

4. Buka Arduino IDE kalian lalu upload code berikut

#include <BluetoothSerial.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 = 5;
// Handle received and sent messages
String message = "";
char incomingChar;
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();
// 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);
}

5. Buka aplikasi Serial Bluetooth Terminal, lalu connect ke nama bluetooth yang sudah kalian sesuaikan.

6. Lalu kalian bisa mengirimkan pesan “led_on” untuk menyalakan LED dan “led_off” untuk mematikan LED pada Serial Bluetooth Terminal.

Tampilan ketika mengirimkan pesan led_on dan led_off

Kalian bisa menyesuaikan pesan untuk mematikan dan menyalakan LED pada potongan code if(message == "led_on") dan else if(message == "led_off")

Dengan berhasilnya extra project merupakan akhir dari project ketujuh ini. Jika ada pertanyaan atau masalah, silahkan tulis di kolom komentar. Sekian dan terima kasih!

--

--