My Seventh Project #7 [Sistem Embedded]: ESP32 Bluetooth

Vania Salsabila
8 min readMar 25, 2023

--

Hello!! Welcome back again guys!! All right, jadi kali ini aku akan menceritakan experience selama aku mengerjakan Project 7. Sesuai dengan judul blognya, di Project #7 ini kita akan membahas tentang ESP32 Bluethooth. Penasaran gak sih gimana hasil eksperimennya? Yuk! Check it out!!

— Introduction; —

Seperti judulnya, project kali ini kita akan mencoba untukmenghubungkan ESP32 dengan perangkat lain via Bluethooth. Sebenarnya apasih Bluetooth itu?Bluetooth adalah teknologi yang memungkinkan perangkat satu dengan yang lainnya saling terhubung tanpa membutuhkan kabel. Jangkauan koneksinya umumnya terbatas puluhan hingga ratusan meter saja. Bluetooth umumnya beroperasi di jaringan dengan frekuensi 2.4 GHz.

Jenis Bluetooth sendiri terbagi menjadi dua, yaitu Bluetooth Classic dan Bluetooth Low Energy. Sebenarnya, keduanya sama saja yang membedakannya adalah BLE memiliki mode “sleep” saat tidak mendapatkan connection sehingga menjadi lebih hemat energi dan pada BLE data ratesnya berkisar 1 Mb/s sedangkan pada bluetooth ~100ms.

— Tools; —

Untuk mengerjakan project ini dibutuhkan beberapa Tools yang harus disiapkan, diantaranya:

  1. ESP32 DOIT DEVKIT V1
  2. Breadboard
  3. Kabel USB (bisa menggunakan kabel yang digunakan pada project sebelumnya).
  4. Kabel jumper Male to Male (minimal 8 buah). Karena kita akan membuat rangkaian pada breadboard, maka kita memerlukan kabel jumper tipe male to male.
  5. Display OLED SSD1306, 128×64 pixels.
  6. External Sensor : BMP280
  7. Laptop/ Komputer yang memiliki Arduino IDE. Jangan lupa install dan setting Ardunio IDE-mu sama seperti pada project sebelumnya ya guys! [My First ESP32 Project: LED Blink]

— Steps & Result; —

  • Project Bluetooth Classic — Default

First Steps: Installation

Pada project ini kita akan menggunakan kembali library yang pernah digunakan pada project sebelumnya. Oleh karena itu, aku tidak akan menjelaskan kembali langkah-langkah instalasinya. Untuk teman-teman yang belum melakukan instalasi bisa cek artikel Project#4 dan Project#5 ya!

A. Assemble the Circuit;

Untuk rangkaiannya bisa di kreasikan sesuai keinginan namun kali ini aku akan memakai rangkaian yang sama dengan Project#6

B. The 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("ESP32_Vania"); //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);
}

Berikut adalah langkah — langkah untuk menghubungkan ESP32 dengan perangkat lain. Disini aku menggunakan smartphone sebagai perangkatnya:

  1. Jalankan kode program diatas pada Arduino IDE
  2. Setelah berhasil dicompile dan diupload, maka akan muncul seperti ini pada serial monitor kalian
Tampilan Serial Monitor

3. Selanjutnya, kita akan menghubungkan smartphone kita dengan ESP32. Sebelumnya kita perlu download terlebih dahulu aplikasi berikut pada perangkat yang ingin diasambungkan

4. Setelah selesai download, buka dan jalankan aplikasinya. Lalu klik garis tiga di kiri atas. Lalu klik menu Device -> Android Bluetooth Setting

5. Kemudian nyalakan bluetooth smartphone dan hubungkan dengan ESP32

6. Setelah berhasil terhubung, maka tampilan smartphone akan menjadi seperti ini

**Percobaan Mengirimkan Pesan dari Smartphone ke Arduino IDE (dan sebaliknya) melalui Bluetooth**

Selanjutnya kita akan melakukan percobaan mengirim pesan dari smartphone ke serial monitor Arduino IDE.

Jika pesan berhasil terkirim, maka akan muncul pesan di serial monitor seperti berikut:

Selanjutnya kita akan mencoba membalas pesan dari serial monitor sebagai berikut:

Jika pesan berhasil terkirim, maka akan muncul pesan di smartphone seperti berikut:

Yeayy percobaan mengirimkan pesan dari smartphone ke Arduino dan sebaliknya berhasil

**Percobaan Pengiriman Data Pembacaan Sensor dan Perintah untuk Menyalakan LED**

Di bagian ini, kita akan mencoba melakukan pengiriman data pembacaan sensor dan perintah untuk menyalakan LED dengan menggunakan bluetooth yang tersambung dengan smartphone. Disini, aku melakukan 2 percobaan yang pertama tanpa menggunakan OLED Display dan yang kedua menggunakan OLED Display.

  1. Menggunakan 2 LED tanpa menggunakan OLED Display
Rangkaian Percobaan menggunakan 2 LED tanpa menggunakan OLED Display

The Code;

#include <Wire.h>
#include <SPI.h>

#include <Adafruit_BMP280.h>
#define BMP_SCK (13)
#define BMP_MISO (12)
#define BMP_MOSI (11)
#define BMP_CS (10)
Adafruit_BMP280 bmp; // I2C

/*********
Rui Santos
Complete project details at https://randomnerdtutorials.com
*********/

// Load libraries
#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 ledPin1 = 5;
const int ledPin2 = 18;

// 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(ledPin1, OUTPUT);
Serial.begin(115200);
// Bluetooth device name
SerialBT.begin("ESP32_Vania");
Serial.println("The device started, now you can pair it with bluetooth!");

if (!bmp.begin(0x76)) {
Serial.println(F("Could not find a valid BMP280 sensor, check wiring!"));
while (1);

}

/* Default settings from datasheet. */
bmp.setSampling(Adafruit_BMP280::MODE_NORMAL, /* Operating Mode. */
Adafruit_BMP280::SAMPLING_X2, /* Temp. oversampling */
Adafruit_BMP280::SAMPLING_X16, /* Pressure oversampling */
Adafruit_BMP280::FILTER_X16, /* Filtering. */
Adafruit_BMP280::STANDBY_MS_500); /* Standby time. */
}

void loop() {


// Read received messages (LED control command)
if (SerialBT.available()){
char incomingChar = SerialBT.read();
if (incomingChar != '\n'){
message += String(incomingChar);
}
else{
message = "";
}
SerialBT.write(incomingChar);
}
// Check received message and control output accordingly
if (message =="nyalakan_led"){
digitalWrite(ledPin1, HIGH);
digitalWrite(ledPin2, HIGH);

}
else if (message =="matikan_led"){
digitalWrite(ledPin1, LOW);
digitalWrite(ledPin2, LOW);
}

else if (message =="read_temp"){
SerialBT.println("Temperature: " + String(bmp.readTemperature()) + " C");
digitalWrite(ledPin1, HIGH);
digitalWrite(ledPin2, LOW);
}
else if (message =="read_alt"){
SerialBT.println("Altitude: " + String(bmp.readAltitude()) + " m");
digitalWrite(ledPin1, LOW);
digitalWrite(ledPin2, HIGH);
}


delay(50);
}

The Result;

Video Hasil Percobaan (2x speed karena keterbatasan size Medium)

2. Menggunakan 2 LED dan OLED Display (Variasi)

Rangkaian Percobaan menggunakan 2 LED dan OLED Display

The Code;

#include "BluetoothSerial.h"
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_Sensor.h>
#include <SPI.h>
#include <Adafruit_BMP280.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;

#define BMP_SCK (13)
#define BMP_MISO (12)
#define BMP_MOSI (11)
#define BMP_CS (10)
Adafruit_BMP280 bmp; // I2C


#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
const int ledPin1 = 5;
const int ledPin2 = 18;

// Handle received and sent messages
String message = "";
char incomingChar;
String temperatureString = "";


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

if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}

bool status = bmp.begin(0x76);
if (!status) {
Serial.println("Could not find a valid BMP280 sensor, check wiring!");
while (1);
}

SerialBT.begin("ESP32_Vania");
Serial.println("The device started, now you can pair it with bluetooth!");

delay(2000);
display.clearDisplay();
display.setTextColor(WHITE);
}

void loop() {
display.clearDisplay();
// display temperature
display.setTextSize(1);
display.setCursor(0,0);
display.print("Temperature: ");
display.setTextSize(2);
display.setCursor(0,10);
display.print(String(bmp.readTemperature()));
display.print(" ");
display.setTextSize(1);
display.cp437(true);
display.write(167);
display.setTextSize(2);
display.print("C");

temperatureString = "Temperature: " + String(bmp.readTemperature()) + " C";
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 =="nyalakan_led1"){
digitalWrite(ledPin1, HIGH);
}
else if (message =="matikan_led1"){
digitalWrite(ledPin1, LOW);
}
else if (message =="nyalakan_led2"){
digitalWrite(ledPin2, HIGH);
}
else if (message =="matikan_led2"){
digitalWrite(ledPin2, LOW);
}
else if (message =="nyala2lamp"){
digitalWrite(ledPin1, HIGH);
digitalWrite(ledPin2, HIGH);
}
else if (message =="mati2lamp"){
digitalWrite(ledPin1, LOW);
digitalWrite(ledPin2, LOW);
}

// display Altitude
display.setTextSize(1);
display.setCursor(0, 35);
display.print("Altitude: ");
display.setTextSize(2);
display.setCursor(0, 45);
display.print(String(bmp.readAltitude()));
display.print(" m");

display.display();

delay(1000);
}

The Result;

Video Hasil Percobaan (2x speed karena keterbatasan size Medium)
  • Project Bluetooth Low Energy

Pada bagian kali ini, kita akan melakukan percobaan BLE, untuk rangkaian yang digunakan sama seperti bagian sebelumnya. Hanya saja kode programnay berbeda. Berikut adalah kode programnya:

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

The Result;

Video Hasil Percobaan (Gagal connect BLE)

Terlihat pada video hasil percobaan BLE ini, bahwa aku gagal mendapatkan koneksi dari ESP32. Hal ini juga terjadi kepada beberapa temanku. Hal ini terjadi dikarenakan mungkin ESP32 nya hanya ada satu saja.

— The Problems; —

Pada project kali ini, aku mengalami beberapa kendala diantaranya yaitu:

  1. Pastikan smartphone yang ingin disambungkan adalah smartphone versi Android. Karena smartphoneku merupakan versi IOS aku memiliki kendala saat menyambungkan deviceku dengan ESP32. Sehingga aku harus meminjam smartphone temanku saat mengerjakan project ini.
  2. Failed pair bluetooth to ESP32. Hal ini mungkin terjadi jika disekitar kita terdapat beberapa ESP32 sehingga membuat kita gagal terhubung dengan ESP32 milik kita karena username bluetooth ESP32nya masih default yaitu “ESP32test”. Oleh karena itu, aku menyarankan untuk mengganti username bluetooth ESP32, disini aku mengubahnya menjadi “ESP32_Vania”.

--

--

Vania Salsabila
Vania Salsabila

No responses yet