PCB Design Rules to Avoid Signal Noise in IoT Circuits
Intermediate1/8/2026- Author: IoTSpark Maker

PCB Design Rules to Avoid Signal Noise in IoT Circuits

Core PCB layout rules for reducing signal noise in IoT circuits — ground planes, trace spacing, decoupling capacitors, and WiFi antenna keepout zones — illustrated with an ESP32 + SHT31 (I2C) circuit.

KiCadPCBSignal IntegrityGround PlaneDecouplingAntenna KeepoutESP32SHT31I2C
0 steps2 components

This guide covers the core PCB layout rules for cutting signal noise in IoT circuits: ground planes/pours, trace spacing and width, decoupling capacitors near IC power pins, and keepout zones around the WiFi antenna — illustrated with an ESP32 DevKit V4 talking I2C to an SHT31 sensor.

Detailed guide

Core PCB layout rules for reducing signal noise in IoT circuits: ground plane, trace spacing, decoupling capacitor, and WiFi antenna keepout — illustrated with an ESP32 + SHT31 (I2C) circuit.

1. Introduction

A circuit that works fine on a breadboard isn't guaranteed to run reliably once it's on a PCB if the layout doesn't follow basic noise-reduction principles — especially for IoT circuits with a WiFi/BLE module (like the ESP32), which are very sensitive to high-frequency and power-supply noise. This guide covers four groups of PCB layout rules for reducing signal noise: the GND plane, sensible trace spacing/width, decoupling capacitors near IC power pins, and keepout zones around the WiFi antenna. The running example throughout is an ESP32 DevKit V4 talking I2C to an SHT31 sensor — the I2C bus is a classic case for discussing trace spacing and pull-ups, while the ESP32's onboard WiFi antenna is a real example for the keepout rule.

2. Components Needed

Component

Qty

Notes

ESP32 DevKit V4

1

Has an integrated WiFi/BLE module — used to illustrate the antenna keepout rule

SHT31 (I2C)

1

An I2C sensor, more accurate than the DHT22

3. Wiring Diagram (the real circuit used as an example)

SHT31

ESP32 DevKit V4

VCC

3V3

GND

GND

SDA

GPIO21 (SDA)

SCL

GPIO22 (SCL)

4. Rule 1 — Ground Plane (GND Pour)

A solid, unbroken GND plane right beneath the signal layer is the single most fundamental and effective noise-reduction technique. It gives every signal the shortest, most stable return path, cutting down current loops — the main source of radiated noise (EMI). In KiCad, you create a GND plane using the Zone tool (copper pour) assigned to the GND net, covering whatever board area is free. On the ESP32 + SHT31 circuit, even with just two I2C signals, having a solid GND pour makes the I2C bus noticeably more stable than routing a single thin GND trace.

5. Rule 2 — Sensible Trace Spacing and Width

Two basic principles:

  • High-speed or noise-sensitive traces (like SDA and SCL) should be kept short and avoid running parallel to each other over long distances — two closely-spaced parallel traces couple noise into each other (crosstalk). If they must run in parallel, increase the spacing between them or insert a GND trace between them as a shield.

  • Power traces (3V3, GND) should be wider than signal traces to reduce impedance and voltage drop — especially since the ESP32 draws fairly high peak current when transmitting WiFi (up to several hundred mA for brief moments). Weak or high-impedance power traces can cause a momentary voltage droop, triggering unexpected ESP32 resets.

For the SHT31's I2C bus, the SDA and SCL traces should run alongside each other with roughly matched lengths (to keep similar capacitance/resistance characteristics), and should avoid running right next to power traces or close to the antenna.

6. Rule 3 — Decoupling Capacitors Near IC Power Pins

A decoupling capacitor (typically a 100nF ceramic, sometimes paired with a 10µF electrolytic/tantalum near the supply input) should sit as close as possible to an IC's VCC pin. It filters high-frequency noise on the power line right at the point of consumption, preventing that noise from propagating back into the shared power plane. For an I2C sensor like the SHT31, place a 100nF capacitor right next to the module's VCC/GND pins (if you're designing your own board with the sensor integrated, rather than using a standalone module) to keep the sensor IC's supply voltage stable while the I2C bus is active. For the ESP32, a decoupling capacitor near the chip's power pins matters even more, since its current draw swings widely whenever the radio is active.

7. Rule 4 — Keepout Zone Around the WiFi Antenna

The ESP32 DevKit has its antenna printed directly on the board (or a chip antenna, depending on the version) — this area is very sensitive to conductive material placed nearby. When designing a board that carries an ESP32 (or a carrier board the ESP32 module plugs into), you need to follow the module manufacturer's recommended keepout zone:

  • Don't place copper (GND pour, traces, power planes) directly underneath or too close to the antenna area — module datasheets typically recommend keeping at least a few millimeters clear around it.

  • Don't place large metal parts (metal enclosures, big connectors) right next to the antenna, as they can shift its resonant frequency or attenuate the signal.

  • If you're designing a custom carrier board for an ESP32 module, let the module's antenna overhang the edge of the main board rather than sit in the middle, so other components don't block the signal.

This is why, in this example, the SHT31 sensor is placed away from the ESP32 module on the layout instead of right next to the antenna area.

8. ESP32 + SHT31 Sample Code (the I2C example circuit)

The code below boots up, periodically retries the I2C connection instead of hanging if the sensor isn't found, and prints JSON data over Serial every 2 seconds.

#include <Wire.h>
#include "Adafruit_SHT31.h"

Adafruit_SHT31 sht31 = Adafruit_SHT31();

const unsigned long TELEMETRY_INTERVAL_MS = 2000;
unsigned long lastTelemetryAt = 0;
bool sensorReady = false;

void setup() {
  Serial.begin(115200);
  delay(200);
  Serial.println();
  Serial.println(F("=== ESP32 + SHT31 (I2C) - Vi du minh hoa cho bai viet PCB signal integrity ==="));
  Serial.println(F("Boot OK. Khoi tao I2C va cam bien SHT31..."));

  Wire.begin(21, 22); // SDA=GPIO21, SCL=GPIO22

  sensorReady = sht31.begin(0x44);
  if (!sensorReady) {
    Serial.println(F("[WARN] Khong tim thay SHT31 tren dia chi 0x44 - kiem tra day I2C/pull-up."));
  } else {
    Serial.println(F("SHT31 san sang."));
  }
}

void loop() {
  unsigned long now = millis();
  if (now - lastTelemetryAt >= TELEMETRY_INTERVAL_MS) {
    lastTelemetryAt = now;

    float temperatureC = NAN;
    float humidity = NAN;

    if (sensorReady) {
      temperatureC = sht31.readTemperature();
      humidity = sht31.readHumidity();
    } else {
      // Thu ket noi lai dinh ky thay vi vong lap vo han
      sensorReady = sht31.begin(0x44);
    }

    Serial.print(F("{\"temperature_c\":"));
    if (isnan(temperatureC)) {
      Serial.print(F("null"));
    } else {
      Serial.print(temperatureC, 1);
    }
    Serial.print(F(",\"humidity_pct\":"));
    if (isnan(humidity)) {
      Serial.print(F("null"));
    } else {
      Serial.print(humidity, 1);
    }
    Serial.print(F(",\"uptime_ms\":"));
    Serial.print(now);
    Serial.println(F("}"));
  }
}

9. Common Issues

Issue

Cause

Fix

ESP32 resets itself when WiFi transmits at high power

Power traces too narrow, missing decoupling capacitor near the ESP32's power pins, momentary voltage droop when peak current spikes

Widen the power traces, add a 100nF + 10µF capacitor near the ESP32 module's 3V3 pin

SHT31 I2C reads occasionally fail/timeout

SDA/SCL traces too long, no GND pour for a return path, or routed near a noise source (power traces, antenna)

Shorten the I2C traces, ensure a solid GND pour underneath, and route the I2C traces away from the antenna area

ESP32 WiFi is weak or won't connect after moving to PCB, even though it worked fine on the breadboard

Antenna keepout zone violated — GND pour or metal components placed right under/near the module's antenna

Clear the copper pour from the keepout zone per the module's datasheet, and double-check component placement around the antenna

Crosstalk between two parallel signals

Two signal traces run close together over a long stretch with no GND trace shielding between them

Increase the spacing between the traces, or insert a GND trace/via between them as a shield

10. Summary

These four basic layout rules — a solid GND plane, sensible trace spacing/width, decoupling capacitors near IC power pins, and a keepout zone around the WiFi antenna — are the first things to check when an ESP32 circuit that worked fine on a breadboard runs into trouble (random resets, sensor read errors, weak WiFi) after moving to a PCB. For an IoT circuit combining low-speed digital signals (I2C) and high-frequency RF (WiFi) on the same board, as in this ESP32 + SHT31 example, following all four rules together significantly cuts the risk of having to redesign the board after it's already been ordered from the fab.