MCP23008 8-bit I/O expander (DIP-18) with ESP32

Supply 3.3-5 V Bus I2C I2C address 0x20 / 0x21 / 0x22 / 0x23 / 0x24 / 0x25 / 0x26 / 0x27
SCLSDAA2A1A0RESETNCINTVSSGP0GP1GP2GP3GP4GP5GP6GP7VDD

Pins and ESP32 wiring

PinRoleESP32 pinNotes
SCLI2C clock (SCL)D22
SDAI2C data (SDA)D21
A2Not wired to the ESP32—Address bit: tie to GND or VDD
A1Not wired to the ESP32—
A0Not wired to the ESP32—
RESETNot wired to the ESP32—Reset, active LOW. Tie to VDD
NCNot wired to the ESP32—Not connected
INTInterruptD35Interrupt output, optional
VSSGroundGND
GP0Not wired to the ESP32—Expander I/O: to your LEDs or buttons, not to the ESP32
GP1Not wired to the ESP32—
GP2Not wired to the ESP32—
GP3Not wired to the ESP32—
GP4Not wired to the ESP32—
GP5Not wired to the ESP32—
GP6Not wired to the ESP32—
GP7Not wired to the ESP32—
VDDPower3V3

Suggested wiring for the 30-pin ESP32 DevKit, avoiding flash, input-only and strapping pins. BoardPilot checks it for you as you wire.

Starter code (Arduino)

#include <Wire.h>

void setup() {
  Serial.begin(115200);
  Wire.begin(21, 22);  // SDA = GPIO 21, SCL = GPIO 22
  Wire.beginTransmission(0x20);
  bool found = Wire.endTransmission() == 0;
  Serial.println(found ? "MCP23008 8-bit I/O expander (DIP-18) found at 0x20" : "Not found: check power, GND and SDA/SCL");
}

void loop() {}

Sources

Try it in 3D in BoardPilot

BoardPilot Part data (JSON)

Related parts

Part data: CC BY 4.0, free to reuse with credit to BoardPilot.