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.
Community videos. Tishvi is not affiliated with creators.
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.
or CH9102 (Type-C)
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)
Pin Layout 30-PIN
All 30 pins, colour-coded by function.
pinMode(34, OUTPUT) or digitalWrite(34, HIGH) will silently fail. Use D32, D33, D25–D27 for output + ADC combined.Pin Layout 38-PIN
All 38 pins, colour-coded by function.
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.
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.
Add the ESP32 board manager URL
Open Arduino IDE → File → Preferences. In the "Additional boards manager URLs" field, add:
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.
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.
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.
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.
Set upload speed
Tools → Upload Speed → 921600. This gives the fastest reliable upload. If uploads fail consistently, try 460800.
Install Arduino IDE 2.x
Download from arduino.cc/en/software. Open the .dmg, drag Arduino IDE to your Applications folder.
Add board manager URL
Arduino IDE → Preferences (⌘,). Paste into "Additional boards manager URLs":
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
Install ESP32 board package
Tools → Boards Manager → search esp32 → install "esp32 by Espressif Systems".
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.
Select board and port
Tools → Board → esp32 → "ESP32 Dev Module". Then Tools → Port → /dev/cu.usbserial-xxxx.
Set upload speed
Tools → Upload Speed → 921600.
Install Arduino IDE
Download the AppImage from arduino.cc/en/software. Make it executable and run it:
chmod +x arduino-ide_*.AppImage ./arduino-ide_*.AppImage
Add your user to the dialout group
This is required to access USB serial ports without sudo:
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.
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.
Find the port
Connect the ESP32 and run:
ls /dev/ttyUSB*
The port is usually /dev/ttyUSB0. Select it in Tools → Port.
Select board and upload speed
Tools → Board → esp32 → ESP32 Dev Module. Upload Speed: 921600.
sudo systemctl stop ModemManager and retry the upload.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.
Install Python 3
Download from python.org. During install, tick "Add Python to PATH". Verify in Command Prompt:
python --version
Install esptool
pip install esptool
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\).
Find your COM port
Open Device Manager → Ports (COM & LPT). Note the COM number, e.g. COM3.
Erase existing firmware
python -m esptool --chip esp32 --port COM3 erase_flash
Replace COM3 with your actual port number.
Flash MicroPython
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.
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.
print("Hello ESP32") in the Thonny REPL and press Enter. If the ESP32 replies, MicroPython is running correctly.Install Python 3 and esptool
pip3 install esptool
If Python is not installed, download from python.org or install via Homebrew: brew install python
Download firmware
Download the latest stable ESP32 GENERIC .bin from micropython.org/download/esp32/.
Find the USB port
ls /dev/cu.*
Look for /dev/cu.usbserial-xxxx or /dev/cu.SLAB_USBtoUART.
Erase and flash
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
Thonny IDE
Download from thonny.org. Set interpreter to MicroPython (ESP32) under Tools → Options → Interpreter. Select the /dev/cu.* port.
Install esptool and add dialout permissions
pip3 install esptool sudo usermod -a -G dialout $USER
Log out and back in after the usermod command.
Download firmware and find port
ls /dev/ttyUSB* # usually /dev/ttyUSB0
Erase and flash
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
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.
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.
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.
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.
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:
import webrepl_setupFollow 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.
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.
#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); }
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):
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)
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 — prefermillis()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
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.
.ino file, set board to ESP32 Dev Module, set Serial Monitor to 115200 baud.Next Steps
Where to go after your ESP32 is running.
ESP32-C3 Super Mini
Need an ultra-compact board? The ESP32-C3 Super Mini is RISC-V based, has USB Type-C, and fits in very tight spaces — with Wi-Fi + BLE 5.0.
Add an OLED Display
Connect the Tishvi 1.3" OLED (SH1106) over I2C — show WiFi scan results, sensor readings, or a live clock on the screen.
OLED 0.96" Display
The smaller SSD1306 OLED also works with the ESP32 on I2C — same SDA/SCL wiring, different library constructor.
HC-SR04 + ESP32
Read ultrasonic distance on the ESP32 and send readings over WiFi to a dashboard or phone app.