ESP32 BLE device not visible in the phone Bluetooth settings

A BLE device often does not show in the normal Bluetooth settings list. Use a BLE scanner app on the phone.

What the message means

The classic Bluetooth settings list shows devices that pair as audio or serial devices. A BLE peripheral advertises and is found by apps that scan for it.

Fix it in this order

  1. Install a BLE scanner app and look for the name you set in BLEDevice::init().
  2. Check that advertising is started, with BLEDevice::startAdvertising() or the equivalent.
  3. Restart advertising after a client disconnects.
  4. The classic ESP32 supports both classic Bluetooth and BLE, but these are different. Use the one your phone app expects.
  5. Keep the board close to the phone while testing.
  6. On newer phones, allow the nearby devices and location permissions for the app.

Why it happens

The Bluetooth settings screen on a phone is built for classic devices that pair, such as headphones and serial adapters. A BLE peripheral does not pair in that way. Instead it repeatedly broadcasts short advertising packets that carry its name and services. Only an app that scans for BLE advertising can display it, so an empty settings list says nothing about whether the ESP32 is working.

The ESP32 also has separate classic Bluetooth and BLE stacks, and each needs its own setup. If advertising never starts, no scanner can see the board, so the first check is whether the sketch calls the advertising start function and keeps running. After a client disconnects, advertising often has to be restarted in code. Permissions on the phone also decide whether a scanner can see nearby devices.

If you see this, do this

You seeDo this
Not in settings, found in scannerNormal for BLE.
Not found anywhereAdvertising not started.

Confirm the fix

  1. Open a BLE scanner app and look for the name set in BLEDevice::init(). Seeing it confirms advertising works, even if Settings shows nothing.
  2. Print a message after startAdvertising() runs, then disconnect the phone and confirm the scanner sees the device again.
  3. Use a small serial print to show the advertising state, then check that the scanner lists the device after boot.

Common mistake: Many readers assume that a BLE device should appear in the phone’s Bluetooth settings list, so they conclude the ESP32 has failed when a scanner app would show it.

HC-05 no response, HC-06 pairing.

Last reviewed: November 2026. These are the usual causes and the order that finds them fastest. Test on your own board; clones and cables differ.

Why this happens

Classic Bluetooth and BLE are different radio protocols with different discovery. The Bluetooth page in phone settings is built to pair classic devices such as headphones or serial adapters. A BLE peripheral does not need to pair first. It sends short advertising packets on three advertising channels at a set interval, and any app that is scanning receives them.

So the board can be working and still absent from settings. Another detail is that a peripheral usually stops advertising when a client connects. Unless the code restarts advertising in the disconnect callback, the device disappears after the first session. The legacy advertising packet is also small, 31 bytes, so a long name may be shortened or moved to the scan response.

How to confirm the cause

  • Install a BLE scanner app and look for the exact name passed to BLEDevice::init(). Seeing it proves advertising works.
  • Print a message right after you start advertising. If the message never prints, the sketch stops earlier.
  • On Android, turn on location and allow nearby-devices permissions for the scanner. Without them, results may be empty on some phone versions.
  • Move the phone within a metre or two and check the signal strength shown by the scanner.
  • Check that the chip supports BLE. The ESP32-S2 has no Bluetooth, and the C3 and S3 have BLE only, with no classic Bluetooth.

Worked example

This minimal sketch starts advertising a name. Look for RoboBLE in the scanner app.

#include <BLEDevice.h>
void setup() {
  Serial.begin(115200);
  BLEDevice::init("RoboBLE");
  BLEServer *server = BLEDevice::createServer();
  BLEAdvertising *adv = BLEDevice::getAdvertising();
  adv->setScanResponse(true);
  BLEDevice::startAdvertising();
  Serial.println("advertising as RoboBLE");
}
void loop() {}

After this works, add services and characteristics. To keep it visible after each session, call startAdvertising() again inside the callback that runs on disconnect.

Common mistakes

  • Looking for a BLE device in the classic Bluetooth settings list.
  • Mixing BluetoothSerial code with a BLE phone app, or the reverse.
  • Forgetting to restart advertising after a disconnect.
  • Testing with a scanner app that has no permission to scan.

If this did not fix it

  • Phone caches an old name: turn Bluetooth off and on, or clear the scanner’s list.
  • Another device is connected: some sketches allow one connection at a time.
  • Name too long: shorten it to a few characters and test again.