ESP32-S3 N16R8/Getting your computer to see it/06. Arduino IDE, set up for N16R8
Getting your computer to see it · 06 of 12

Arduino IDE, set up for N16R8

Install the IDE, add one URL, install one package, then set eight rows in the Tools menu. Three of those eight decide whether this board behaves like the N16R8 you bought or like a smaller one.

Install the IDE and the board package

  1. Download Arduino IDE 2.x from arduino.cc and install it the way your operating system expects.

    The Arduino IDE download page, listing separate downloads for Windows, Linux, macOS Intel and macOS Apple Silicon.
    macOS is two separate downloads and the page does not choose for you — Apple Silicon or Intel, and an Apple Silicon Mac given the Intel build asks to install Rosetta before it will start. The version number moves; anything 2.x is what this book assumes.
  2. Open File ▸ Preferences (Arduino IDE ▸ Settings on a Mac) and paste this into Additional boards manager URLs:

    https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
    The Additional Boards Manager URLs dialog in the Arduino IDE, with one Espressif package index URL typed into the box.
    One URL per line, and click OK rather than closing the window. The address in this capture is Espressif's GitHub Pages mirror; the one above is the same file on raw.githubusercontent.com, and either serves the index.
  3. Tools ▸ Board ▸ Boards Manager, search esp32, and install esp32 by Espressif Systems. It is a few hundred megabytes and it takes a while.

    The Boards Manager panel in the Arduino IDE with esp32 typed in the search box, showing the esp32 package by Espressif Systems marked as installed.
    Take the one whose author is Espressif Systems. A search for esp32 returns several packages from other publishers, and every setting in this book assumes Espressif's.
  4. Tools ▸ Board ▸ ESP32 Arduino ▸ ESP32S3 Dev Module.

There is no entry named after this board, and there does not need to be. ESP32S3 Dev Module is the generic S3 board, and the eight rows below are how you describe your particular one to it.

The eight rows

This is the part that matters. Pick the socket your cable is in, then look at what each row is protecting you from:

Tools ▸ the eight rows
everything works
Which socket you plugged into
What went wrong
USB CDC On Boot
Enabled
Row to check
Eight rows, set once. The IDE remembers them per board, not per sketch, so this is an evening’s job you do not repeat — until you open a sketch somebody else shared, which is why the settings are printed at the top of every sample in this book.

Written out, for copying:

Tools rowSet it to
BoardESP32S3 Dev Module
USB CDC On BootEnabled for the USB socket, Disabled for the UART socket
Flash Size16MB (128Mb)
Flash ModeQIO 80MHz
Partition Scheme16M Flash (3MB APP/9.9MB FATFS)
PSRAMOPI PSRAM
Upload ModeUART0 / Hardware CDC
USB ModeHardware CDC and JTAG

Set, the menu reads like this — and this is what to compare yours against when a sketch behaves as though it is on a smaller board:

The Arduino IDE Tools menu with the ESP32S3 Dev Module rows visible: USB CDC On Boot Enabled, Flash Mode QIO 80MHz, Flash Size 16MB (128Mb), Partition Scheme 16M Flash (3MB APP/9.9MB FATFS), PSRAM OPI PSRAM, Upload Mode UART0 / Hardware CDC, USB Mode Hardware CDC and JTAG.
The ticked rows are the eight from the table. Everything between them — CPU Frequency, Core Debug Level, Upload Speed, JTAG Adapter — can stay at its default on this board.

Three of them earn their place:

  • Flash Size and Partition Scheme together decide how much of the chip your sketch can reach. Left at the 4 MB defaults, twelve of your sixteen megabytes are unaddressable. Nothing errors — it simply describes a smaller chip than the one you own.
  • PSRAM must be OPI. The 8 MB on an N16R8 is octal-interface, so any other value finds nothing at all and ESP.getPsramSize() returns zero on a board that has eight megabytes of it.
  • USB CDC On Boot is the only row that depends on a physical choice you made earlier, and it is the one that produces the most confusing failure: an upload that works perfectly and a Serial Monitor that stays blank.

Pick the port and upload

Tools ▸ Port, and take the entry that appears when you plug the board in. Do not memorise the name: it belongs to your computer's driver, so it changes with the socket you used.

The board drop-down's Select other board and port dialog sets both at once, which is the quickest route if the port list is crowded:

The Arduino IDE's Select Other Board and Port dialog, with ESP32S3 Dev Module chosen on the left and a /dev/cu.usbmodem serial port chosen on the right.
ESP32S3 Dev Module, not the Octal (WROOM2) entry under it — that is a different module with a different flash interface. The usbmodem name on the right is the chip's own USB, so this board is in its right-hand socket.

Then upload the sketch below, open Tools ▸ Serial Monitor, set it to 115200, and press RESET on the board.

Two lines should appear, and the second is the one to read. If it says flash 16 MB, psram 8 MB, every setting above took, and the rest of this book is downhill. If it says 4 and 0, go back to the table — nothing is wrong with the board.

The code

hello_s3.ino

The smallest sketch that proves the whole chain — IDE, package, port, upload and Serial Monitor — is working. Upload it, open the Serial Monitor at 115200, and press RESET.

/*  Lonely Binary ESP32-S3 N16R8
    Tools ▸  Board            ESP32S3 Dev Module
             USB CDC On Boot  Enabled   (Disabled for the UART socket)
             Flash Size       16MB (128Mb)
             Flash Mode       QIO 80MHz
             Partition Scheme 16M Flash (3MB APP/9.9MB FATFS)
             PSRAM            OPI PSRAM
             Upload Mode      UART0 / Hardware CDC
             USB Mode         Hardware CDC and JTAG          */

void setup() {
  Serial.begin(115200);
  delay(1500);            // give the native USB port time to enrol

  Serial.println("ESP32-S3 awake");
  Serial.printf("flash %u MB, psram %u MB\n",
                ESP.getFlashChipSize() / (1024 * 1024),
                ESP.getPsramSize() / (1024 * 1024));
}

void loop() {
  delay(1000);
}

The settings block at the top is not decoration. Board settings are stored per board and not per sketch, so a sketch that travels between machines carries none of them — writing them in the file is how the next person gets them.

When it does not work

The Boards Manager search finds nothing

The extra URL did not save. Reopen Preferences and check it is on its own line, with no trailing spaces, and that you clicked OK rather than closing the window. Then close and reopen the Boards Manager — it caches the index.

Installing the ESP32 package fails part-way

It is a large download and a proxy or a flaky connection will stop it. Run it again; it resumes rather than starting over. On a corporate network, the tool cache is often the thing being blocked, not the IDE.

It printed: flash 4 MB, psram 0 MB

Both numbers are settings, not hardware. Flash Size and Partition Scheme are still at their 4 MB defaults, and PSRAM is not set to OPI. Fix those three rows and upload again — the memory article walks through what each one does.

The upload succeeds and the Serial Monitor stays empty

USB CDC On Boot does not match the socket your cable is in. Enabled for the right-hand USB socket, Disabled for the left-hand UART one, and you have to upload again after changing it because it is compiled into the sketch.

Where this goes next

One LED, one pin, and a library — because the LED on this board is not the kind digitalWrite can light.

Blink the RGB LED

Edit this page — content/boards/esp32-s3/arduino-ide-setup.mdx

Community

Questions about this product

See what other owners have asked, and read their solutions.

Ask a question ↗

ESP32-S3 Gold Edition (N16R8)

Loading discussions…

Discuss this article

Ask about this page. The answer stays here, on the page it belongs to, for whoever hits the same wall next.

Browse ESP32-S3 on the forum