ESP32 BLE on Arduino IDE with UART Test
Today, in this tutorial we use BLE with UART Test in ESP32 Board. You need to have the ESP32 add-on installed on the Arduino IDE. Follow one of the next tutorials to prepare your Arduino IDE to work with the ESP32, if you haven’t already.
Visit these Articles https://iotbyhvm.ooo/arduino-esp32-support-on-windows-and-ubuntu/ and https://iotbyhvm.ooo/esp32-bluetooth-low-energy-ble-on-arduino-ide/
What is Bluetooth Low Energy?
Bluetooth Low Energy, BLE for short, is a power-conserving variant of Bluetooth. BLE’s primary application is short distance transmission of small amounts of data (low bandwidth). Unlike Bluetooth that is always on, BLE remains in sleep mode constantly except for when a connection is initiated.
This makes it consume very low power. BLE consumes approximately 100x less power than Bluetooth (depending on the use case).
Take a look at the table below that compares BLE and Bluetooth in more detail.
Bluetooth Low Energy (LE) | Bluetooth Basic Rate/ Enhanced Data Rate (BR/EDR) |
|
---|---|---|
Optimized For… | Short burst data transmission | Continuous data streaming |
Frequency Band | 2.4GHz ISM Band (2.402 – 2.480 GHz Utilized) | 2.4GHz ISM Band (2.402 – 2.480 GHz Utilized) |
Channels | 40 channels with 2 MHz spacing (3 advertising channels/37 data channels) |
79 channels with 1 MHz spacing |
Channel Usage | Frequency-Hopping Spread Spectrum (FHSS) | Frequency-Hopping Spread Spectrum (FHSS) |
Modulation | GFSK | GFSK, π/4 DQPSK, 8DPSK |
Power Consumption | ~0.01x to 0.5x of reference (depending on use case) |
1 (reference value) |
Data Rate | LE 2M PHY: 2 Mb/s LE 1M PHY: 1 Mb/s LE Coded PHY (S=2): 500 Kb/s LE Coded PHY (S=8): 125 Kb/s |
EDR PHY (8DPSK): 3 Mb/s EDR PHY (π/4 DQPSK): 2 Mb/s BR PHY (GFSK): 1 Mb/s |
Max Tx Power* | Class 1: 100 mW (+20 dBm) Class 1.5: 10 mW (+10 dbm) Class 2: 2.5 mW (+4 dBm) Class 3: 1 mW (0 dBm) |
Class 1: 100 mW (+20 dBm) Class 2: 2.5 mW (+4 dBm) Class 3: 1 mW (0 dBm) |
Network Topologies | Point-to-Point (including piconet) Broadcast Mesh |
Point-to-Point (including piconet) |
for more information please visit https://www.bluetooth.com/
ESP32 BLE on Arduino IDE with UART Test
Flash this code in ESP32 Board via Ar. If you don’t know please visit links given in first paragraph.
/* Create a BLE server that, once we receive a connection, will send periodic notifications. The service advertises itself as: 6E400001-B5A3-F393-E0A9-E50E24DCCA9E Has a characteristic of: 6E400002-B5A3-F393-E0A9-E50E24DCCA9E - used for receiving data with "WRITE" Has a characteristic of: 6E400003-B5A3-F393-E0A9-E50E24DCCA9E - used to send data with "NOTIFY" The design of creating the BLE server is: 1. Create a BLE Server 2. Create a BLE Service 3. Create a BLE Characteristic on the Service 4. Create a BLE Descriptor on the characteristic 5. Start the service. 6. Start advertising. In this example rxValue is the data received (only accessible inside that function). And txValue is the data to be sent, in this example just a byte incremented every second. */
#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>
BLECharacteristic *pCharacteristic; bool deviceConnected = false; float txValue = 0; const int readPin = 32; // Use GPIO number. See ESP32 board pinouts const int LED = 25; // Could be different depending on the dev board. I used the DOIT ESP32 dev board. //std::string rxValue; // Could also make this a global var to access it in loop() // See the following for generating UUIDs: // https://www.uuidgenerator.net/ #define SERVICE_UUID "6E400001-B5A3-F393-E0A9-E50E24DCCA9E" // UART service UUID #define CHARACTERISTIC_UUID_RX "6E400002-B5A3-F393-E0A9-E50E24DCCA9E" #define CHARACTERISTIC_UUID_TX "6E400003-B5A3-F393-E0A9-E50E24DCCA9E" 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("*********"); Serial.print("Received Value: "); for (int i = 0; i < rxValue.length(); i++) { Serial.print(rxValue[i]); } Serial.println(); // Do stuff based on the command received from the app if (rxValue.find("ON") != -1) { Serial.println("Turning ON!"); digitalWrite(LED, HIGH); } else if (rxValue.find("OFF") != -1) { Serial.println("Turning OFF!"); digitalWrite(LED, LOW); } Serial.println(); Serial.println("*********"); } } }; void setup() { Serial.begin(115200); pinMode(LED, OUTPUT); // Create the BLE Device BLEDevice::init("ESP32 UART Test"); // Give it a name // Create the BLE Server BLEServer *pServer = BLEDevice::createServer(); pServer->setCallbacks(new MyServerCallbacks()); // Create the BLE Service BLEService *pService = pServer->createService(SERVICE_UUID); // Create a BLE Characteristic 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()); // Start the service pService->start(); // Start advertising pServer->getAdvertising()->start(); Serial.println("Waiting a client connection to notify..."); } void loop() { if (deviceConnected) { // Fabricate some arbitrary junk for now... txValue = analogRead(readPin) / 3.456; // This could be an actual sensor reading! // Let's convert the value to a char array: char txString[8]; // make sure this is big enuffz dtostrf(txValue, 1, 2, txString); // float_val, min_width, digits_after_decimal, char_buffer // pCharacteristic->setValue(&txValue, 1); // To send the integer value // pCharacteristic->setValue("Hello!"); // Sending a test message pCharacteristic->setValue(txString); pCharacteristic->notify(); // Send the value to the app! Serial.print("*** Sent Value: "); Serial.print(txString); Serial.println(" ***"); // You can add the rxValue checks down here instead // if you set "rxValue" as a global var at the top! // Note you will have to delete "std::string" declaration // of "rxValue" in the callback function. // if (rxValue.find("ON") != -1) { // Serial.println("Turning ON!"); // digitalWrite(LED, HIGH); // } // else if (rxValue.find("OFF") != -1) { // Serial.println("Turning OFF!"); // digitalWrite(LED, LOW); // } } delay(1000); }
Pin Diagram
Now Connect a LED with ESP 32 Board.
+ ===========> PIN 25
– ===========> GND
Now Install BLE Scanner Android App (Link given above) and connect with ESP32 UART Test and click on RX UUID.
Here Type ON for Turn On LED and Type OFF for Turn Off LED.
Remember :
The service advertises itself as: 6E400001-B5A3-F393-E0A9-E50E24DCCA9E
Has a characteristic of: 6E400002-B5A3-F393-E0A9-E50E24DCCA9E – used to send data with “write”
Has a characteristic of: 6E400003-B5A3-F393-E0A9-E50E24DCCA9E – used for receiving data with “notify”
Download an android appin your mobile BLE Scanner App https://play.google.com/store/apps/details?id=com.macdom.ble.blescanner&hl=en_IN
Or you can use another app nRF Connect for Mobile App
https://play.google.com/store/apps/details?id=no.nordicsemi.android.mcp&hl=en_IN
You may like also:
- IoT with ESP8266
- ESP 32 BLE with DHT11
- ESP 32 BLE on Arduino IDE with UART Test
- ESP 32 Bluetooth Low Energy (BLE) on Arduino IDE
- ArduinoOTA ESP32: Wi-Fi (OTA) Wireless Update from the Arduino IDE
- Arduino ESP32 support on Windows and Ubuntu
- ESP32 with LoRa using Arduino IDE
- Arduino Support for ESP8266 with simple test code
Pingback: ESP32 BLE with DHT11 - How To - IoTbyHVM
Pingback: Android Things - OS for IoT and embedded devices - IoTbyHVM
Pingback: Johnny Five : The JavaScript Robotics & IoT Platform
Pingback: How to Fix Broken Packages in Ubuntu - IoTbyHVM - Bits & Bytes of IoT
Pingback: How to Fix Ubuntu Update Errors - IoTbyHVM - Bits & Bytes of IoT
Pingback: Managing Files with NodeMCU | NodeMCU Examples
Pingback: IoT Sensors and Actuators - IoTbyHVM - Bits & Bytes of IoT
Pingback: IoT Protocols and Communication APIs - IoTbyHVM - Bits & Bytes of IoT
Pingback: ATOMIC Pi - A high power alternative to RPi - IoTbyHVM
Pingback: Symphony Link LPWAN IoT Network - IoTbyHVM - Bits & Bytes of IoT
Pingback: Interface MQ135 (Gas Sensor) with NodeMCU - IoTbyHVM
Pingback: Top 10 IoT Cloud Platforms - CompileIoT
Pingback: IoT OS and RTOS for Internet of Things Devices - CompileIoT
Pingback: Interface LDR module with NodeMCU - IoTbyHVM - Bits & Bytes of IoT
Pingback: Physical and Logical Design of IoT - IoTbyHVM