Communicating with ESP32: Bluetooth

--

Halo gais ketemu lagi sama aku nih setelah berminggu-minggu hahaha. Terima kasih Tuhan aku bisa melewati UTS dengan baik dan semoga hasilnya juga baik. Apa kabar kalian? semoga baik-baik saja ya.

Minggu ini aku bakalan bahas sesuatu yang agak beda nih guys. Jadi kali ini aku bakalan membahas eksperimenku yang masih ditemani ESP32, Namun kali ini kita beranjak ke fitur komunikasi dari ESP32. Yaitu fitur Bluetooth. Kalian mungkin sudah familiar dengan fitur ini di perangkat kalian, sekarang kita bakalan menghubungkan ESP32 kita dan Handphone kita, I’m so excited for this!! (Note: eksperimen ini hanya bisa dilakukan dengan device dengan sistem operasi Android.)

Pertama-tama kita akan menggunakan bluetooth klasik. Percobaan pertama adalah memastikan ESP32 dapat tersambung dengan smartphone, setelah itu kita coba memanfaatkan smartphone untuk melakukan eksperimen skematik menyalakan dan mematikan LED dari smartphone. Selain dengan bluetooth klasik, kita akan menggunakan bluetooth low energy dan melakukan eksperimen yang sama

Komponen yang kita perlukan antara lain:

  • smartphone android yang terinstall Serial Bluetooth
  • ESP 32 dan breadboard
  • Kabel USB
  • Kabel Jumper
  • Lampu LED
  • Resistor (disini aku pakai 330 Ohm)
  • PC dengan Arduino IDE

BLUETOOTH CLASSIC

  • TESTING

kita akan mencoba menyambungkan bluetooth ESP32 dengan smartphone. Pertama, kita download dulu sebuah aplikasi serial bluetooth pada play store. Tambahkan ESP32test pada menu bluetooth di settings HP. Lalu sambungkan ESP32 dengan laptop, tidak ada konfigurasi tambahan diperlukan di rangkaian.

Setelah semuanya siap, temukan kode testing di File > Examples > BlueetoothSerial > SerialToSerialBT

Aplikasi Bluetooth (kiri), cara menemukan kode (kanan)

Kodenya akan terlihat seperti ini:

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

Langsung saja compile kode di atas pada Arduino IDE. Cek pada serial monitor apakah sudah tidak terjadi error. Jika berjalan normal, tekan tombol 2 kabel terhubung pada bagian kanan atas aplikasi smartphone, maka smartphone akan terhubung dengan ESP32, cobalah menulis beberapa kata pada serial monitor dan smartphone.

Tampilan pada serial monitor dan aplikasi
  • SCHEMATIC

Sekarang kita coba penggunaan bluetooth untuk kegunaan lainnya. Misalnya memberi perintah untuk menyalakan dan mematikan lampu pada breadboard ESP32. Pertama-tama susun rangkaiannya seperti ini, aku menggunakan GPIO 5 untuk menyambungkan lampu dan ESP32.

Setelah rangkaian selesai, sambungkan ESP32 dengan PC dan compile kode di bawah ini. Dikutip dari https://randomnerdtutorials.com/esp32-bluetooth-classic-arduino-ide/

/*********
Rui Santos
Complete project details at https://randomnerdtutorials.com
*********/
#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;const int ledPin = 5;
String msg = "";
char inputmsg;
void setup() {
pinMode(ledPin, OUTPUT);
Serial.begin(115200);
// Bluetooth device name
SerialBT.begin("ESP32test");
Serial.println("The device started, now you can pair it with bluetooth!");
}
void loop() {
if (SerialBT.available()){
char inputmsg = SerialBT.read();
if (inputmsg != '\n'){
msg += String(inputmsg);
}
else{
msg = "";
}
Serial.write(inputmsg);
}
// Check received message and control output accordingly
if (msg =="on"){
digitalWrite(ledPin, HIGH);
SerialBT.println("LED is on");
}
else if (msg =="off"){
digitalWrite(ledPin, LOW);
SerialBT.println("LED is off");
}
delay(20);
}

Penjelasan singkat mengenai kodenya : Pertama import library dan pastikan configuration BT dan BlueDroid dapat dijalankan (enabled)

#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;const int ledPin = 5;
String msg = "";
char inputmsg;

Lalu buatlah beberapa objek yang akan diperlukan nantinya

BluetoothSerial SerialBT;const int ledPin = 5;
String msg = "";
char inputmsg;

Pada void setup akan ditulis perintah pembacaan bluetooth dan pengeluaran pesan eror jika tidak ada yang terbaca. Void loop sendiri mengatur kondisi tertentu yang dapat menghidupkan dan mematikan LED, disini LED akan menyala jika pada aplikasi dituliskan “on” dan mati jika pada aplikasi dituliskan “off”. Demo dapat dilihat di bawah:

Ohya aku juga mencoba menyambungkan sensor cuaca ke ESP32 dan menampilkannya ke bluetooth terminal di smartphone, berkali-kali aku gagal dalam percobaan namun akhirnya berhasil juga. Kodenya aku modifikasi dari sini.

Nah jadi kode ini berfungsi untuk langsung menampilkan data pressure dan humidity yang dibaca sensor BMP280 ke smartphone melalui bluetooth secara real time.

BLUETOOTH LOW ENERGY (BLE)

Bluetooth low energy adalah perkembangan blueetoth klasik yang memerlukan lebih sedikit energi (listrik) dalam penggunaanya, BLE akan berada pada mode stand-by atau sleep pada saat tidak digunakan. Latency pada BLE juga jauh lebih rendah daripada latency pada bluetooth klasik.

untuk mencari kode contoh bluetooth low energy, kita bisa mengunjungi File> Examples > ESP32 BLE Arduino

disana akan terdapat beberapa jenis kode examples yang dapat kita coba untuk eksperimen BLE, yang akan kita coba sekarang adalah scan dan juga server.

  • SCAN

Scanner berfungsi untuk memindai perangkat (device terdekat dari ESP32). Kode yang terlihat pada layar seperti ini:

/*
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);
}

Saat dijalankan ESP32 akan memindai perangkat bluetooth terdekat dan akan mencetaknya pada serial monitor. Namun aku sedikit bingung mengapa nama device dikosongkan.

  • SERVER

Server berfungsi untuk define sebuah server dari ESP32 supaya dapat kita baca pada smartphone, kode yang digunakan:

/*
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("Ananta's ESP32");
BLEServer *pServer = BLEDevice::createServer();
BLEService *pService = pServer->createService(SERVICE_UUID);
BLECharacteristic *pCharacteristic = pService->createCharacteristic(
CHARACTERISTIC_UUID,
BLECharacteristic::PROPERTY_READ |
BLECharacteristic::PROPERTY_WRITE
);
pCharacteristic->setValue("saking tuhu manah guru");
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);
}

Saat dijalankan Serial Monitor akan memberi keluaran bahwa perangkat(ESP32) siap dibaca di smartphone

  • TRYING ON SMARTPHONENah karena server sudah di-set, saatnya kita sambungkan ke smartphone, pertama-tama download aplikasi nRF connect for mobile, setelah selesai diunduh pencet tombol scan pada aplikasi untuk memindai perangkat bluetooth terdekat, nanti akan terlihat perangkat ESP32 kita.
tampilan device pada smartphone, aplikasi nrf

setelah itu kita sambungkan saja dengan menekan tombol “connect”, tunggu beberapa saat, dan voila perangkat akan tersambung. Pada menu perangkat kita bisa melihat UUID, properti, dan pesan yang kita kirimkan dari ESP32

ANALYSIS

Moral of the story dari eksperimen kali ini adalah

  • Kita bisa melakukan eksplorasi sendiri untuk menemukan isu-isu yang lebih menarik untuk dipecahkan seperti menampilkan hasil pembacaan sensor langsung ke smartphone. Dalam eksplorasi kemungkinan besar akan ditemukan kendala atau error yang dapat menghambat perkembangan, namun itulah tugas kita sebagai engineer untuk menemukan solusi atas kendala yang datang agar bisa menciptakan sesuatu yang lebih bermanfaat.

Itu saja dulu dari aku ya! Sampai jumpa minggu depan, tetap jaga kesehatan dan pakai masker ya. (I Wayan Ananta Suandira/18219038)

--

--