Introduction to ESP32 Bluetooth Classic & Bluetooth Low Energy

Christopher Davin
7 min readMar 20, 2021

--

Project 7 : Bluetooth Communication

Halo lagi semuanya! Udah sekitar 2 minggu dari terakhir kali aku buat tulisan tentang ESP32 ini. Sekarang, aku bakal lanjutin lagi project selanjutnya dari microcontroller yang satu ini.

Pada project kali ini, aku bakal nyobain salah satu fitur yang sudah ada di microcontroller ESP32 yaitu Bluetooth. Siapa sih yang ngga tau bluetooth? Contohnya saja hampir semua telepon seluler yang kalian punya sekarang pasti sudah support sama yang namanya Bluetooth ini. Microcontroller ESP32 ini juga sudah punya built-in bluetooth juga didalamnya. Nah, kalau di project sebelum-sebelumnya aku selalu pakai koneksi UART, sekarang aku mau coba menggunakan koneksi nirkabel bluetooth melalui aplikasi Serial Bluetooth Terminal di android. Jenis bluetoothnya sendiri ada 2 yaitu Bluetooth Classic & Bluetooth Low Energy (4.0).

Bluetooth Classic

Bluetooth jenis ini dapat digunakan untuk mentransfer data berukuran besar, namun menghabiskan baterai dengan lebih cepat.

Komponen yang diperlukan:

  1. ESP32
  2. aplikasi Serial Bluetooth Terminal

Pertama-tama, hal yang aku lakukan adalah serial ke serial bluetooth ESP32 ini dengan kode yang dapat diakses di File → Example → BluetoothSeriail → SerialtoSerialBT

Kodenya adalah sebagai berikut :

#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("ESP32test"); //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);
}

Penjelasan Kode

  • Library yang digunakan adalah BluetoothSerial
  • Kode berikut untuk mengecek apakah bluetooth sudah diaktifkan
#if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)
#error Bluetooth is not enabled! Please run `make menuconfig` to and enable it
#endif
  • Selanjutnya dengan membuat objek SerialBT dan mengatur serial communication ke 115200 baud

Tes kode

Setelah kode diupload, pastikan serial communication yang digunakan sebesar 115200 baud dan setelah program berhasil diupload, tekan tombol enable pada ESP32nya.

Bisa dilihat pada baris terakhir bahwa bluetooth dari ESP32 ini sudah aktif.

Selanjutnya, buka aplikasi Serial Bluetooth Terminal yang tadi sudah didownload dan hubungkan device ke ESP32 ini dengan langkah sebagai berikut:

Kalau sudah tertulis connected berarti ESP32 kalian sudah terhubung ke perangkat yang kalian gunakan. Setelah itu, kalian bisa bebas bertukar pesan melalui serial monitor dan android device kalian.

Exchange Data using Bluetooth Serial

Bila sebelumnya kita sudah mengetahui cara kerja bluetooth serial, kita bisa modifikasi program dan rangkaian kita untuk menampilkan data lain di aplikasi Serial Bluetooth Terminal ini seperti data dari sensor atau bahkan menyalakan lampu. Untuk melakukan ini, kita hanya butuh menambahkan sensor suhu, lampu ,dan memodifikasi kode yang akan kita buat.

Komponen yang diperlukan:

  1. ESP32
  2. Breadboard
  3. BME280
  4. LED
  5. Resistor 330 Ω

Skema

Pada skema rangkaian, dapat dilihat sensor BME280 dihubungkan dengan koneksi I2C serial ke port GPIO 21 (SDA) dan GPIO 22 (SCL) dan LED dihubungkan ke GPIO 25.

Tes Kode

Kode yang digunakan adalah sebagai berikut:

#include "BluetoothSerial.h"
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.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
BluetoothSerial SerialBT; // Bluetooth Serial object
Adafruit_BME280 bme; //BMP280 Sensor object
const int greenPin = 25; // GPIO where LED is connected to
// 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 = 5000; // interval at which to publish sensor readings
unsigned long delayTime;void setup() {
//Bluetooth
Serial.begin(115200);
SerialBT.begin("ESP32");
Serial.println("The device started, now you can pair it with bluetooth!");
//Sensor
bool status;
// default settings
// (you can also pass in a Wire library object like &Wire2)
status = bme.begin(0x76);
if (!status) {
Serial.println("Could not find a valid BME280 sensor, check wiring!");
while (1);
}
Serial.println();
//LED
pinMode(greenPin, OUTPUT);
}
void loop() {
unsigned long currentMillis = millis();
// Send temperature readings
if (currentMillis - previousMillis >= interval){
previousMillis = currentMillis;
SerialBT.print(bme.readTemperature());
SerialBT.println(" ℃");
}
// 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(greenPin, HIGH);
}
else if (message =="led off"){
digitalWrite(greenPin, LOW);
}
delay(20);
}

Program akan mencetak bacaan sensor tiap 5 detik menggunakan milis sebagai pencatat waktunya dan jika menerima masukan led on, lampu LED akan menyala dan led off akan mematikan lampu.

Bluetooth Low Energy (Bluetooth 4.0)

Bluetooth jenis ini biasa digunakan untuk bertukar data dengan ukuran tidak begitu besar sehingga baterainya dapat bertahan hingga bertahun-tahun. Pada umumnya, smartphone zaman sekarang sudah mendukung Bluetooth 4.0 ini.

Komponen yang diperlukan:

  1. ESP32
  2. Aplikasi nRF Connect for Mobile

Pertama-tama, yang harus dilakukan adalah membuat server BLE dengan kode yang dapat diakses di File → Examples → ESP32 BLE Arduino → BLE_server

Kodenya sebagai berikut:

#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 Davin");
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);
}

Penjelasan kode

  • Library yang digunakan adalah BLEDevice, BLEUtils, dan BLEServer
  • Kode berikut untuk menetapkan UUID untuk service & characteristic. UUID yang digunakan adalah default, namun bisa kalian custom sendiri di uuidgenerator.net.
#define SERVICE_UUID        "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"
  • Untuk device name bisa diatur pada BLEDevice::init("Long name works now"); ini adalah device name default.
  • Selanjutnya kita mengeset server dengan UUID yang telah didefine sebelumnya dengan kode berikut
BLEServer *pServer = BLEDevice::createServer();
BLEService *pService = pServer->createService(SERVICE_UUID);
BLECharacteristic *pCharacteristic = pService->createCharacteristic(
CHARACTERISTIC_UUID,
BLECharacteristic::PROPERTY_READ |
BLECharacteristic::PROPERTY_WRITE
);
  • Setelah membuat characteristic dari server tersebut, barulah kita menambahkan setValue() method pCharacteristic->setValue("Hello World says Davin”) inilah yang nantinya akan dikirim ke device kita.

Tes Kode

Setelah kode diupload, pastikan serial communication yang digunakan sebesar 115200 baud

Bila pada serial monitor telah muncul tampilan seperti itu, berarti servernya sudah siap. Setelah itu kita tinggal buka aplikasi nRF Connect for Mobile yang sudah kita siapkan sebelumnya dan pastikan Bluetooth device kalian sudah dinyalakan.

Setelah terhubung, maka tampilannya akan seperti ini

Bisa dilihat, Characteristic READ dan WRITE dan UUID yang telah kita set sebelumnya akan terlihat bila kita klik service. Selain itu, value yang kita tulis juga akan tertera disana.

Untuk lebih jelasnya bisa dilihat pada video di bawah ini:

Analisis

Pada project kali ini, aku mencoba koneksi nirkabel dengan bluetooth setelah sebelum-sebelumnya koneksi yang digunakan adalah UART (Universal Asynchronous Receiver Transmitter) atau lebih mudahnya dengan kabel USB. Dengan bluetooth, kita dapat bertukar data dari microcontroller ke device lainnya dan sebaliknya. Selama melakukan project ini masih belum ada kendala yang berarti dan semuanya berjalan sesuai dengan harapan. Dengan demikian, berakhirlah project 7 mengenai Bluetooth connection ini. Kedepannya, masih bakal ada project project selanjutnya yang ga kalah seru jadi, ditunggu ya!!

Christopher Davin Leoputra / 18219037

--

--