Meet the ESP32: your first Arduino program

Set up Arduino IDE, connect an ESP32, and observe a greeting, message counter, and elapsed time in Serial Monitor.

Getting started with ESP32 and ArduinoBeginner60 min

What you will learn

  • Install support for a classic ESP32 and select its board and port.
  • Distinguish compiling a sketch from uploading it to a device.
  • Explain setup(), loop(), and serial communication.
  • Change a message and reporting interval, then check the result.

Before you start

No programming experience is required. Basic familiarity with files and installing software on a computer is sufficient.

Reference setup

Board in Arduino IDE
ESP32 Dev Module
Arduino-ESP32
3.3.12
Serial Monitor
115200 baud

This is a reference profile, not an identification of the pictured board. Adapt the GPIO mapping and verify the circuit before using ESP32-C3/S2/S3 or a differently labelled board.

What you will build

Connect an ESP32 to a computer and run a program that sends a greeting, followed by information approximately once per second. Watch a message counter and elapsed time: your first demonstration of loading a program and observing its output.

There is no external circuit in this course. The activity does not depend on whether your development board has a programmable built-in LED. The computer displays the messages; the program runs on the ESP32.

Learning objectives

  • Prepare Arduino IDE for a classic ESP32 board.
  • Distinguish the board selection from the communication port.
  • Upload a sketch and use Serial Monitor.
  • Explain the roles of setup() and loop().
  • Change a message and its reporting interval.

Prerequisites

No programming experience is required. You should be able to download files and extract archives. Allow about 60 minutes; installation may take longer on a slow connection.

The reference hardware is a development board with a classic ESP32/ESP32-WROOM-32. This profile does not cover ESP32-C3, S2, or S3 boards, which need a separately adapted board selection and wiring profile for subsequent courses.

Equipment

ComponentQuantitySpecification and notes
Development board with a classic ESP32-WROOM-32 module1Match the reference GPIO labels; check physical header positions on the actual board.
USB data and power cable1Use the connector fitted to your board; the pictured kit lists Micro-USB.

Use a USB cable that carries data. A charging-only cable can power the board without providing a communication port. Arduino recommends checking the cable and connecting directly to the computer when a board is not detected: USB connection checks.

How it works

An Arduino program is often called a sketch. The IDE translates its text into instructions the ESP32 can execute, then transfers those instructions to the device. Verify checks compilation; Upload also transfers the program. Successful verification alone does not show that the sketch reached the board or behaved correctly.

setup() prepares the program each time it starts. After that, loop() repeats. Serial communication lets us inspect information produced by the program. The speed selected in the sketch and in Serial Monitor must match: this course uses 115200 baud.

Connections

Wiring diagram

The drawing shows electrical connections by GPIO label, not the board’s physical header layout. Power the board through USB.

Wiring diagram — electrical connections listed in the table below
Wiring diagramEnlargeSVGPNG
Connections · Wiring diagram
FromToConnection
COMPUTER.USBESP32.USBUSB data cable provides power and serial communication.
  1. Place the board on a clean, nonconductive surface and remove jumper wires from its pins.
  2. Connect the appropriate USB plug to the board and the other end directly to the computer.
  3. Wait for the operating system to detect the device.

USB is the only power source in this activity. Do not connect an additional supply. Check connector and button labels on your own board. Espressif's DevKitC guide describes typical USB, EN, and BOOT functions.

Arduino setup

  1. Install Arduino IDE 2.x from the official Arduino website.
  2. Open Preferences and add https://espressif.github.io/arduino-esp32/package_esp32_index.json to Additional Boards Manager URLs.
  3. In Boards Manager, find “esp32 by Espressif Systems” and select version 3.3.12, the target version for this course package. See Espressif's installation instructions.
  4. Select ESP32 Dev Module and the port belonging to the connected board. If unsure, compare the port list before and after disconnecting its USB cable.
  5. Download the Arduino example (.zip) and extract it. Keep first_program.ino inside the folder named first_program, then open it.

No additional libraries are required. The board selection determines how to compile the program; the port identifies the connected device. These are separate settings even when the IDE presents them together: Arduino board and port selection.

Program

The displayed sketch and downloadable file share the same source. Run the original before saving a separate copy for experiments.

first_program.ino Arduino / C++
Download .ino

#include <Arduino.h>

constexpr uint32_t REPORT_INTERVAL_MS = 1000;
uint32_t lastReportMs = 0;
uint32_t counter = 0;

void setup() {
  Serial.begin(115200);
  Serial.println("Hello from WB Maker Bridge!");
  Serial.println("ESP32 is ready. Watch the counter and uptime.");
  lastReportMs = millis();
}

void loop() {
  const uint32_t now = millis();

  // Subtraction keeps this timer working across millis() rollover.
  if (now - lastReportMs >= REPORT_INTERVAL_MS) {
    lastReportMs = now;
    counter++;

    Serial.print("Counter: ");
    Serial.print(counter);
    Serial.print(" | Uptime (s): ");
    Serial.println(now / 1000);
  }
}

Code walkthrough

Find Serial.begin(115200) near the beginning. It configures serial communication. The greeting is printed during setup, so it does not appear on every pass through loop().

The program remembers when it last sent a periodic message. millis() provides elapsed milliseconds. The difference between the current and previous time is compared with REPORT_INTERVAL_MS. One thousand milliseconds equal one second. Once the interval has elapsed, the program prints a new line and updates the saved time. This approach leaves the loop available for other activities; Arduino's Blink Without Delay example illustrates the same scheduling principle.

The message counter and elapsed seconds mean different things. They initially increase at similar rates because one message is sent every second. Changing the reporting interval changes their relationship.

Run and expected results

Click Verify and wait for compilation to finish successfully. Click Upload. Once the transfer finishes, open Serial Monitor from Tools and select 115200 baud. If you missed the greeting, briefly press EN/RESET with the monitor open.

You should see the greeting and new lines about once per second. Count five consecutive updates. Pressing reset restarts the program and restores its initial values. Closing the monitor is not an intentional reset command, although opening or changing a connection can reset some boards.

Observation record

ActionWhat to record
Watch five periodic updatesAre they approximately one second apart?
Press EN/RESETDoes the greeting return and the counter restart?
Disconnect and reconnect USBDoes the stored program run without another upload?

Troubleshooting

ProblemCheck and next step
No port appearsTry a known data cable and another USB socket. Check whether the operating system detects the device.
ESP32 Dev Module is missingConfirm that the Espressif board package is installed.
Upload cannot access the portSelect the port again and close other applications using it.
Upload cannot connectAfter checking cable and port, try holding BOOT while “Connecting” appears; release it when transfer starts. If manual download mode is required, hold BOOT, briefly press EN, then retry Upload.
Unreadable textSelect 115200 baud in Serial Monitor.
Empty monitorCheck the port, wait a few seconds, and press EN/RESET.

Independent challenge

Save a copy of the sketch. Change the greeting to include your name and “WB Maker Bridge”. Then change the interval to two seconds. Before uploading, predict how many periodic messages you will receive in approximately ten seconds and how the elapsed-time value will change.

Check your understanding

  1. Which part runs once after a reset?
  2. Why is selecting the correct board insufficient for Upload?
  3. Does changing the reporting interval change how quickly time passes?

Answer guidance

For the challenge, change the greeting and set REPORT_INTERVAL_MS to 2000 milliseconds. Expect around five periodic messages in ten seconds. The counter advances by one while elapsed seconds advance by approximately two. Measure time from device startup.

Answers: setup() runs at startup; the port selects the connected device; the interval changes reporting frequency. Restore the original interval and repeat the upload independently before moving to the next course.

Downloads

Primary references