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