Documentation

IIC I2C Logic Level Converter PRE-SOLDERED Bi-Directional
Documentation / IIC I2C Logic Level Converter PRE-SOLDERED Bi-Directional

IIC I2C Logic Level Converter PRE-SOLDERED Bi-Directional

Overview

The bi-directional logic level converter is a tiny but essential board that safely translates logic signals between 3.3V and 5V devices. You need one whenever you're connecting a 5V Arduino to a 3.3V sensor, driving a 5V peripheral from a 3.3V ESP32 or Raspberry Pi, or putting an I2C bus between mixed-voltage devices. Connect a 3.3V logic signal on one side and it comes out 5V on the other — cleanly, and without risking a blown GPIO pin.

This 4-channel module uses MOSFET-based bi-directional level shifting. Two channels (labeled Chan1 and Chan2) share the same low-voltage (LV) and high-voltage (HV) references, giving you four independent signal paths total. It works with I2C, SPI, UART, and most general-purpose digital signals up to a few megahertz — perfect for sensors like BME280, MPU6050, or ADS1115 when mixing voltage domains.

This manual covers specifications, the pinout, wiring for Arduino, ESP32, Raspberry Pi, and the Pico, a working I2C "hello world" using the level converter, and FAQs about signal speed, I2C pull-ups, and which side is which.

At a Glance

Channels
4 (2x 2-channel blocks)
Direction
Bi-directional
Low Side
1.8V - 3.6V
High Side
3.3V - 5V
Speed
Up to ~2 MHz (I2C friendly)
Protocols
I2C / SPI / UART

Specifications

Parameter Value
Design MOSFET-based bi-directional translator
Channels 4 total (2 per chip)
Low-Voltage Side (LV) 1.8V - 3.6V (3.3V typical)
High-Voltage Side (HV) 2.8V - 5.5V (5V typical)
Protocols Supported I2C, SPI, UART, 1-Wire, GPIO
Max Signal Speed ~2 MHz (typical I2C fast-mode)
Built-in Pull-ups 10 kΩ on each channel (LV and HV sides)
Operating Current Negligible (MOSFET-based)
Board Format Pre-soldered with male headers (both sides)
Pin Count 12 (6 per side: LV/HV, GND, 2x TX, 2x RX)

Pinout Diagram

Bi-Directional Logic Level Converter Pinout Diagram

Wiring Guide

The level converter is most commonly used to bridge I2C between a 5V Arduino and a 3.3V sensor, or a 3.3V ESP32/Pi/Pico and a 5V peripheral. Each example below uses the shifter on an I2C bus.

Arduino Wiring

Use the level converter when connecting a 5V Arduino Uno to a 3.3V-only sensor (e.g., a bare BME280 chip). Power both sides from their respective supplies.

Level Converter Connection Details
LV 3.3V rail Low-side reference voltage
HV Arduino 5V High-side reference voltage
GND (both) Common ground Tie LV GND and HV GND together
LV1 (TXI / RXO on LV) Sensor SDA (3.3V) I2C data, low-side
HV1 (TXO / RXI on HV) Arduino A4 (SDA, 5V) I2C data, high-side
LV2 Sensor SCL (3.3V) I2C clock, low-side
HV2 Arduino A5 (SCL, 5V) I2C clock, high-side
Tip: The module has built-in pull-ups on each channel, so you usually don't need extra I2C resistors. But if you already have strong pull-ups on the sensor board, remove one set to avoid fighting.

ESP32 Wiring

Use the level converter when the ESP32 (3.3V) needs to control a 5V peripheral — a 5V relay input, WS2801 strip, or 5V-logic display.

Level Converter ESP32 Side Peripheral Side
LV ESP32 3.3V —
HV — 5V supply
GND ESP32 GND Peripheral GND
LV1 ↔ HV1 GPIO 21 (SDA) 5V peripheral SDA
LV2 ↔ HV2 GPIO 22 (SCL) 5V peripheral SCL
Info: Many modern sensors have onboard level shifters (BME280, MPU6050 modules from ShillehTek), so check your sensor first — you may not need an external converter.

Raspberry Pi Wiring

Use the level converter when the Pi (3.3V GPIO) talks to a 5V-input peripheral that doesn't accept 3.3V logic (e.g., some relay modules, 5V LCDs, or WS2811 LEDs).

Level Converter Raspberry Pi Side Peripheral Side
LV 3.3V (Pin 1) —
HV — 5V (from external supply or Pi 5V Pin 2)
GND GND (Pin 6) Peripheral GND
LV1 ↔ HV1 GPIO 2 (SDA) 5V peripheral SDA
LV2 ↔ HV2 GPIO 3 (SCL) 5V peripheral SCL
Warning: Never feed 5V directly into a Pi GPIO pin — it can permanently damage the SoC. The level converter is specifically here to prevent that.

Raspberry Pi Pico Wiring

The Pico is a 3.3V-logic board. Use the level converter to talk safely to 5V peripherals.

Level Converter Pico Side Peripheral Side
LV 3.3V (Pin 36) —
HV — 5V (VBUS Pin 40 via USB, or external 5V)
GND GND (Pin 38) Peripheral GND
LV1 ↔ HV1 GP0 (SDA / TX) Peripheral SDA / RX
LV2 ↔ HV2 GP1 (SCL / RX) Peripheral SCL / TX

Code Examples

The level converter is transparent to software — your microcontroller reads and writes exactly as if it were talking to a same-voltage device. Below are minimal examples that exercise the shifted bus.

Arduino

level_shifter_i2c.ino
// Level-shifted I2C scan from 5V Arduino to 3.3V devices
// The shifter is on SDA/SCL; your code doesn't change.

#include <Wire.h>

void setup() {
  Serial.begin(9600);
  Wire.begin();
  Serial.println("Scanning I2C bus through level shifter...");
}

void loop() {
  byte count = 0;
  for (byte addr = 1; addr < 127; addr++) {
    Wire.beginTransmission(addr);
    if (Wire.endTransmission() == 0) {
      Serial.print("Found device at 0x");
      if (addr < 16) Serial.print("0");
      Serial.println(addr, HEX);
      count++;
    }
  }
  Serial.print("Total devices: ");
  Serial.println(count);
  delay(3000);
}

ESP32

level_shifter_esp32.ino
// ESP32 (3.3V) driving a 5V peripheral through the level shifter.
// Toggles a 5V output via one channel.

const int logicOut = 5;  // ESP32 GPIO, shifted to 5V on the other side

void setup() {
  Serial.begin(115200);
  pinMode(logicOut, OUTPUT);
}

void loop() {
  digitalWrite(logicOut, HIGH);
  Serial.println("5V side: HIGH");
  delay(500);
  digitalWrite(logicOut, LOW);
  Serial.println("5V side: LOW");
  delay(500);
}

Raspberry Pi

level_shifter_scan.py
# Raspberry Pi I2C scan through the level shifter
# Requires: sudo raspi-config -> Interface Options -> I2C enabled
# Install: sudo apt install i2c-tools
#          pip install smbus2

from smbus2 import SMBus

bus = SMBus(1)
print("Scanning I2C bus (through level shifter)...")
found = []
for addr in range(1, 128):
    try:
        bus.read_byte(addr)
        found.append(hex(addr))
    except OSError:
        pass
print("Devices:", found if found else "none")
bus.close()

Raspberry Pi Pico (MicroPython)

level_shifter_pico.py
# Pico I2C scan through the level shifter (GP0 SDA, GP1 SCL)

from machine import I2C, Pin

i2c = I2C(0, sda=Pin(0), scl=Pin(1), freq=100000)
devices = i2c.scan()
print("Devices found (through shifter):", [hex(d) for d in devices])

Frequently Asked Questions

Which side is LV (low voltage) and which is HV?
LV (usually marked on one edge) connects to the lower-voltage logic device (e.g., 3.3V). HV connects to the higher-voltage side (e.g., 5V). Miswiring the reference pins means the shifter won't work — signals may pass through at the wrong voltage or not at all.
Do I need external pull-up resistors on SDA/SCL?
The module has built-in 10 kΩ pull-ups, so usually no. If you're already using an I2C bus with its own pull-ups, you might end up with pull-ups in parallel — that's fine in practice. If communication gets flaky at high speed, remove one set.
How fast can this shifter go?
MOSFET-based shifters are reliable up to about 2 MHz — plenty for I2C (standard 100 kHz, fast 400 kHz) and UART. They start to struggle above ~4 MHz; for high-speed SPI, use a dedicated active shifter like a TXS0108E.
Can it drive signals that aren't I2C?
Yes. The module is protocol-agnostic and works with any digital signal — UART TX/RX, SPI MOSI/MISO/CLK, 1-Wire, plain GPIO. Because it's bi-directional, each channel works the same in either direction.
Why do I need both LV and HV supplies?
The shifter uses each side's voltage as a reference for its pull-ups and the MOSFET gate biasing. Without both supplies connected, the channels float and won't translate correctly.
Can I use this to step up power (not just signals)?
No. A level converter is for signals, not power. It can only source a few mA — far less than any motor or LED needs. Use a dedicated buck/boost converter for power rails.

Related Tutorials