/ ESP32 Development Board Guide
← All Guides
🌐 Translate:
🔵 30-Pin · Micro-USB 🟣 38-Pin · Micro-USB 🟠 38-Pin · USB Type-C 📶 Wi-Fi + Bluetooth ⚠ 3.3V logic ✅ Arduino IDE + MicroPython

ESP32 Development Board
Setup Guide

The Tishvi ESP32 is a powerful Wi-Fi + Bluetooth development board — significantly more capable than the Arduino UNO R3. This guide covers all three variants: the 30-pin (Micro-USB), 38-pin (Micro-USB), and 38-pin (USB Type-C) — same SoC and code for all three.

📺

Video walkthrough

Prefer to watch? These cover the same steps.

ESP32 Getting Started Tutorial
YouTube
▶ YouTube
ESP32 Arduino IDE Setup & First Project
YouTube
▶ YouTube

Community videos. Tishvi is not affiliated with creators.

1

About the Tishvi ESP32

What it is and how it compares to the Arduino UNO R3.

The ESP32 is a dual-core microcontroller with built-in Wi-Fi and Bluetooth — on a single chip. Unlike the Arduino UNO R3 (which needs external shields for wireless), the ESP32 is ready for IoT, remote control, and networked projects straight out of the box. Both Tishvi variants share the same SoC and are compatible with the Arduino IDE and MicroPython.

🧠
SoC
ESP32-D0WD-V3 (rev 3.1)
CPU
Dual-core Xtensa LX6 + LP co-processor
🕐
Clock Speed
Up to 240 MHz
📶
Wi-Fi
802.11 b/g/n 2.4 GHz
🔵
Bluetooth
Classic BT + BLE
💾
Flash Memory
4 MB
🔌
USB Bridge
CP2102 (Micro-USB)
or CH9102 (Type-C)
Logic Voltage
3.3V (NOT 5V tolerant)
🔋
Regulator
AMS1117-3.3
📡
Antenna
Integrated PCB trace
🖲️
Buttons
RST (reset) + BOOT (flash)
🔩
Pin Pitch
2.54 mm (breadboard compatible)
⚠️
3.3V logic — not 5V tolerant. The ESP32 GPIO pins operate at 3.3V. Connecting a 5V signal (such as from an Arduino UNO output or a 5V sensor) directly to an ESP32 GPIO pin can permanently damage the chip. Always use a logic level converter or voltage divider when interfacing with 5V devices.
2

Identify Your Board

Three variants — same SoC, same code. Identify yours by pin count and connector.

All three Tishvi ESP32 variants use the same ESP32-D0WD-V3 chip and are functionally identical for all purposes — programming, pinout, libraries, and sketches. The differences are the number of exposed GPIO pins and the USB connector type. Count the pins on one side of your board to identify it.

🔵 30-Pin · Micro-USB

  • 15 pins per side (30 total)
  • ~55 × 28 mm
  • Breadboard-friendly — leaves columns free on both sides
  • Micro-USB connector
  • EN + BOOT buttons
  • USB bridge: CP2102

🟣 38-Pin · Micro-USB

  • 19 pins per side (38 total)
  • ~51–55 × 28 mm
  • Extra SPI flash pins exposed (avoid using SD0–SD3, CMD, CLK)
  • Micro-USB connector
  • RST + BOOT buttons
  • USB bridge: CP2102

🟠 38-Pin · USB Type-C

  • 19 pins per side (38 total) — same pinout as 38-pin Micro-USB
  • ~51–55 × 28 mm
  • Same SPI flash pin caution applies (avoid SD0–SD3, CMD, CLK)
  • USB Type-C connector — reversible, can't plug in wrong way
  • RST + BOOT buttons
  • USB bridge: CP2102 or CH9102 (check Device Manager for driver needed)
38-Pin Micro-USB and 38-Pin USB Type-C are completely interchangeable. The pin layout, GPIO numbers, sketch code, libraries, and upload procedure are identical. The only practical difference is the USB connector — Type-C is reversible and slightly more durable. Everything from Step 3 onwards in this guide applies equally to both.
⚠️
USB Type-C variant — check your driver. The Type-C board may use a CH9102 USB bridge instead of the CP2102. If Device Manager shows an unknown device on Windows, search for the CH9102 driver (also sometimes listed as CH910x or WCH USB-Serial). On macOS 10.15+ and most Linux systems, CH9102 is supported natively.
💡
Throughout this guide, sections specific to one variant are marked with 30-PIN or 38-PIN. The BOTH badge (and unmarked sections) apply to all three variants including the USB Type-C board.
3

Pin Layout 30-PIN

All 30 pins, colour-coded by function.

ESP32 30-PIN ESP32-D0WD Micro-USB EN BOOT D23 D22 TXD0 RXD0 D21/SDA D19 D18 D5 TX2 RX2 D4 D2★ D15 GND 3V3 EN VP (D36) ① VN (D39) ① D34 ① D35 ① D32 D33 D25 (DAC1) D26 (DAC2) D27 D14 D12 ② D13 GND VIN (5V) ① Input-only ② Strapping pin ★ Built-in LED
Power (3V3 / VIN)
GND
GPIO (digital / PWM / ADC)
ADC Input-ONLY (①)
UART
I2C (SDA/SCL)
Built-in LED (★)
Strapping pin (②)
⚠️
① ADC Input-Only pins (VP/D36, VN/D39, D34, D35): These pins can only read analog/digital input — they have no output driver. Attempting pinMode(34, OUTPUT) or digitalWrite(34, HIGH) will silently fail. Use D32, D33, D25–D27 for output + ADC combined.
⚠️
② D12 strapping pin: GPIO 12 controls flash voltage selection at boot. Driving it HIGH during power-on causes the ESP32 to select a 1.8V flash supply, which will fail with the 3.3V flash on this board, and the board will not boot. Avoid using D12 as an output if possible; if you must use it, ensure it is LOW at boot time.
4

Pin Layout 38-PIN

All 38 pins, colour-coded by function.

ESP32 38-PIN ESP32-D0WD-V3 Micro-USB RST BOOT 3V3 EN VP ① VN ① G34 ① G35 ① G32 G33 G25 G26 G27 G14 G12 ② GND G13 SD2 ③ SD3 ③ CMD ③ V5 (VIN) GND G23 G22/SCL TXD RXD G21/SDA GND G19 G18 G5 G17 G16 G4 G0 ② G2 ★ G15 SD1 ③ SD0 ③ CLK ③ ① Input-only ② Strapping ③ SPI Flash — do not use ★ Built-in LED
Power
GND
GPIO
Input-Only (①)
UART
I2C
Built-in LED (★)
Strapping (②)
SPI Flash — avoid (③)
🚫
③ SPI Flash pins (SD0, SD1, SD2, SD3, CMD, CLK) — do not use as GPIO. These 6 pins on the 38-pin variant are physically connected to the internal 4 MB flash memory chip. Using them as I/O will corrupt flash reads/writes during operation, causing random crashes or, in extreme cases, a bricked board. Leave them unconnected.
5

Arduino IDE Setup BOTH

Add ESP32 support to Arduino IDE on Windows, macOS, or Linux.

The ESP32 is not included in Arduino IDE by default. You need to install Espressif's board package, then install the CP2102 USB-UART driver. Steps 1–3 are done only once.

1

Install or update Arduino IDE

Download Arduino IDE 2.x from arduino.cc/en/software. Run the installer. Version 2.x is required — the legacy IDE 1.x works but the Library Manager and Board Manager are less convenient.

2

Add the ESP32 board manager URL

Open Arduino IDE → File → Preferences. In the "Additional boards manager URLs" field, add:

Board Manager URL
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json

If there is already a URL in the field, click the small icon to the right of the field to open the multi-URL editor and add it on a new line.

3

Install the ESP32 board package

Go to Tools → Board → Boards Manager… (or click the board icon in the left sidebar). Search for esp32. Install "esp32 by Espressif Systems". This download is ~200 MB and may take a few minutes.

4

Install the USB driver (if needed)

Connect the ESP32 via USB. Open Device Manager → Ports (COM & LPT).
30-pin & 38-pin Micro-USB: if you see "CP210x USB to UART Bridge" the driver is already installed. If you see a warning icon, search for "Silicon Labs CP210x driver" and install from Silicon Labs' site.
38-pin USB Type-C: the board may use a CH9102 bridge instead. If you see an unknown device, search for "WCH CH9102 driver" or "CH910x driver" and install. Reconnect the board after installing either driver.

5

Select board and port

Go to Tools → Board → esp32 → "ESP32 Dev Module". Then Tools → Port and select the COM port that appeared when you plugged in the board (e.g. COM3, COM5). If no port appears, the driver from step 4 is needed.

6

Set upload speed

Tools → Upload Speed → 921600. This gives the fastest reliable upload. If uploads fail consistently, try 460800.

Open Tools → Get Board Info. If it returns ESP32 information, your setup is complete. Proceed to the First Sketch section.
1

Install Arduino IDE 2.x

Download from arduino.cc/en/software. Open the .dmg, drag Arduino IDE to your Applications folder.

2

Add board manager URL

Arduino IDE → Preferences (⌘,). Paste into "Additional boards manager URLs":

Board Manager URL
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
3

Install ESP32 board package

Tools → Boards Manager → search esp32 → install "esp32 by Espressif Systems".

4

USB driver on macOS

Micro-USB variants (CP2102): macOS 10.13+ includes the CP210x driver natively. Connect and look for /dev/cu.usbserial-xxxx or /dev/cu.SLAB_USBtoUART in Tools → Port.
USB Type-C variant (CH9102): macOS 10.15+ supports CH9102 natively — look for /dev/cu.wchusbserial-xxxx. On older macOS search for "WCH CH9102 macOS driver" if no port appears.

5

Select board and port

Tools → Board → esp32 → "ESP32 Dev Module". Then Tools → Port → /dev/cu.usbserial-xxxx.

6

Set upload speed

Tools → Upload Speed → 921600.

💡
On macOS Sonoma / Ventura, if you see a security prompt when connecting, go to System Settings → Privacy & Security and allow the driver. You may need to restart the Mac after approving.
1

Install Arduino IDE

Download the AppImage from arduino.cc/en/software. Make it executable and run it:

bash
chmod +x arduino-ide_*.AppImage
./arduino-ide_*.AppImage
2

Add your user to the dialout group

This is required to access USB serial ports without sudo:

bash
sudo usermod -a -G dialout $USER

Log out and log back in for this to take effect. Without this step, the upload will fail with a "Permission denied" error on /dev/ttyUSB0.

3

Add board manager URL and install package

Same as Windows step 2 & 3. After adding the URL, install "esp32 by Espressif Systems" from Boards Manager.

4

Find the port

Connect the ESP32 and run:

bash
ls /dev/ttyUSB*

The port is usually /dev/ttyUSB0. Select it in Tools → Port.

5

Select board and upload speed

Tools → Board → esp32 → ESP32 Dev Module. Upload Speed: 921600.

💡
If you see ModemManager interference (upload starts then hangs), run: sudo systemctl stop ModemManager and retry the upload.
6

MicroPython Setup BOTH

Flash MicroPython firmware and write Python code for the ESP32.

MicroPython is an alternative to Arduino IDE — you write Python instead of C++. Flashing MicroPython replaces the Arduino sketch firmware. To switch back to Arduino, simply upload any Arduino sketch.

1

Install Python 3

Download from python.org. During install, tick "Add Python to PATH". Verify in Command Prompt:

cmd
python --version
2

Install esptool

cmd
pip install esptool
3

Download MicroPython firmware

Go to micropython.org/download/esp32/. Download the latest stable .bin file for ESP32 / GENERIC. Save it to a known folder (e.g. C:\esp32\).

4

Find your COM port

Open Device Manager → Ports (COM & LPT). Note the COM number, e.g. COM3.

5

Erase existing firmware

cmd
python -m esptool --chip esp32 --port COM3 erase_flash

Replace COM3 with your actual port number.

6

Flash MicroPython

cmd
python -m esptool --chip esp32 --port COM3 --baud 460800 write_flash -z 0x1000 esp32-firmware.bin

Replace esp32-firmware.bin with the actual filename you downloaded.

7

Install Thonny IDE and connect

Download Thonny from thonny.org (free). Open Thonny → Tools → Options → Interpreter. Select MicroPython (ESP32) and choose your COM port. Click OK. The Python REPL (interactive shell) will appear at the bottom.

Type print("Hello ESP32") in the Thonny REPL and press Enter. If the ESP32 replies, MicroPython is running correctly.
1

Install Python 3 and esptool

Terminal
pip3 install esptool

If Python is not installed, download from python.org or install via Homebrew: brew install python

2

Download firmware

Download the latest stable ESP32 GENERIC .bin from micropython.org/download/esp32/.

3

Find the USB port

Terminal
ls /dev/cu.*

Look for /dev/cu.usbserial-xxxx or /dev/cu.SLAB_USBtoUART.

4

Erase and flash

Terminal
esptool.py --chip esp32 --port /dev/cu.usbserial-xxxx erase_flash

esptool.py --chip esp32 --port /dev/cu.usbserial-xxxx \
  --baud 460800 write_flash -z 0x1000 esp32-firmware.bin
5

Thonny IDE

Download from thonny.org. Set interpreter to MicroPython (ESP32) under Tools → Options → Interpreter. Select the /dev/cu.* port.

1

Install esptool and add dialout permissions

bash
pip3 install esptool
sudo usermod -a -G dialout $USER

Log out and back in after the usermod command.

2

Download firmware and find port

bash
ls /dev/ttyUSB*    # usually /dev/ttyUSB0
3

Erase and flash

bash
esptool.py --chip esp32 --port /dev/ttyUSB0 erase_flash

esptool.py --chip esp32 --port /dev/ttyUSB0 \
  --baud 460800 write_flash -z 0x1000 esp32-firmware.bin
4

Thonny or rshell

Thonny works on Linux (download from thonny.org or install via pip3 install thonny). For terminal-only workflows, use pip3 install rshell or pip3 install mpremote.

⚠️
Android support is limited. Full MicroPython development on Android requires a USB OTG cable and an Android device that supports USB Host mode. Not all Android devices do. For a smooth experience, a PC or laptop is strongly recommended.
1

Check USB OTG support

Your Android device must support USB Host (OTG). Connect a USB OTG adapter + your ESP32's USB cable. Go to Settings and check if the device is recognized. If not, your device does not support USB Host mode.

2

Flash firmware via web browser

Open Chrome on Android (must be Chromium-based). Navigate to espressif.github.io/esptool-js. This web tool uses the Web Serial API to flash firmware directly from the browser — no app install needed. Select your firmware .bin file and flash.

3

REPL access after flashing

Install "Serial USB Terminal" from the Play Store. Open it, select 115200 baud, connect to the ESP32 via the OTG cable. You'll get access to the MicroPython REPL for running commands interactively.

4

WiFi-based development (WebREPL)

Once MicroPython is running, enable WebREPL on the ESP32 so you can code wirelessly from the Android browser — no cable needed after initial setup. In the MicroPython REPL:

MicroPython REPL
import webrepl_setup

Follow the prompts to set a password and enable WebREPL on boot. Then connect to the ESP32's WiFi and open micropython.org/webrepl in Chrome on Android.

7

First Sketch BOTH

WiFi scan + LED blink — verify everything works at once.

This sketch does three things in one: prints chip information, scans for nearby WiFi networks, and blinks the built-in LED. Upload it to confirm your IDE setup, WiFi antenna, and GPIO all work correctly.

⚠️
Open Serial Monitor at 115200 baud — NOT 9600. The ESP32 outputs at a higher baud rate. If you open at 9600 you will see garbled text.
esp32_first_sketch.ino
#include <WiFi.h>

const int LED_PIN = 2;   // Built-in LED — GPIO 2

void setup() {
  Serial.begin(115200);   // ⚠ 115200 — not 9600
  delay(500);
  pinMode(LED_PIN, OUTPUT);

  Serial.println("\n=== Tishvi ESP32 ===");
  Serial.printf("Chip   : %s rev%d\n", ESP.getChipModel(), ESP.getChipRevision());
  Serial.printf("CPU    : %d MHz\n", ESP.getCpuFreqMHz());
  Serial.printf("Flash  : %d MB\n", ESP.getFlashChipSize() / 1048576);
  Serial.printf("MAC    : %s\n", WiFi.macAddress().c_str());

  // WiFi Scan
  WiFi.mode(WIFI_STA);
  WiFi.disconnect();
  delay(100);
  Serial.println("\nScanning WiFi...");
  int n = WiFi.scanNetworks();
  Serial.printf("%d network(s) found:\n", n);
  for (int i = 0; i < n; i++) {
    Serial.printf("  %2d. %-28s %4d dBm\n",
      i+1, WiFi.SSID(i).c_str(), WiFi.RSSI(i));
  }
  Serial.println("\nLED blinking on GPIO 2...");
}

void loop() {
  digitalWrite(LED_PIN, HIGH);
  delay(500);
  digitalWrite(LED_PIN, LOW);
  delay(500);
}
💡
If the LED does not blink: some boards have the built-in LED on GPIO 13 instead of GPIO 2. Change LED_PIN to 13 and re-upload. Alternatively, connect an external LED + 220Ω resistor from any GPIO to GND.

Quick MicroPython equivalent (paste in Thonny REPL):

MicroPython REPL
from machine import Pin
import time, network

led = Pin(2, Pin.OUT)
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
print("Scanning...", wlan.scan())

while True:
    led.on(); time.sleep(0.5)
    led.off(); time.sleep(0.5)
8

Do's & Don'ts BOTH

Essential safety and best-practice rules for the ESP32.

✅ Do's

  • Use 3.3V logic signals on all GPIO pins
  • Power via USB (safest) or regulated 5V into VIN
  • Install CP2102 driver before first use on Windows
  • Hold BOOT button and press RST/EN if upload fails — then release BOOT after upload starts
  • Keep GPIO current under 12 mA per pin and 40 mA total
  • Use a 100µF capacitor between VIN and GND for stable power in wireless mode
  • Open Serial Monitor at 115200 baud
  • Use delay() sparingly — prefer millis() for non-blocking code
  • Always declare GPIO direction with pinMode() before use
  • Use the built-in LED (GPIO 2) as your first test point

🚫 Don'ts

  • Connect 5V signals directly to GPIO — use a voltage divider or level shifter
  • Use GPIO 34, 35, 36 (VP), 39 (VN) as outputs — they are input-only
  • Use SD0, SD1, SD2, SD3, CMD, CLK (38-pin) for I/O — they're connected to flash
  • Drive GPIO 12 HIGH during boot — it affects flash voltage selection and will prevent booting
  • Power from both USB and an external VIN source simultaneously
  • Connect or disconnect sensors/modules while the board is powered
  • Pull more than 40 mA total from all GPIO pins combined
  • Use Serial.begin(9600) — ESP32 default is 115200
  • Block the PCB antenna area with metal or your hand during WiFi testing
  • Leave GPIO 0 (BOOT pin) floating — it has an internal pull-up but confirm before production
⚠️
First-upload tip: Some ESP32 boards require manual boot mode to accept a new sketch. If you see "Connecting........_____" repeatedly in the Arduino IDE upload log, hold the BOOT button on the board, then press RST/EN once, then release BOOT. The upload should proceed. After a successful upload, future uploads usually happen automatically.
9

Troubleshooting BOTH

Common problems and how to fix them.

?

COM port not visible / "Port not found"

The CP2102 driver is not installed. Open Device Manager on Windows — if you see an unknown USB device, search your browser for "Silicon Labs CP210x driver", download it from Silicon Labs' official site, and install. On macOS 10.13+ the driver is built in; reconnect the USB cable. On Linux run lsusb — the board should appear as "Silicon Labs CP210x". If not, try a different USB cable (data cable, not charge-only).

?

"Connecting........_____" — upload never starts

The board is not entering download mode. Hold the BOOT button, press and release RST/EN, then release BOOT once the IDE shows "Uploading...". If this keeps happening on every upload, check if anything connected to GPIO 0 or GPIO 2 is pulling it LOW, which can lock the board in boot mode.

?

Sketch compiles but board resets in a loop (boot loop)

A crash in your code causes the watchdog to reset the board. Open Serial Monitor at 115200 baud and read the crash reason printed before the reset — it will say "Guru Meditation Error", "LoadProhibited", or similar. Common causes: accessing nullptr, stack overflow in a task, or using a peripheral before initialising it in setup().

?

Serial Monitor shows garbled text

Wrong baud rate. The ESP32 boot messages appear at 115200 baud. Open Serial Monitor → change the baud dropdown at the bottom-right from 9600 to 115200 and press the reset button on the board.

?

WiFi scan returns 0 networks

Ensure WiFi.mode(WIFI_STA) is called before scanNetworks(). Your router may use 5 GHz only — the ESP32 supports only 2.4 GHz. Also check that nothing is blocking or touching the PCB trace antenna (the winding copper pattern on the module's edge).

?

"Board not found" or wrong chip ID after installing board package

The board package may not have downloaded fully. In Arduino IDE go to Tools → Board → Boards Manager, find "esp32 by Espressif Systems", click it and check the version. If it shows an error, click Remove and reinstall. Also check your internet connection — the package is ~200 MB.

?

esptool: "Failed to connect to ESP32" during MicroPython flash

Same as the BOOT button issue above. Run the esptool command, then immediately hold BOOT and tap RST/EN on the board. Release BOOT once you see esptool connecting. Also make sure no other app (Arduino IDE Serial Monitor, Thonny) has the COM port open — only one app can own the port at a time.

?

GPIO output has no voltage / pin always LOW

Verify you called pinMode(pin, OUTPUT) in setup(). Check you are not trying to output on GPIO 34, 35, 36, or 39 — these are input-only and will silently ignore output commands. On the 38-pin board, avoid SD0–SD3, CMD, CLK.

?

Board worked, then suddenly stopped booting after wiring a new sensor

A wiring mistake likely applied 5V to a GPIO pin, damaging the input protection. Check all voltage levels. If the board no longer appears as a USB device and the power LED is off, the regulator or SoC may be damaged. If the power LED is on but no COM port appears, try the manual boot mode (hold BOOT + RST) to re-flash.

?

Upload succeeds but board immediately resets 38-PIN

If you have anything connected to SD0–SD3, CMD, or CLK pins on the 38-pin variant, disconnect them. These pins are involved in the flash boot process — anything driving them can prevent the board from booting after a flash.

Download Sample Sketch

Ready-to-upload .ino — works on both 30-pin and 38-pin variants.

The full sample sketch includes chip info printing, WiFi network scanning with signal strength, and LED blink — all in one file with detailed comments. No extra libraries needed beyond the ESP32 board package.

📄
esp32_sample.ino
Chip info · WiFi scan · LED blink · 30-pin + 38-pin compatible
⬇ Download .ino
💡
ESP32 board package must be installed first — see Step 5. Without it, the sketch will not compile (WiFi.h will not be found). In Arduino IDE: File → Open, select the .ino file, set board to ESP32 Dev Module, set Serial Monitor to 115200 baud.