By | 27/11/2022
ESP32 BLE Arduino IDE

Mencoba program langsung dari example library ESP32 dengan Arduino IDE mungkin buat sebagian orang adalah hal yang sulit, maka dari itu tutorial ini saya buat dengan tujuan supaya yang kesulitan bisa sedikit terbantu dalam memahami BLE pada ESP32.

BLE sendiri singkatan dari Bluetooth Low Energy, ntah tulisanya benar atau salah silakan kalian cek sendiri bahasa inggris nya. Saya bertele-tele menjelaskan tentang BLE ESP32 supaya bisa masuk dalam pencarian google dengan keyword yang pendek seperti ESP32 BLE, Tutorial ESP32 BLE, Penjelasan BLE ESP32 Arduino IDE, Kontrol LED BLE ESP32, BLE ESP32 Aplikasi Android, Komunikasi Antar ESP32 BLE.

Baiklah mungkin itu saja penjelasan yang bertele-tele nya sekarang lanjut yang agak serius menjelaskan bagaimana mencoba BLE pada ESP32 dengan Arduino IDE, Pertama yang perlu dipersiapkan tentu saja modul ESP32 dengan tipe apapun yang kalian punya.

Download Aplikasi Arduino IDE dan Install Board ESP32

Saya males menjelaskan part ini karena kalo sudah ke tahap cari judul tengan ESP32 BLE kalian sudah menginstall arduino IDE dan sudah ready board ESP32 nya. jika belum ya belajar lagi cari aja diblog ini ada tutorialnya, kalo kamu beruntung mungkin ada saran link yang mengarah ke tutorial ESP32 arduino IDE.

Download Aplikasi nRF connect di playstore

kira-kira begini penampakan aplikasinya pada hp android, kalo kalian pake iOS saya kurang tahu, karena ga punya hp nya silakan cari sendiri.

Skenario ESP32 BLE Kontrol LED Bawaan

Ceritanya kita akan mengontrol LED bawaan biasanya terhubung ke pin IO2, IO4 atau ntahlah pin berapa aja liat masing-masing tipe board nya kemudian baca pinout nya di google.com jadi yang diperlukan adalah dari aplikasi android mengirim data berupa perintah ON/OFF untuk ESP32, dan ESP32 membaca data yang dikirim oleh aplikasi melalui BLE.

Sebelum itu, pada BLE ada yang namanya UUID, saya juga ga terlalu paham, tapi disini akan ada UUID untuk service dan juga untuk characteristic. langsung aja kalo kalian mau generate UUID untuk BLE sudah dikasih tau sama library nya bisa klik https://www.uuidgenerator.net/, Bebas mau pilih V1 atau V4.

Code arduino ESP32 BLE Kontrol Relay / LED

#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"


class MyCallbacks: public BLECharacteristicCallbacks {
    void onWrite(BLECharacteristic *pCharacteristic) {
      std::string value = pCharacteristic->getValue();

      if (value.length() > 0) {
        Serial.println("*********");
        Serial.print("New value: ");
        for (int i = 0; i < value.length(); i++)
          Serial.print(value[i]);

        if (value == "on"){
          digitalWrite(2, HIGH);
        } else if (value == "off"){
          digitalWrite(2, LOW);
        }

        Serial.println();
        Serial.println("*********");
      }
    }
};

void setup() {
  Serial.begin(115200);
  pinMode(2, OUTPUT);

  Serial.println("1- Download and install an BLE scanner app in your phone");
  Serial.println("2- Scan for BLE devices in the app");
  Serial.println("3- Connect to MyESP32");
  Serial.println("4- Go to CUSTOM CHARACTERISTIC in CUSTOM SERVICE and write something");
  Serial.println("5- See the magic =)");

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

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

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

  pCharacteristic->setCallbacks(new MyCallbacks());

  pCharacteristic->setValue("Hello World");
  pService->start();

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

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

Kode di atas merupakan modifikasi dari example bawaan library ESP32, saat kalian mengirim data string “on” dari aplikasi nRF connect melalui BLE maka akan menset pin IO2 menjadi berlogika HIGH atau 1, dan jika mengirim data string “off” maka akan menset pin IO2 menjadi berlogika LOW atau 0.

Kirim Data dari ESP32 ke Aplikasi Android dengan BLE

Untuk yang ini skenario nya, dari ESP32 akan mengirim data

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

BLEServer* pServer = NULL;
bool deviceConnected = false;
bool oldDeviceConnected = false;
uint32_t value = 0;

// 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"

BLECharacteristic valueCharacteristic(
  CHARACTERISTIC_UUID,
  BLECharacteristic::PROPERTY_READ   |
  BLECharacteristic::PROPERTY_WRITE  |
  BLECharacteristic::PROPERTY_NOTIFY 
);
BLEDescriptor valueDescriptor(BLEUUID((uint16_t)0x2903));


class MyServerCallbacks: public BLEServerCallbacks {
    void onConnect(BLEServer* pServer) {
      deviceConnected = true;
    };

    void onDisconnect(BLEServer* pServer) {
      deviceConnected = false;
    }
};



void setup() {
  Serial.begin(115200);

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

  // Create the BLE Server
  pServer = BLEDevice::createServer();
  pServer->setCallbacks(new MyServerCallbacks());

  // Create the BLE Service
  BLEService *pService = pServer->createService(SERVICE_UUID);

  pService->addCharacteristic(&valueCharacteristic);
  valueDescriptor.setValue("New Value");
  valueCharacteristic.addDescriptor(new BLE2902());

  // Start the service
  pService->start();

  // Start advertising
  BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
  pAdvertising->addServiceUUID(SERVICE_UUID);
  pAdvertising->setScanResponse(false);
  pAdvertising->setMinPreferred(0x0);  // set value to 0x00 to not advertise this parameter
  BLEDevice::startAdvertising();
  Serial.println("Waiting a client connection to notify...");
}

void loop() {
  // notify changed value
  if (deviceConnected) {
    valueCharacteristic.setValue((uint8_t*)&value, 4);
    valueCharacteristic.notify();
    value++;
    delay(3); // bluetooth stack will go into congestion, if too many packets are sent, in 6 hours test i was able to go as low as 3ms
  }
  // disconnecting
  if (!deviceConnected && oldDeviceConnected) {
    delay(500); // give the bluetooth stack the chance to get things ready
    pServer->startAdvertising(); // restart advertising
    Serial.println("start advertising");
    oldDeviceConnected = deviceConnected;
  }
  // connecting
  if (deviceConnected && !oldDeviceConnected) {
    // do stuff here on connecting
    oldDeviceConnected = deviceConnected;
  }
}

Oke mungkin itu aja yang bisa saya buat kali ini, nanti kalo sempet saya buat tutorial videonya, tapi kalo kalian ga sabar bisa langsung pakai jasa saya aja. hubungi wa saya dan jelaskan kebutuhanya.

Leave a Reply

Your email address will not be published. Required fields are marked *