An ESP32-WROOM-32 development board with a USB-C port, dual-core 240 MHz processor, 4 MB flash, 2.4 GHz Wi-Fi and Bluetooth 4.2 (Classic + BLE).
Plug it into your computer with a USB-C data cable and program it straight from the Arduino IDE, MicroPython or ESP-IDF — no separate programmer needed. It suits makers, students and engineers building Wi-Fi sensors, web-controlled devices, Bluetooth gadgets and home-automation nodes.
Why choose it
- Wi-Fi and Bluetooth in one board — 802.11 b/g/n Wi-Fi plus Bluetooth v4.2 BR/EDR and BLE from the ESP32-WROOM-32 module, with an on-board PCB antenna.
- Enough power for real projects — Xtensa dual-core 32-bit LX6 CPU at up to 240 MHz, 520 KB SRAM and 4 MB SPI flash, so you can run a web server, sensors and a display at the same time.
- USB-C and one-click uploads — reversible USB-C connector for power and programming, with BOOT and EN buttons on the board for flashing and reset.
Specifications
| Core | |
|---|---|
| Module | ESP32-WROOM-32 |
| CPU | Xtensa dual-core 32-bit LX6, up to 240 MHz |
| Memory | 520 KB SRAM, 448 KB ROM |
| Flash | 4 MB SPI flash |
| Wireless | |
| Wi-Fi | 802.11 b/g/n, 2.4 GHz (2412–2484 MHz); Station, Access Point and AP + Station modes |
| Bluetooth | v4.2 BR/EDR (Classic) and Bluetooth LE |
| Antenna | On-board PCB antenna |
| I/O and peripherals | |
| Header pins | 30 (2 × 15) |
| ADC | 2 × 12-bit SAR ADC, 18 channels (chip) |
| DAC | 2 × 8-bit (GPIO 25, GPIO 26) |
| Touch | 10 capacitive touch channels (chip) |
| Interfaces | 3 × UART, 4 × SPI controllers, 2 × I2C, I2S, TWAI (CAN 2.0), SD/SDIO |
| PWM | 16 LED PWM channels, motor-control PWM |
| On-board | USB-C connector, BOOT and EN (reset) buttons, power LED, user LED on GPIO 2 |
| Power and environment | |
| Logic level | 3.3 V (GPIO are not 5 V tolerant) |
| Power input | 5 V via USB-C, or 5 V on the VIN pin |
| Module supply | 3.0–3.6 V |
| Operating temperature | –40 to 85 °C (module) |
Compatibility
| Platform | Works | Notes |
|---|---|---|
| Arduino UNO / Nano (5 V) | ◐ With adapter | Use a logic level shifter on any 5 V signal going into the ESP32 (e.g. UART TX from the UNO). |
| ESP32 / ESP8266 (3.3 V) | ✓ Yes | Same 3.3 V logic — connect UART, I2C or SPI directly and share GND. |
| Raspberry Pi | ✓ Yes | 3.3 V GPIO on both sides; connect by UART/I2C or plug into the Pi's USB port to program it. |
| Arduino IDE | ✓ Yes | Board package "esp32 by Espressif Systems"; board "ESP32 Dev Module" |
| MicroPython | ✓ Yes | Generic ESP32 firmware from micropython.org |
| ESP-IDF / ESPHome | ✓ Yes | ESP-IDF target "esp32" (FreeRTOS + lwIP); ESPHome board "esp32dev" |
In the box
- 1 × ESP32 development board (ESP32-WROOM-32, USB-C)
Applications
- Wi-Fi sensor nodes that post temperature, humidity or soil readings to a web page, MQTT broker or Home Assistant
- Web-controlled relays, lights and motors using the board's built-in web server
- Bluetooth LE beacons, BLE sensors and Bluetooth Classic serial links to a phone
- ESPHome devices for home automation
- Learning C/C++ or MicroPython on a powerful, low-cost microcontroller
Tutorial
What you'll build: first a blinking LED, then a web page on your phone that switches the board's LED on and off over Wi-Fi · About 30 minutes.
Part 1 — Set up the Arduino IDE (once only)
Download the Arduino IDE for Windows, macOS or Linux and install it.
Open File → Preferences (macOS: Arduino IDE → Settings). In Additional boards manager URLs paste:
https://espressif.github.io/arduino-esp32/package_esp32_index.jsonClick OK. This is the stable release link from the official Espressif installation guide.
Open Tools → Board → Boards Manager, search for esp32 and install esp32 by Espressif Systems. Restart the IDE when it finishes.
✓ Check: Tools → Board now shows an esp32 group.
Part 2 — Upload your first sketch
Plug the board in with a USB-C data cable (charge-only cables will not show a port). Choose Tools → Board → esp32 → ESP32 Dev Module, then Tools → Port → the new COM port (Windows) or /dev/cu.usbserial… / /dev/ttyUSB0 (macOS/Linux). No new port? See the first row of Troubleshooting below.
Paste Example 1 into a new sketch and click Upload (→). When the log shows "Hard resetting via RTS pin…", the upload is done.
Open Tools → Upload Speed, choose 115200 and upload again. If the log shows "Connecting……" and then fails, upload again and hold BOOT for a couple of seconds as the dots appear.
▸ Example 1 — Blink the on-board LED
// Example 1: blink the on-board user LED (GPIO 2)
// Wiring: nothing to connect - just the USB-C data cable
const int LED_PIN = 2; // on-board LED next to the "D2" label
const int BLINK_MS = 1000; // ✏️ you can change this (time in milliseconds)
void setup() {
Serial.begin(115200); // 115200 = the speed the board talks to your computer
delay(500); // give the Serial Monitor a moment to connect
pinMode(LED_PIN, OUTPUT);
Serial.println("OK - epartners.co.nz test"); // printed once at start-up
}
void loop() {
digitalWrite(LED_PIN, HIGH); // LED on
Serial.println("LED on");
delay(BLINK_MS);
digitalWrite(LED_PIN, LOW); // LED off
Serial.println("LED off");
delay(BLINK_MS);
}✓ Check: Open Tools → Serial Monitor and set it to 115200 baud. Press EN once: it prints "OK - epartners.co.nz test", then "LED on" / "LED off" every second while the user LED blinks.
Part 3 — First real project: control the LED from your phone over Wi-Fi
In Example 2, replace
YOUR_WIFI_NAME and YOUR_WIFI_PASSWORD with your 2.4 GHz network (the ESP32 cannot join a 5 GHz-only network). Upload, then open the Serial Monitor at 115200 baud and press EN to restart the board. The Wi-Fi functions are described in the Arduino-ESP32 Wi-Fi API.The Serial Monitor prints an address such as
http://192.168.1.50. Type it into a browser on a phone or computer on the same network, then tap ON or OFF.▸ Example 2 — Wi-Fi web server LED switch
// Example 2: switch the on-board LED from a web page
// Wiring: nothing to connect - uses the on-board LED on GPIO 2
#include <WiFi.h>
#include <WebServer.h>
const char* ssid = "YOUR_WIFI_NAME"; // ✏️ your 2.4 GHz network name
const char* password = "YOUR_WIFI_PASSWORD"; // ✏️ your Wi-Fi password
const int LED_PIN = 2; // on-board LED
bool ledOn = false;
WebServer server(80); // port 80 = normal web pages
String page() {
String html = "<!DOCTYPE html><html><head>";
html += "<meta name='viewport' content='width=device-width, initial-scale=1'>";
html += "<title>ESP32 LED</title></head><body style='font-family:sans-serif;text-align:center'>";
html += "<h1>ESP32 LED is ";
html += ledOn ? "ON" : "OFF";
html += "</h1><p><a href='/on'><button>ON</button></a> ";
html += "<a href='/off'><button>OFF</button></a></p></body></html>";
return html;
}
void handleRoot() { server.send(200, "text/html", page()); }
void handleOn() {
ledOn = true;
digitalWrite(LED_PIN, HIGH);
server.send(200, "text/html", page());
}
void handleOff() {
ledOn = false;
digitalWrite(LED_PIN, LOW);
server.send(200, "text/html", page());
}
void setup() {
Serial.begin(115200);
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW);
WiFi.mode(WIFI_STA); // join your router as a normal device
WiFi.begin(ssid, password);
Serial.print("Connecting to Wi-Fi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
Serial.print("Open http://");
Serial.println(WiFi.localIP()); // type this address into your browser
server.on("/", handleRoot);
server.on("/on", handleOn);
server.on("/off", handleOff);
server.begin();
}
void loop() {
server.handleClient(); // answer browser requests
}✓ Check: Tapping ON lights the user LED and the page heading changes to "ESP32 LED is ON"; OFF turns it off.
Troubleshooting
| Problem | Likely cause | Fix |
|---|---|---|
| No port appears in Tools → Port | Charge-only cable, non-standard USB-C cable, or missing USB-serial driver | Try a known USB-A to USB-C data cable. If the power LED is on but there is still no port, read the small chip next to the USB-C connector and install its driver (for a CP210x chip: CP210x driver (Silicon Labs)), then reconnect. |
| Upload fails or stops part-way | Upload speed too high for the USB cable or USB chip | Tools → Upload Speed → 115200, then upload again. |
| "Failed to connect to ESP32: Timed out waiting for packet header" | Board did not enter download mode automatically | Click Upload, and when "Connecting……" appears hold BOOT for 2 seconds, then release. |
| Upload fails only when wires are connected | A strapping pin (GPIO 0, 2, 5, 12 or 15) is pulled to the wrong level at boot | Disconnect parts from those pins while uploading, or move them to other GPIO. |
| Serial Monitor shows random characters | Baud rate mismatch | Set the Serial Monitor to 115200 baud. |
| Serial Monitor is blank after uploading | The start-up message was printed before the Serial Monitor opened | Press EN (reset) once with the Serial Monitor open. |
| "Brownout detector was triggered" and the board restarts | Supply voltage dips when Wi-Fi starts | Use a shorter/better cable or a powered USB port; do not power motors or LED strips from the board. |
| Stuck at "Connecting to Wi-Fi……" | Wrong password or 5 GHz-only network | Check the SSID and password (case-sensitive) and use a 2.4 GHz network. |
Try next: add a third button to the web page that makes the LED blink (hint: add a server.on("/blink", …) handler), or read the official Arduino-ESP32 troubleshooting guide if anything gets stuck.
Spotted a problem in this tutorial? Email support@epartners.co.nz and we'll check it and update the tutorial.
- GPIO are 3.3 V only. Putting 5 V on a GPIO pin can damage the ESP32 — use a level shifter with 5 V modules.
- Use a USB-C cable that meets the USB Type-C standard and carries data. A non-compliant cable may power nothing or show no port; a USB-A to USB-C data cable is the safest choice.
- GPIO 34, 35, 36 (VP) and 39 (VN) are input-only and have no internal pull-up/pull-down resistors.
- GPIO 0, 2, 5, 12 and 15 are strapping pins read at boot. Avoid pulling GPIO 12 high at power-up.
- Wi-Fi is 2.4 GHz only.
Video guide
Resources
- ESP32-WROOM-32 module datasheet (PDF, Espressif)
- ESP32 series chip datasheet (PDF, Espressif)
- Arduino-ESP32 installation guide (Espressif)
- MicroPython firmware for ESP32
- Getting Started with ESP32 (Random Nerd Tutorials)
FAQ
▸ Which board do I select in the Arduino IDE?
Select "ESP32 Dev Module" after installing "esp32 by Espressif Systems". "DOIT ESP32 DEVKIT V1" also works with this 30-pin layout.
▸ Can I connect 5 V sensors or an Arduino UNO directly?
Not directly — the ESP32 GPIO are 3.3 V. Power 5 V sensors from VIN/5 V if needed, but pass their output signals through a logic level shifter or a resistor divider.
▸ Does it support Bluetooth Classic or only BLE?
Both. The ESP32-WROOM-32 supports Bluetooth v4.2 BR/EDR (Classic) and Bluetooth LE, so you can use the BluetoothSerial and BLE libraries in Arduino-ESP32.
▸ Can it connect to 5 GHz Wi-Fi?
No. The ESP32 supports 2.4 GHz 802.11 b/g/n only. Most home routers broadcast both bands, so join the 2.4 GHz network name.
▸ Why does my computer not see the board?
Usually the cable. Use a USB-C data cable that meets the Type-C standard; charge-only cables do not carry data. If the power LED is on but no port appears, install the USB-serial driver for your computer.
▸ Can I use MicroPython or ESPHome?
Yes. Flash the generic ESP32 MicroPython firmware from micropython.org, or choose board "esp32dev" in ESPHome.
Technical question about this part? Email support@epartners.co.nz with your board and wiring, and we'll help you get it working.
Shipping: $5.99 urban, $9.99 rural. Free shipping on orders of $100 or more.
Order by 10:30am (NZT), Monday to Friday, and we dispatch the same day. Orders placed after 10:30am, on weekends or on public holidays are dispatched the next business day.
Delivery usually takes 1–2 business days after dispatch (2–3 for rural addresses). See our Shipping Policy for full details.