A screw terminal can turn a fragile tangle of jumper wires into a connection you can label and inspect. It can also make a wrong connection look impressively permanent. Before plugging an ESP32 board into a carrier, learn to answer three separate questions: what arrived, which contacts actually connect, and what a small known circuit does before the carrier is involved.

Verification: this is a source-reviewed experiment design. The complete application and sketch have host tests with simulated input/output boundaries; they have not been compiled for or executed on an ESP32 here. No carrier, terminal connection, supply or solder joint has been physically tested. The supplier photograph identifies an advertised product, not our assembled prototype.

What does a terminal breakout board do?

A breakout board brings small or inconvenient electrical contacts to more accessible connectors. A carrier is a board that mechanically supports another board and routes its connections. A terminal block holds wires in individual connection positions, often using screws. A header is a row of metal contacts; a socket header accepts matching pins. Voltage is the electrical difference between two points that can drive current, the flow of electric charge. These parts organize connections. Their names do not establish which voltage is present or whether two controllers are interchangeable.

An ESP32 module is a small assembly containing the processor and supporting components. A development board adds features such as a programming connector and power circuitry around that module. ESP32-WROOM-32E is a module name; ESP32-DevKitC V4 is a development-board family. The ESP32-S3 belongs to a different controller family. A product title containing both names does not make their header positions, software targets or signal functions identical.

The listing considered here is described by its seller as a LAFVIN breakout board for ESP32/ESP32-S3 WROOM hardware, with three choices: a breakout board alone, a version with an ESP32 board, and a version with an ESP32-S3 board. Those are purchase-option descriptions, not an independently confirmed compatibility matrix. Record the actual selected option, board revision, socket contact count and included controller marking. A photograph of one option cannot identify every item shipped under the listing.

Supplier photograph of the LAFVIN carrier without a controller installed, with screw terminals, alternative socket positions, small onboard circuits and an external-power connector.
Supplier photograph for identification; not a Tricky Circuit bench test. The selected listing option is “1pc Breakout Board.” Visible tools or another option's photograph do not establish the contents of that selection.
Supplier bundle photograph shows the LAFVIN carrier beside a separate controller marked S3-N16R8 and a screwdriver; the controller is not the DevKitC V4 used by the powered example.
Supplier photograph for identification; not a Tricky Circuit bench test. This image shows a separate controller marked S3-N16R8. It is not the Espressif ESP32-DevKitC V4 / WROOM-32E used below, and is not assumed to be included in the bare-carrier option.

The carrier photographs show small onboard integrated circuits, marked U1 through U6, and a power-conversion area. An integrated circuit, or IC, contains electronic circuitry in one package. These photographs establish that this is more than an empty pin-to-terminal adapter; they do not identify the IC functions, indicator loading or power routing. Treat those as questions for the exact manual and schematic.

Temu affiliate offer

The carrier shown in this guide

This is the carrier in the supplier photographs, for identification and unpowered continuity checks. The powered example uses a separate documented ESP32-DevKitC V4.

Some links below are Temu affiliate links. Tricky Circuit may earn a commission if you buy through them.

The offer shows listing options; it does not lock the board-only selection. Match the actual option and supplied contents. This link does not establish powered-carrier compatibility.

The useful project is therefore a connection audit followed by a known digital experiment. The audit can finish successfully by establishing that a carrier does not match your controller. That finding avoids building a misleading circuit. The powered experiment below works directly on one documented Espressif board; it does not depend on an unverified carrier.

Separate shape, routing and power

Mechanical compatibility means the connectors fit with the correct row spacing, number of contacts, insertion depth and orientation. Electrical compatibility means the connected contacts perform the intended jobs at allowed voltages. A socket can accept a pin while routing it to the wrong terminal. Conversely, two boards can use the same processor yet have different header arrangements. Check the whole board, not just the text on its metal module cover.

A net is a group of points intentionally joined electrically. A pinout assigns functions to physical contacts. Printed labels are useful clues, but a pinout needs documentation for the exact revision. Distinguish the processor's signal name from its position on a connector. GPIO means general-purpose input/output, a configurable digital signal. In this article, GPIO23 is a signal number; J3 contact 2 is its position on the specified DevKitC V4 connector. Counting the twenty-third visible pin is not the instruction.

Power routing deserves its own page of notes. A connector marked 5V can be an input, an output, a shared rail or something selected by a jumper. A jumper joins selected contacts; a removable cap can change a connection without changing the printed board. A regulator attempts to hold a supply voltage within its specified conditions. The presence of a regulator-shaped component does not identify its rating, thermal limits or connections.

The seller text includes external-input and voltage claims that have not been accepted for this experiment. We do not derive an operating range from inconsistent listing attributes, a suggested adapter or the size of a terminal. Do not apply external power to the carrier, connect an adapter, or select a 3.3V/5V position using this article as a substitute manual. An authoritative schematic and instructions for the delivered revision remain a prerequisite for powered carrier use.

Map an unpowered carrier without inventing its pinout

Start with the controller removed from the carrier and all cables, batteries and power adapters disconnected. Inspect for remaining stored voltage before selecting resistance mode. If you cannot identify a supply connection or safely establish an unpowered state, stop at photographs and documentation. This procedure is for the isolated low-voltage accessory, not an instruction to open a power adapter.

A digital multimeter measures electrical quantities. Resistance describes opposition to current and is measured in ohms, Ω. Its continuity mode indicates a sufficiently conducting path, usually with a sound. That threshold depends on the instrument. A beep is not an exact resistance measurement, proof of a copper-only path, or a current rating. Check your meter manual and touch the probes together first; record the residual lead resistance. Keep the leads in the voltage/resistance and common sockets, not the current socket.

  1. Photograph the top and bottom before changing anything. Draw a reference arrow toward the same connector on both photographs. Give socket contacts temporary position names that you define yourself, such as left row position 1. Do not call those positions GPIO numbers until the mapping is established.
  2. Copy the printed terminal labels exactly, including a minus sign or small suffix. Record jumper positions and any visible indicators. Leave jumpers unchanged for the first map. If a manual later calls for another position, treat it as another configuration with a separate record.
  3. For each terminal, test the suspected socket contact and record resistance in both probe directions. Then check neighboring contacts. A direct route should be investigated as a route, while a directional or changing reading can involve onboard electronics rather than a simple wire. Do not force every observation into a guessed one-to-one table.
  4. Check whether several terminals belong to one common group. Repeat from more than one point. Record unexpected paths as unresolved; a ground symbol in a photograph is not enough to decide that every nearby terminal is ground.
  5. Compare your recorded map with the exact manufacturer drawing. Resolve every contact needed by the proposed example, plus power rails and possible onboard loads, before considering an installed controller. A meter map alone does not reveal hidden operating behavior.

Download the blank connection worksheet. CSV means comma-separated values, a plain-text table format. Its cells start empty and its rows say not_measured; no example resistance is presented as a result. Record the meter range, probe direction, board revision and jumper configuration in your own copy. Add rows for every real terminal rather than assuming that the worksheet's initial row count describes the product.

Unpowered carrier audit keeps controller removed, records socket-to-terminal resistance in both directions, checks neighboring nets and waits for exact power documentation.
Original investigation workflow, not a LAFVIN pinout or a measured continuity map. Full-size PNG · Editable SVG.

Build the documented baseline first

Use an Espressif ESP32-DevKitC V4 carrying ESP32-WROOM-32E, with accessible matching headers. Keep it outside the unknown carrier. The official DevKitC V4 guide identifies the board and connector names. USB means Universal Serial Bus; here its Micro-USB connection supplies power and carries programming/console communication. It is the only power source in this experiment.

PartExact choice or requirementJob
ControllerEspressif ESP32-DevKitC V4 / ESP32-WROOM-32E; fitted usable headersRuns the classic ESP32 example; the unverified listing's bundled board is not assumed to be this board.
D1Kingbright WP7113ID red through-hole LEDVisible output. LED means light-emitting diode. Its two lead names are anode and cathode; it lights with current flowing from anode to cathode.
R11 kΩ, ±5% or better, at least 0.125 WLimits the indicator's current. A kilohm is 1,000 ohms; W means watt, a unit of electrical power.
S1Normally open momentary SPST buttonConnects the input to ground only while pressed. SPST means single-pole single-throw: one switched connection.
AssemblyShort insulated jumpers, suitable low-voltage prototyping support, USB data cable and multimeterAccessible stable connections. Identify contact groups with power off.

GPIO means general-purpose input/output, a configurable digital signal pin. GND means ground, the common reference for the input and output. The official header table gives J3 contact 2 as IO23, contact 9 as IO18 and contacts 1/7 as GND. Verify the physical orientation against the guide's photograph before counting.

ConnectionPurpose
IO23 / J3-2 → R1 → D1 anode; D1 cathode → GND / J3-1A high output sends a small current through the resistor and LED. Confirm LED orientation from its package drawing.
IO18 / J3-9 → S1 → GND / J3-7A press makes a low input. No external supply drives this signal.
Micro-USB → computerThe sole source of board power. Leave external power, 5V and 3V3 header feeds disconnected.

Wire with USB disconnected. A four-legged tactile button can contain two permanently joined pairs; identify the two switched sides with a continuity check. Connect one contact from each switched side. Do not assume that opposite-looking corners are correct. Keep the LED resistor in series even during troubleshooting; replacing it with a wire changes the electrical problem.

For a scale check, temporarily ignore the LED's voltage drop. A milliampere, mA, is one thousandth of an ampere, the current unit. At a nominal 3.3 V, the smallest allowed resistor is 950 Ω, so the resistor-only current bound is 3.3 / 950 = 3.47 mA. Its corresponding resistor power is 3.3² / 950 = 0.0115 W. Actual LED current is smaller because the LED and output driver also drop voltage. These calculations are not measured brightness, a GPIO damage limit or permission to drive a motor.

Known ESP32-DevKitC V4 baseline: GPIO23 through one kilohm to a red LED and ground, GPIO18 through a normally open button to ground, USB as the only power source, unknown carrier disconnected.
Original direct-board schematic. A marks the anode; K marks the cathode. J3 numbering applies only to the stated Espressif DevKitC V4, not to the advertised carrier or an ESP32-S3 board. Full-size PNG · Editable SVG.

Run one complete button-and-indicator program

Use the Arduino integrated development environment, abbreviated IDE, with Espressif's Arduino-ESP32 core 3.3.2. A core is the board-support software that supplies the hardware API; API means application programming interface, the functions called by the sketch. The official release exists; pinning it makes the instructions repeatable rather than claiming it is the newest version. Follow Espressif's installation instructions and choose the ESP32 Dev Module profile for this classic target. Use the actual board's port and its 4 MB flash configuration: MB means megabytes, and flash is the board's nonvolatile program storage.

Create a sketch folder named esp32_terminal_breakout containing both files below. Keep a local copy before uploading. The compile-time guard rejects other target families; it cannot inspect a real connector or recognize a substituted board. Successful upload remains a target-side task, not something established by the host checks reported here.

INPUT_PULLUP enables the input's internal weak pull-up: an unpressed button reads high, and a press to ground reads low. This is active-low behavior. A debounce interval requires the observed state to remain unchanged before accepting it; it reduces repeated counts from mechanical contact chatter. Here the chosen interval is 25 milliseconds, where a millisecond is one thousandth of a second. It is an application setting, not a measured property of every button.

A qualified press toggles the LED once. Holding the button does not repeatedly toggle it. If the board starts with the button held, the LED stays off until the contact has been released and a new press occurs. The decision logic keeps raw, candidate and accepted states separate so that a bouncing release cannot immediately rearm the next press. Its elapsed-time arithmetic also handles the millisecond counter wrapping back to zero after its largest value. This counter is 32-bit: its value occupies 32 binary digits.

Complete two-file source

Download the sketch and its complete decision header. Both are required; there is no hidden library specific to this project.

button_indicator.h

#pragma once
#include <stdint.h>

// Pure application policy. This does not model an electrical switch or GPIO.
class ButtonIndicator {
 public:
  static constexpr uint32_t kDebounceMs = 25;
  void begin(uint32_t now, bool pressed) {
    candidate_ = stable_ = pressed;
    since_ = now;
    armed_ = !pressed;
    led_ = false;
  }
  bool update(uint32_t now, bool pressed) {
    if (pressed != candidate_) {
      candidate_ = pressed;
      since_ = now;
    }
    if (candidate_ == stable_ || uint32_t(now - since_) < kDebounceMs) return false;
    stable_ = candidate_;
    if (!stable_) {
      armed_ = true;
      return false;
    }
    if (!armed_) return false;
    armed_ = false;
    led_ = !led_;
    return true;
  }
  bool led() const { return led_; }
  bool armed() const { return armed_; }
 private:
  bool candidate_ = false;
  bool stable_ = false;
  bool armed_ = false;
  bool led_ = false;
  uint32_t since_ = 0;
};

esp32_terminal_breakout.ino

#include <Arduino.h>
#include "button_indicator.h"

// Classic ESP32 only: ESP32-DevKitC V4 / ESP32-WROOM-32E.
// Arduino-ESP32 3.3.2, "ESP32 Dev Module", USB as the only power source.
#if !defined(ARDUINO_ARCH_ESP32) || !defined(CONFIG_IDF_TARGET_ESP32)
#error "This example requires the classic ESP32 target, not ESP32-S3/C3/S2."
#endif

constexpr uint8_t kLedPin = 23;
constexpr uint8_t kButtonPin = 18;
ButtonIndicator indicator;

void setup() {
  pinMode(kLedPin, OUTPUT);
  digitalWrite(kLedPin, LOW);
  pinMode(kButtonPin, INPUT_PULLUP);
  indicator.begin(uint32_t(millis()), digitalRead(kButtonPin) == LOW);
  Serial.begin(115200);
  Serial.println("Classic ESP32: USB only; GPIO23 LED; GPIO18 button.");
}

void loop() {
  if (indicator.update(uint32_t(millis()), digitalRead(kButtonPin) == LOW)) {
    digitalWrite(kLedPin, indicator.led() ? HIGH : LOW);
    Serial.println(indicator.led() ? "LED ON" : "LED OFF");
  }
  delay(1);  // A requested delay, not a guaranteed sampling period.
}

Repeat the tests before changing the wiring

  1. Start with the button released and the known direct-board connections inspected. Apply USB power. Open the Serial Monitor, the IDE's text console, at 115200 bits per second. Expect the identification message and a dark external LED after setup. The board's own power indicator is a different LED.
  2. Press once, hold for two seconds, then release. Expect one LED ON message and no repeated state changes during the hold. Press again after a settled release; expect LED OFF. Record what actually happens rather than copying these expectations as observations.
  3. Disconnect USB. Hold S1, reconnect USB, and keep holding. The external indicator should stay off. Release, wait, then press. This distinguishes deliberate startup handling from a program that interprets a held startup as a new event.
  4. Power down and disconnect only one button lead. Reconnect USB. The pull-up normally makes the disconnected input look released. This program does not diagnose a broken button wire. Reconnect with power off. A plausible digital level is not proof that a remote contact is present.
  5. Power down and inspect the LED path. A reversed or disconnected LED can remain dark even while the program prints a state change. Restore the documented polarity and resistor. A software log describes a command; it does not measure current or establish that the light actually illuminated.

Keep a short results table containing wiring version, controller marking, core version, startup button state, action, printed transition and visible result. Use the same code and components for later comparisons. If the direct baseline fails, investigate it before introducing an extra board: otherwise two changes arrive together and neither result has a clear explanation.

When may the carrier join the experiment?

Only after the delivered carrier's manufacturer documentation and your unpowered map agree about the controller socket, power routing, jumper functions and onboard loads should you consider a powered comparison. Confirm that its exact socket accepts the actual DevKitC board with every contact correctly aligned; a 30-pin socket is not a 38-pin socket made usable by leaving pins overhanging. The USB connector must remain accessible without bent pins or mechanical strain.

For this lesson, the proposed comparison retains the same USB-only source and the same GPIO23/18/GND circuit. It requires evidence that the carrier's unused power connections will not conflict with that arrangement. Do not connect its external-power input or change an unknown selector to make a photograph look right. If this evidence is unavailable, the valid end point is the completed direct baseline plus an unresolved carrier map. No powered LAFVIN-specific wiring instruction is being invented here.

A terminal assembly also needs the correct wire size and preparation, stripped length, screw procedure and any specified tightening torque from its manufacturer. Torque is twisting force. Do not invent a universal screw setting or clamp onto insulation. With power disconnected, check that no bare strand reaches a neighboring terminal, perform the documented retention check and inspect continuity again. Repeatedly tightening a screw harder cannot fix a wrong net assignment.

After any accepted carrier installation, repeat the same startup, press/hold, release and missing-button observations, changing only the connection route. Label those results separately. A difference can come from routing, a loose terminal, added resistance or an onboard indicator; it is not automatically a processor or firmware fault. Keep any unexplained difference as a finding rather than editing the code until it disappears.

Fault clues and limits

Challenge: which observation proves a direct copper connection?

A terminal gives a continuity beep to a suspected socket contact in one probe direction and a different reading when the probes reverse. Does that prove the two labels are interchangeable? No. A semiconductor path, an indicator circuit or other network may be involved. Record both readings, test neighboring contacts and consult the exact schematic. Even a low symmetric resistance does not establish a current rating, acceptable supply direction or connector fit.

For the software, a press first observed at 100 ms and still held at 124 ms has not passed the 25 ms interval. A matching sample at 125 ms qualifies it. If the input changes at 120 ms, the candidate interval restarts; the older observation cannot be reused to accept the new state early.

What has actually been checked?

The host test program compiles the actual sketch and decision header with simulated Arduino functions. Twenty-seven behavior checks exercise startup while held, bounce rejection, settled release, sustained hold, a second press, irregular samples, counter wrap and the actual sketch's pin modes, output calls and messages. These checks establish application behavior at the mocked boundary. They do not build ESP32 firmware or measure real contacts, GPIO voltage, timing, terminal heating or carrier compatibility.

The original diagrams describe a proposed known-board circuit and an investigation procedure. The supplied worksheet contains no measurements. Physical assembly, target compilation/upload, actual board identity, all carrier mapping and every powered result remain for a documented bench session. This separation makes the article useful even when the honest carrier result is “not enough information yet.”

Sources and related learning

Continue with the Tricky Circuit interactive lessons after establishing your own wiring and observations. Manufacturer references remain separate from the purchase offer. A product photograph and a working software test answer different questions.