Introduction: Nano ESP32 BLE Scanner
This instructables show how to use ESP32 to make wireless BLE signal scanner, all scanned data will send to the HTTP server via WiFi.
Step 1: Why BLE Scanner?
BLE (Bluetooth Low Energy) signal is very common for current digital device, mobile phone, wrist band, iBeacon, assets tag. This signal not only help you pair up the devices, it also can report the device status, such as battery level, heart rate, motion (walking, running, falling), temperature, panic button, anti-loss ... etc.
It is a valuable big data for location tracking if we can collect the BLE signal at certain number of position.
In long run, the BLE scanner should fix in selected position. However, selecting a right place require trial and error. A tiny wireless BLE scanner is handy to help you check where is the right place.
Step 2: Preparation
ESP32 board
I am using ESP-WROOM-32 board this time.
A Tiny Container
Any small container should be ok, I have some tiny TicTac box in hand and it just fit an ESP32 board in it, what a coincidence!
Lipo Battery
ESP32 peak current is around 250 mA. For not drawing over 1C current at anytime, Lipo Battery should over 250 mAh capacity. 852025 is the maximum size that can fit into the Tictac box and it claim it have 300 mAh, it's good enough.
Power Regulator Circuit
A 3.3 V LDO regulator, some capacitors, I have some HT7333A regulator, 22 uf and 100 uf capacitor in hand
Others
A 10k Ohm SMD resistor for pull up EN pin, a small piece of multi purpose PCB, a power switch, some coated wires, 7 pins header
ESP32 Dev Dock
In program process, it also require a ESP32 Development Dock, you may find how to make it in my previous instructables:
Step 3: Trim the PCB
Measure the dimension of your tiny container and trim the PCB to fit into it.
Step 4: Soldering Pin Header
Let's start soldering work from the 7 pins header and PCB.
Step 5: Soldering Power Circuit
Here is the connection summary:
LDO Vin -> Vcc pin header(1) -> power switch -> Lipo V+, Charge pin header(7) LDO GND -> GND pin header(2), capacitors V- pins, ESP32 GND LDO Vout -> capacitors V+ pins, ESP32 Vcc
Step 6: Soldering Pull Up Resistor
It is the most difficult soldering work in this project, the pin width in ESP32 board is only 1.27 mm. Fortunately, Vcc and EN pin is nearby, it can direct soldering resistor between both pin without wire.
ESP32 Vcc pin -> 10k Ohm resistor -> ESP32 EN pin
Step 7: Soldering Program Pins
Here are the connection summary:
Tx pin header(3) -> ESP32 Tx pin Rx pin header(4) -> ESP32 Rx pin Program pin header(5) -> ESP32 GPIO 0 pin RST pin header(6) -> ESP32 EN pin
Step 8: Cleaning Up the TicTac Box
- Eat all sweets
- Remove the stickers
Step 9: Squeeze Into the Box
Squeeze all component into the TicTac box, be careful don't tear off any wires.
Step 10: Prepare Software
Arduino IDE
Download and install Arduino IDE if not yet:
https://www.arduino.cc/en/Main/Software
arduino-esp32
Install hardware support for ESP32
Detailed instructions for installation in popular operating systems.
For Linux: https://www.arduino.cc/en/Guide/Linux (see also the Arduino playground page https://www.arduino.cc/en/Guide/Linux
For macOS X: https://www.arduino.cc/en/Guide/Linux
For Windows: https://www.arduino.cc/en/Guide/Linux
Step 11: Program the ESP32
- Download the Arduino program: https://github.com/moononournation/Arduino_BLE_Sca...
- Modify parameters:
#define WIFI_SSID "YOURAPSSID" #define WIFI_PASSWORD "YOURAPPASSWORD" #define POST_URL "http://YOURSERVERNAMEORIP:3000/"
- Select Board: Any ESP32 board
- Select Partition: No OTA / Minimal SPIFFS
- Upload
Step 12: Receive Data
If you are not yet have any HTTP server to receive the POST data, you may try to use this simple Node.js program: https://github.com/moononournation/post_data_rece...
Here are the sample data received:
Tue Mar 20 2018 08:44:41 GMT+0000 (UTC): [ { "Address": "6e:3d:f0:a0:00:36", "Rssi": -65, "ManufacturerData": "4c0010050b1047f0b3" }, { "Address": "f8:04:2e:bc:51:97", "Rssi": -94, "ManufacturerData": "75004204018020f8042ebc5197fa042ebc519601000000000000" }, { "Address": "0c:07:4a:fa:60:dd", "Rssi": -96, "ManufacturerData": "4c0009060304c0a80105" } ]
Step 13: Power Measurement
The program scan BLE signal for 30 seconds, then deep sleep 300 seconds and then scan again. For each loop, it consume around 3.9 mWh.
Theoretically, it can run: (I will update the testing result later on my Twitter)
300 mAh Lipo / 3.9 mWh @ 330 seconds = [(300 mA * 3.3 V) mWh / 3.9 mWh * 330] seconds ~83769 seconds ~23 hours
2018-04-08 Update:
I have changed to use XC6503D331 LDO regulator and made 2 measurements:
Round 1: 12:43:28 - 16:42:10 (~20 hours) 210 BLE scan POST received
Round 2: 10:04:01 - 05:36:47 (~19.5 hours) 208 BLE scan POST received
Step 14: Happy Scanning!
It time to find a place to setup you BLE tracking network!

Participated in the
Pocket-Sized Contest
35 Comments
Question 4 years ago on Step 12
Hi, can you explain how to use your node.js files?
Question 4 years ago on Introduction
How many BLE devices it will discover in each scan
4 years ago
It would be cool to make it server-less. I mean webserver hosted on ESP32 with static ip.
once site would be opened by any device, u can see list of found devices with signal strenght and so..
What do u think?
Reply 4 years ago
I think IoT in most case require some sort of server. Imagine you have ten of them in an area, it is time consuming to access the data one by one.
4 years ago
I get this error when flashing from Arduino after following your instructions, any ideas?
ets Jun 8 2016 00:22:57
rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0018,len:4
load:0x3fff001c,len:952
load:0x40078000,len:6084
load:0x40080000,len:7936
entry 0x40080310
Guru Meditation Error: Core 1 panic'ed (LoadProhibited). Exception was unhandle d.
Core 1 register dump:
PC : 0x40198e3a PS : 0x00060030 A0 : 0x800d1849 A1 : 0x3f fdad70
A2 : 0x00000000 A3 : 0x3ffd8f80 A4 : 0x3ffc98cc A5 : 0x80 000020
A6 : 0x00000000 A7 : 0x3ffd59cc A8 : 0x00000005 A9 : 0x00 000020
A10 : 0x00000010 A11 : 0x00000000 A12 : 0x80092c4c A13 : 0x3f fd5880
A14 : 0x00000003 A15 : 0x00060023 SAR : 0x00000000 EXCCAUSE: 0x00 00001c
EXCVADDR: 0x00000150 LBEG : 0x00000000 LEND : 0x00000000 LCOUNT : 0x00 000000
Backtrace: 0x40198e3a:0x3ffdad70 0x400d1846:0x3ffdadb0 0x401cd24a:0x3ffdaee0
Reply 4 years ago
Me too
5 years ago
i also did the same you did,i am using esp wroom32 form lolin32 development board.
i connected sd card reader with that board and i programming using arduino.
my project is it scans the nearby ble devices and store the datas with time form the server(NTP) and store those values in txt file in sd card and after some time the txt file is send to the server..i completed in development board.
now how to repeat the same in custom pcb??.
can you please help me
Reply 4 years ago
Please post your code! I am looking to do something similar by logging bt scans to csv on sd card.
Reply 5 years ago
Hi mohandhanush25, did you encounter any problems while following my steps?
Reply 5 years ago
i dont understand y you used, dev dock circuits
Reply 5 years ago
can you please tell me how to program wroom32 module with arduino using usb to ttl connector
Reply 5 years ago
Simply follow the dev dock circuit can program ESP32.
Reply 5 years ago
ok after this setup,will the separate wroom32 module works like a development board, can i connect sd card read with miso,mosi pins of wroom32,will it work??
Reply 5 years ago
I never tried connect SD card myself, but I have tried M5Stack, ESP32 should work with SD well.
Reply 5 years ago
after this setup, can i connect sd card module directly with wroom32 pins of miso,mosi. will it work the same way which worked in development board??
Reply 5 years ago
for power saving, you may find more info in my previous instructables: https://www.instructables.com/id/Battery-Powered-ESP-Design/
Reply 5 years ago
ok without dev dock. can i program wroom32 module with arduino??
Reply 5 years ago
dev dock only a simple circuit connect DTR and RTS to GPIO 0 and reset pins. If you insist don’t like connect this circuit, simply pull down GPIO 0 manually and then reset ESP32 to enter program model before you press upload in Arduino IDE.
5 years ago
Hi,
Thank you for sharing this project.
I have sole BLE beacon sending temperature and humidity value in the services data...how can I get those values with your Arduino program? At the moment you only get rssi, manufacturer data and address.
Thank you,
Fred
5 years ago
when i upload this code,it shows sketch is too big,how to solve it