Pair your phone with an ESP32, send "hello" both ways, and understand exactly what every line of code does. Each step takes under a minute. No fluff.
Beginner5 modulesArduino IDEAny ESP32
Time to first message6 min
Each card is 30–90 seconds. Tick them off as you go — progress saves automatically.
Your progress
0 / 5
5 cards. Click as you finish.
Saves to your browser · no account needed
MODULE 01
Hardware & wiring
~ 1 min · interactive pinout
Bluetooth lives inside the ESP32 — no external module needed. For this quick start, the only "wiring" is plugging in USB. Hover any pin in the diagram to see what it does. The four pins we'll touch later are highlighted in purple.
Pins we use today
USB-C · power + serial5 V
GPIO 2 · on-board LEDout
3V3 · supplies sensors later+
GND · common ground−
Classic vs BLE. ESP32 supports both. Classic BT is easier to test from a phone; BLE is what production wearables use. We start with Classic.
Same sketch, three ways. Pick the framework you're already in. We've tested all three on the LB-32 board — none need extra libraries.
sketch.ino · 24 lines
// sketch.ino — pair, then toggle the LED on incoming bytes#include<BluetoothSerial.h>
BluetoothSerial BT;constint LED =2;voidsetup(){pinMode(LED, OUTPUT);
Serial.begin(115200);
BT.begin("LB-ESP32");// device name your phone sees
Serial.println("Ready. Pair with LB-ESP32 from your phone.");}voidloop(){if(BT.available()){char c = BT.read();digitalWrite(LED,!digitalRead(LED));
BT.printf("got %c (0x%02X)\n", c, c);
Serial.printf("phone → board: %c\n", c);}}
# main.py — BLE peripheral version (Classic BT isn't on MicroPython)import bluetooth, machine, time
from machine import Pin
led =Pin(2, Pin.OUT)
ble = bluetooth.BLE()
ble.active(True)defon_event(event, data):if event ==3:# _IRQ_GATTS_WRITE
led.value(not led.value())
ble.irq(on_event)print("Advertising as LB-ESP32 · open nRF Connect to talk to it")
The whole sketch is 24 lines. Three of them name your device, define the LED pin, and start Bluetooth. The loop just toggles the LED on every incoming byte.
MODULE 03
Bluetooth init & pairing
~ 90 sec · 4-stage flow
Pairing is four phases. The active phase advances every few seconds — or tap a card to focus it.
MODULE 04
Send your first message
~ 60 sec · simulated
Tap Run example below to watch what the serial monitor will show when a phone sends "hello". Real boards: open nRF Connect (iOS / Android), connect to LB-ESP32, type and send.
Serial Monitor · 115200 baudCONNECTED
> Ready when you are.
On your phone
Bluetooth · ONScanning…
LB-ESP32
3C:71:BF:08:1A:24
Available
Office printer
5C:30:9E:21:7B:02
Saved
MODULE 05
Common issues
~ 45 sec · 5 fixes
The five things that trip up 90% of beginners. Each one is a one-line fix.
LB-ESP32 doesn't show up in my phone's BT list
Your sketch needs BT.begin("LB-ESP32") in setup(). If it's there, the radio may be busy: power-cycle the board and turn BT off/on on your phone. iOS sometimes caches old devices — "Forget Device" and re-scan.
Pairs, but nothing happens when I send data
Most phone BT chat apps default to BLE — but Classic BT and BLE are different protocols. Either install Serial Bluetooth Terminal (Android) which speaks Classic, or switch your sketch to BLEDevice::createServer() (BLE example in the docs).
Compile fails: BluetoothSerial.h: No such file
You picked an ESP32 variant that doesn't have Classic BT (e.g. ESP32-S2). Switch the board to ESP32 Dev Module in Tools, or use the BLE version of the sketch — S2/S3 boards only support BLE.
Sketch flashes but board keeps rebooting
Partition table is too small. Tools → Partition Scheme → Huge APP (3MB No OTA / 1MB SPIFFS). Classic BT brings in a fat stack and the default partition won't fit.
Pairing succeeds but disconnects after a few seconds
Likely under-powered USB. Cheap hubs can't deliver 500 mA during BT bursts. Try a different cable, plug straight into the laptop, or power the board from an external 5V supply.
Nice work. You've shipped Bluetooth.
Next up: send sensor data instead of bytes, or jump to ESP-NOW for board-to-board comms.