Fork me on GitHub

Project Notes

#496 ESP32 Getting Started

Getting started with the ESP32: connecting and programming from MacOSX with the Arduino IDE using a WiFi scanner script as an example.



I’ve had an ESP32-WROOM-32 kicking around for a while. Reading a copy of The Complete ESP32 Projects Guide by Dogan Ibrahim, and its given me the motivation to finally fire it up!

The Espressif documentation is now quite impressive (a far cry from early ESP8266 days). The ESP32-DevKitC V4 Getting Started Guide is just about all you need to get up and running.

In this proejct, I’ll document my journey getting the ESP32 connected and programmed from MacOSX.

The ESP32-DevKitC V4

The module I’m using is an ESP32-DevKitC V4 design:


Some key features:

  • the EN button performs a reset
  • the BOOT button is used for programming (hold the button down while programming)
  • micro USB, for programming and/or power
  • 2 LEDs: one is a power indicator, the other is connected on port D2 and available for use.

Power Supply Options:

  • Micro USB port, default power supply
  • 5V / GND header pins
  • 3V3 / GND header pins

Only one of the power options should be usde at a time.

Pinout guide from lastminuteengineers:


MacOSX Installation

After plugging the ESP32-DevKitC V4 into my MacOSX system, it wasn’t initially recognised as a character device. But it did show up on USB (checked with the Systme Information app):

CP2102 USB to UART Bridge Controller:

  Product ID: 0xea60
  Vendor ID:  0x10c4  (Silicon Laboratories, Inc.)
  Version:  1.00
  Serial Number:  0001
  Speed:  Up to 12 Mb/sec
  Manufacturer: Silicon Labs
  Location ID:  0x14200000 / 4
  Current Available (mA): 500
  Current Required (mA):  100
  Extra Operating Current (mA): 0

A quick Google search told me this is nromal, and it just means my system needs the correct driver. It is available for installation from Silicon Labs: CP210x USB to UART Bridge VCP Drivers. After installation, th eESP32 shows up as a device:

$ ls -1 /dev/cu*
/dev/cu.SLAB_USBtoUART  # <== the ESP32 via SiLabs driver

Connecting with screen ($ screen /dev/cu.SLAB_USBtoUART 115200) and pressing reset/EN proves everything is alive. Console displays the boot log:

ets Jun  8 2016 00:22:57

flash read err, 1000
ets_main.c 371
ets Jun  8 2016 00:22:57

configsip: 0, SPIWP:0x00
mode:DIO, clock div:2
entry 0x40080034
I (43) boot: ESP-IDF v2.0 2nd stage bootloader
I (44) boot: compile time 03:23:43
I (44) boot: Enabling RNG early entropy source...
I (60) boot: SPI Speed      : 40MHz
I (72) boot: SPI Mode       : DIO
I (85) boot: SPI Flash Size : 4MB
I (97) boot: Partition Table:
I (108) boot: ## Label            Usage          Type ST Offset   Length
I (131) boot:  0 phy_init         RF data          01 01 0000f000 00001000
I (154) boot:  1 otadata          OTA data         01 00 00010000 00002000
I (177) boot:  2 nvs              WiFi data        01 02 00012000 0000e000
I (200) boot:  3 at_customize     unknown          40 00 00020000 000e0000
I (224) boot:  4 ota_0            OTA app          00 10 00100000 00180000
I (247) boot:  5 ota_1            OTA app          00 11 00280000 00180000
I (270) boot: End of partition table
I (284) boot: Disabling RNG early entropy source...
I (300) boot: Loading app partition at offset 00100000
I (1476) boot: segment 0: paddr=0x00100018 vaddr=0x00000000 size=0x0ffe8 ( 65512)
I (1477) boot: segment 1: paddr=0x00110008 vaddr=0x3f400010 size=0x1c5d0 (116176) map
I (1493) boot: segment 2: paddr=0x0012c5e0 vaddr=0x3ffb0000 size=0x0215c (  8540) load
I (1523) boot: segment 3: paddr=0x0012e744 vaddr=0x40080000 size=0x00400 (  1024) load
I (1547) boot: segment 4: paddr=0x0012eb4c vaddr=0x40080400 size=0x1b028 (110632) load
I (1625) boot: segment 5: paddr=0x00149b7c vaddr=0x400c0000 size=0x00034 (    52) load
I (1626) boot: segment 6: paddr=0x00149bb8 vaddr=0x00000000 size=0x06450 ( 25680)
I (1643) boot: segment 7: paddr=0x00150010 vaddr=0x400d0018 size=0x7a544 (501060) map
I (1670) heap_alloc_caps: Initializing. RAM available for dynamic allocation:
I (1693) heap_alloc_caps: At 3FFBA6B8 len 00025948 (150 KiB): DRAM
I (1714) heap_alloc_caps: At 3FFE8000 len 00018000 (96 KiB): D/IRAM
I (1735) heap_alloc_caps: At 4009B428 len 00004BD8 (18 KiB): IRAM
I (1756) cpu_start: Pro cpu up.
I (1768) cpu_start: Single core mode
I (1781) cpu_start: Pro cpu start user code
I (1841) cpu_start: Starting scheduler on PRO CPU.
I (2098) uart: queue free spaces: 10
I (2100) wifi: wifi firmware version: c604573
I (2100) wifi: config NVS flash: enabled
I (2100) wifi: config nano formating: disabled
I (2107) wifi: Init dynamic tx buffer num: 32
I (2108) wifi: wifi driver task: 3ffc4da4, prio:23, stack:3584
I (2113) wifi: Init static rx buffer num: 10
I (2117) wifi: Init dynamic rx buffer num: 0
I (2121) wifi: Init rx ampdu len mblock:7
I (2125) wifi: Init lldesc rx ampdu entry mblock:4
I (2129) wifi: wifi power manager task: 0x3ffca14c prio: 21 stack: 2560
I (2136) wifi: wifi timer task: 3ffcb1cc, prio:22, stack:3584
E (2141) phy_init: PHY data partition validated
I (2166) phy: phy_version: 329, Feb 22 2017, 15:58:07, 0, 0
I (2167) wifi: mode : softAP (30:ae:a4:35:ef:55)
I (2170) wifi: mode : sta (30:ae:a4:35:ef:54) + softAP (30:ae:a4:35:ef:55)
I (2173) wifi: mode : softAP (30:ae:a4:35:ef:55)

Using the Arduino IDE

Next step is to try and program it with the Arduino IDE. I’m using the IDE v1.8.9 at the time of writing.

Before programming the ESP32, it is necessary to isntall the appropriate board manager. The current list of 3rd party board managers is available at

This confirmed that the current Espressif ESP32 board index is at This gets added to the additional board managers URL list in the Arduino preferences:


Once added, it is possible to search for and install esp32 in the Board Manager:


With that done, it is possible to select “ESP32 Dev Module” from the Tools > Board menu, and the examples will change accordingly. Compiling programs with this configuration is actually using Arduino core for the ESP32.

Programming Wifi Scanner

The GettingStarted.ino sketch is based on the WiFi Scanner example shipped with the ESP32 board support.

To program the ESP32 over USB, it is simply necessary to hold down the the BOOT button while compiling/uploading. If you let the button go before the final reset, the board will reset itself. If you keep the BOOT button pressed too long, it may be neceassary to press the EN/reset button to manually reset the board after programming is complete.


The GettingStarted.ino sketch will scan available SSIDs every 5 seconds and list them to the serial port (at 115200 baud)



There is no “circuit” to construct so far - simply plugging the ESP32 into the USB port! But I did go searching for a suitable Fritzing Part.

The best I found was probably the ESP32S_HiLetgo, which I’ve started to use. The pinouts are however not correct for the Devkit board I have (so care will be required when wiring from a schematic).



The version of the ESP32 DevKit I have includes useful pin labels marked on the board. However this does make the board a little too wide to fit on a standard breadboard (only one side of the board will have space to connect jumper wires). So I sit is on two connected breadboards


Credits and References

Project Source on GitHub Project Gallery Return to the LEAP Catalog

This page is a web-friendly rendering of my project notes shared in the LEAP GitHub repository.

LEAP is just my personal collection of projects. Two main themes have emerged in recent years, sometimes combined:

  • electronics - usually involving an Arduino or other microprocessor in one way or another. Some are full-blown projects, while many are trivial breadboard experiments, intended to learn and explore something interesting
  • scale modelling - I caught the bug after deciding to build a Harrier during covid to demonstrate an electronic jet engine simulation. Let the fun begin..
To be honest, I haven't quite figured out if these two interests belong in the same GitHub repo or not. But for now - they are all here!

Projects are often inspired by things found wild on the net, or ideas from the many great electronics and scale modelling podcasts and YouTube channels. Feel free to borrow liberally, and if you spot any issues do let me know (or send a PR!). See the individual projects for credits where due.