top of page

7th Project: ESP32 Bluetooth Classic dan Bluetooth Low Energy (BLE)


Halo teman-teman, kita kembali lagi. Pada blog kali ini, kita akan melihat protokol komunikasi nirkabel jarak pendek yaitu Bluetooth, baik varian classic maupun low energy, pada ESP32. Aku akan membahas satu eksperimen untuk setiap varian Bluetooth.


Bluetooth adalah standar PAN teknologi nirkabel yang digunakan untuk bertukar data antara perangkat tetap dan seluler dalam jarak pendek. Bluetooth beroperasi pada 2,4 GHz band.


  1. Bluetooth Classic


Bluetooth adalah teknologi berorientasi koneksi. Koneksi harus dibuat terlebih dahulu antara perangkat yang mendukung Bluetooth sebelum melakukan transfer data. Bluetooth adalah teknologi nirkabel yang menggunakan gelombang radio berenergi rendah mengirim data nirkabel antar perangkat berkemampuan Bluetooth. Bluetooth mirip seperti Wi-Fi yang beroperasi melalui gelombang radio, namun Bluetooth bisa bekerja antara dua perangkat yang diaktifkan dan tidak memerlukan tambahan peralatan jaringan seperti router atau modem, menjadikannya pilihan yang populer untuk mengirim data antar perangkat elektronik seluler dalam jarak dekat dalam jarak maksimum mencapai 50 meter.


TOOLS

  1. ESP32

  2. Breadboard

  3. 16x2 LCD display

  4. Male-to-female jumper cables

  5. Male-to-male jumper cables

  6. Micro-to-USB data cables

  7. LED 5mm F5

  8. BMP280 sensor

  9. 330 Ohm resistor

  10. Smartphone


TUTORIAL

  1. Pertama-tama Buka Arduino IDE Kamu, dan buka File > Contoh > BluetoothSerial > SerialtoSerialBT.



2. Kita perlu melakukan pengecekan terhadap konektivitas ESP32 yang kita miliki. Untuk melakukan percobaanya silahkan upload kode berikut pada arduino kita.

#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);

}

3. Lalu buka serial monitor dan ketika selesai upload tekan tombol EN pada ESP32. Maka nanti akan muncul notifikasi Bluetooth seperti gambar di bawah ini :



4. Install “Serial Bluetooth Terminal” pada smartphone kita.


5. Setelah berhasil menginstall aktifkan Bluetooth di smartphone kita dan buka pengaturan Bluetooth. Pasangkan smartphone kita dengan ESP32test, Kemudian, buka aplikasi Serial Bluetooth Terminal. Lalu pilih ESP32test seperti gambar dibawah ini :



6. Klik ikon di bagian atas untuk terhubung ke ESP32. Kamu harus mendapatkan pesan "Terhubung" sesuai gambar dibawah ini :



7. Setelah itu, ketik sesuatu di aplikasi Serial Bluetooth Terminal. Misalnya, “Hello”.



8. Kamu akan langsung menerima pesan itu di Arduino IDE Serial Monitor.



9. Kamu juga dapat bertukar data antara Serial Monitor dan smartphone kamu. Ketik sesuatu di chat atas Serial Monitor dan tekan tombol "Kirim".



10. Kamu akan langsung menerima pesan itu di Aplikasi Serial Bluetooth Terminal.



  • Percobaan menyalakan LED dengan Bluetooth Terminal


  1. Pada tahap ini kita akan memulai percobaan pertama yaa.. dengan mencoba menyalakan dan mematikan lampu LED menggunakan koneksi Bluetooth ke ESP32 kita. Buatlah rangakaiannya seperti pada gambar di bawah ini :

Untuk lebih jelasnya lagi, bisa lihat panduan pemasangan pinnya di bawah ini :

  • Pin 3V3 ESP32 -> sisi positif breadboard

  • Pin GND ESP32 -> sisi negatif breadboard

  • Pin GPIO23 ESP32 -> Kaki panjang LED

  • Resistor menghubungkan kaki pendek LED dengan sisi negatif breadboard


2. Setelah semuanya siap, kamu dapat melanjutkan menulis program untuk ESP32. Berikut kodenya :

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 =="Y"){

    digitalWrite(ledPin, HIGH);

  }

  else if (message =="N"){

    digitalWrite(ledPin, LOW);

  }

  delay(20);

}

3. Setelah itu config di terminal Bluetooth aplikasi kita kalau M1 adalah Y kalau M2 adalah N. seperti gambar di bawah ini :


4. Kemudian kita jalankan program dan hasilnya menjadi seperti ini :




2. Bluetooth Low Energy (BLE)


Bluetooth Low Energy disingkat BLE, adalah varian Bluetooth yang hemat daya. Aplikasi utama BLE adalah transmisi data dalam jumlah kecil (bandwidth rendah) jarak pendek. Tidak seperti Bluetooth yang selalu aktif, BLE tetap berada dalam mode sleep terus-menerus kecuali saat koneksi dimulai. Hal ini membuatnya mengkonsumsi daya yang sangat rendah. BLE mengkonsumsi daya sekitar 100x lebih sedikit dibandingkan Bluetooth Classic (tergantung kasus penggunaan).


Dengan Bluetooth Hemat Energi, ada dua jenis perangkat: server dan klien. ESP32 dapat bertindak sebagai klien atau sebagai server.


Dalam proyek ini, kita akan menetapkan ESP32 sebagai server dan smartphone kita sebagai pemindai/klien.


TOOLS

  1. ESP32

  2. Micro-to-USB data cable

  3. Smartphone


TUTORIAL

  1. Sebelum memulai programnya kita perlu mendownload aplikasi dan Install nRF Connect for Mobile pada smartphone kita :


2. Hubungkan ESP32 dengan Laptop atau PC menggunakan kabel data micro-to-USB dan klik Select Board lalu pilih DOIT ESP32 DEVKIT V1. Buka Arduino IDE, dan buka File > Contoh > ESP32 BLE Arduino dan pilih contoh BLE_server seperti gambar dibawah ini :



3. Setelah semuanya siap, kamu dapat melanjutkan menulis program untuk ESP32. Berikut kodenya :

#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("ESP32 Test");

  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);

}

4. Setelah berhasil diupload, hasilnya dapat diperiksa melalui aplikasi nRF Connect for Mobile seperti gambar di bawah ini :



  • Percobaan nyalakan LED bawaan ESP32 menggunakan BLE

  1. Kita akan memulai percobaan kedua... Pertema hubungkan ESP32 dengan Laptop atau PC menggunakan kabel data micro-to-USB dan klik Select Board lalu pilih DOIT ESP32 DEVKIT V1. Dan unggah kode berikut :

#include <BLEDevice.h>

#include <BLEServer.h>

#include <BLEUtils.h>

#include <BLE2902.h>


#define SERVICE_UUID "6E400001-B5A3-F393-E0A9-E50E24DCCA9E"

#define CHARACTERISTIC_UUID_TX "6E400001-B5A3-F393-E0A9-E50E24DCCA9E"

#define CHARACTERISTIC_UUID_RX "6E400001-B5A3-F393-E0A9-E50E24DCCA9E"


BLECharacteristic *pCharacteristic;

bool deviceConnected = false;

int txValue = 0;

class MyServerCallbacks: public BLEServerCallbacks {

    void onConnect(BLEServer* pServer) {

      deviceConnected = true;

      };

void onDisconnect(BLEServer* pServer) {

      deviceConnected = false;

    }

};

class MyCallbacks: public BLECharacteristicCallbacks {

    void onWrite(BLECharacteristic* pCharacteristic) {

      std::string rxValue = pCharacteristic->getValue();

      

      if (rxValue.length() > 0) {

        Serial.println("===START=RECEIVE===");

        Serial.print("Receiver Value: ");

        for (int i = 0; i < rxValue.length(); i++) {

                  Serial.print(rxValue[i]);

                }

        Serial.println();

if (rxValue.find("1") != -1) {

          Serial.println("Turning ON!");

          digitalWrite(LED_BUILTIN, HIGH);

        } else if (rxValue.find("0") != -1){

          Serial.println("Turning OFF!");

          digitalWrite(LED_BUILTIN, LOW);

        }

Serial.println();

        Serial.println("===END=RECEIVE===");

        }

  }

   

};

void setup() {

  Serial.begin(9600);pinMode(LED_BUILTIN, OUTPUT);

  

  BLEDevice::init("MyESP32");BLEServer *pServer = BLEDevice::createServer();

  pServer->setCallbacks(new MyServerCallbacks());

  

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

pCharacteristic = pService->createCharacteristic(

                      CHARACTERISTIC_UUID_TX,

                      BLECharacteristic::PROPERTY_NOTIFY

                    );

                    

  pCharacteristic->addDescriptor(new BLE2902());BLECharacteristic *pCharacteristic = pService->createCharacteristic(

                      CHARACTERISTIC_UUID_RX,

                      BLECharacteristic::PROPERTY_WRITE

                    );

                    

  pCharacteristic->setCallbacks(new MyCallbacks());

  

  pService->start();

  

  pServer->getAdvertising()->start();

  Serial.println("Waiting for a client connection to notify...");

}


void loop() {

  if (deviceConnected) {

    txValue = random(0,20);char txString[8];

    dtostrf(txValue, 1, 2, txString);

    pCharacteristic->setValue(txString);

    pCharacteristic->notify();

    Serial.println("Sent value: " + String(txString));

    delay(500);

  }

}

2. Tekan tombol EN pada ESP32


3. Buka aplikasi nRF Connect. Jangan lupa aktifkan Bluetooth


4. Klik “SCAN”


6. Hubungkan ke ESP32 Kamu


7. Klik pada Layanan UART Nordik


8. Klik tombol unduh pada karakteristik dengan properti notifikasi untuk mendapatkan nilai yang dikirim dari ESP32


9. Klik tombol unggah pada karakteristik dengan properti tulis, ketik nilai tulis 1 atau 0 untuk menghidupkan atau mematikan LED bawaan ESP32. Jangan lupa ubah jenis inputannya menjadi Teks (UTF-8).


10. Dan hasilnya seperti yang ku Upload dibawah ini yaa :



Akhirnya selesai sudah penjelasan pada blog ini. Terimakasih semuanya telah membaca project ke-7 ini sampai habis. Sampai jumpa di project aku ke-8 ya teman-teman semua. BYE👋🏻

Comments


bottom of page