DEV Community

Cover image for A Simple Fix for I2C Level Shifting: PCA9306 Module with Arduino Uno
David Thomas
David Thomas

Posted on

A Simple Fix for I2C Level Shifting: PCA9306 Module with Arduino Uno

Working with I2C sensors often means dealing with mixed voltage levels. Many modern sensors run at 3.3V, while popular boards like the Arduino Uno still operate at 5V. Directly connecting them is risky and can damage components. This is where the PCA9306 bidirectional I2C level shifter becomes extremely useful.

The PCA9306 is designed specifically for I2C and SMBus systems. Instead of building discrete MOSFET-based level shifters, this IC integrates everything into a compact and reliable solution. It automatically translates logic levels in both directions, keeps the I2C timing intact, and requires no software configuration.


What This Project Covers

This PCA9306 Module with Arduino Uno focuses on interfacing the PCA9306 logic level shifter with an Arduino Uno and a BMP180 pressure sensor.

It explains:

  • How the PCA9306 works internally
  • Proper pin connections for 3.3V ↔ 5V I2C communication
  • Why no special Arduino code is required
  • Common mistakes and troubleshooting tips
  • Practical use cases for real embedded projects

Understanding the PCA9306 Level Shifter

The PCA9306 handles two I2C lines: SDA and SCL. Each side of the IC operates at its own reference voltage:

  • VREF1 → Low-voltage side (typically 3.3V)
  • VREF2 → High-voltage side (typically 5V)

The IC uses an open-drain architecture, which is ideal for I2C. Pull-up resistors are usually provided on the low-voltage side, while the high-voltage side relies on the controller’s internal pull-ups (like those on the Arduino Uno).

A common ground between both voltage domains is mandatory. Without it, the level shifting will not work reliably.


PCA9306 Pin Overview (Arduino Uno Setup)

  • VREF1 → 3.3V (sensor side)
  • VREF2 → 5V (Arduino side)
  • SDA1 / SCL1 → 3.3V I2C device (BMP180)
  • SDA2 / SCL2 → Arduino I2C pins (A4 / A5)
  • EN → Pulled HIGH (usually tied to VREF2)
  • GND → Common ground for all devices

Once powered and enabled, the module immediately starts translating signals.

PCA9306-Module-Pinout


Hardware Used

Component Purpose
Arduino Uno Main microcontroller
PCA9306 Module Bidirectional I2C level shifting
BMP180 Sensor 3.3V I2C pressure sensor
Breadboard & Jumpers Prototyping connections
USB Cable Power and programming

PCA9306-Wiring-Diagram

The PCA9306 makes I2C level shifting simple, safe, and reliable. By handling direction detection and voltage translation automatically, it removes a common pain point in embedded design. When wired correctly, it allows seamless communication between 5V controllers and 3.3V peripherals without modifying firmware.

This project demonstrates that choosing the right hardware solution can eliminate entire classes of software and signal integrity problems.

For complete project files, wiring references, and examples, check the linked GitHub repository in the tutorial.
PCA9306 Module with Arduino Uno

Check out more Arduino projects for your next build. Happy building!

Top comments (0)