Blog

Practical i2c, in writing

Hands-on articles that pick up where the reference pages stop — scanning, debugging, Raspberry Pi setup and hardware picks.

Deep diveJul 15, 2026

The history of i2c: why Philips built it in 1982

Who invented i2c and why: Philips in 1982, the TV problem it solved, every spec revision to 2021, and where the bus ended up — including your monitor cable.

Read →
TutorialJul 15, 2026

ADS1115 tutorial: a real ADC over i2c

Wire and code the ADS1115 16-bit i2c ADC: address 0x48-0x4B, single-ended vs differential, the gain setting that decides your range, Arduino and Pi code.

Read →
TutorialJul 15, 2026

MCP23017 tutorial: 16 more GPIOs over i2c

Add 16 GPIO pins over two wires with the MCP23017: address 0x20-0x27, banks and direction registers, built-in pull-ups, interrupts, and Arduino code.

Read →
TutorialJul 15, 2026

DS3231 RTC tutorial: set the time over i2c

Wire, set and read the DS3231 real-time clock over i2c: the fixed 0x68 address and what it collides with, BCD registers, the battery, and drift you can trust.

Read →
TutorialJul 15, 2026

VL53L0X tutorial: lidar distance over i2c

Read distance with the VL53L0X time-of-flight sensor over i2c, and run several despite the fixed 0x29 address — the XSHUT trick, step by step.

Read →
TutorialJul 15, 2026

MPU-6050 tutorial: motion sensing over i2c

Wire and read the MPU-6050 accelerometer and gyro over i2c: waking it from sleep, the 0x68/0x69 address, scaling raw counts to g and deg/s, and drift.

Read →
TroubleshootingJul 15, 2026

The i2c address collisions that actually bite

Real i2c address conflicts found by auditing 50 boards: 0x68, 0x5A, 0x3C, 0x70 and the PCA9685 all-call nobody expects. Which pairs clash, and the fix for each.

Read →
TutorialJul 15, 2026

PCA9685 servo tutorial: 16 servos, two wires

Wire and code the PCA9685 i2c servo driver: Arduino and MicroPython examples, the 50 Hz frequency servos need, and the 0x70 all-call nobody expects.

Read →
ComparisonJul 15, 2026

MLX90640 vs AMG8833: which i2c thermal camera?

MLX90640 (32x24) vs AMG8833 Grid-EYE (8x8) over i2c — resolution, frame rate, the RAM the maths needs, address clashes and which host each one demands.

Read →
TutorialJul 13, 2026

i2c LCD on Arduino: wiring, address & code

Drive a 1602 or 2004 LCD over i2c with a PCF8574 backpack and LiquidCrystal_I2C — find the address, set the contrast, and print text.

Read →
Buyer's guideJul 13, 2026

The best i2c sensors for ESP32

Ten i2c sensors that shine on ESP32 — environment, true CO2, distance, gesture, precision ADC and battery gauges, with addresses and wiring notes.

Read →
ComparisonJul 13, 2026

INA219 vs INA260: which power monitor?

INA219 vs INA260 — external vs built-in shunt, current range, accuracy and register math, and which i2c power monitor to actually buy.

Read →
ComparisonJul 13, 2026

BME280 vs BME680 vs ENS160 vs SCD41

BME280, BME680, ENS160 and SCD41 compared — what each actually measures, why eCO2 isn't real CO2, bus addresses, and which air sensor fits your project.

Read →
TutorialJul 11, 2026

MicroPython i2c tutorial: Pico & ESP32

i2c in MicroPython — machine.I2C setup on the Pico and ESP32, scanning, readfrom_mem register access, SoftI2C and multi-byte decoding.

Read →
TutorialJul 11, 2026

TCA9548A i2c multiplexer tutorial: 8 sensors, one address

Wire and code the TCA9548A i2c multiplexer: channel-select bytes, running eight identical sensors on one bus, with Arduino and MicroPython examples.

Read →
TutorialJul 11, 2026

SSD1306 OLED over i2c: wiring, code, fixes

Get the SSD1306 OLED running over i2c — wiring, Arduino and MicroPython code, and the classic fixes: 0x3C vs 0x78, blank screens and garbled output.

Read →
Deep diveJul 11, 2026

How i2c works, byte by byte

i2c at the electrical and protocol level: open-drain lines and pull-ups, START/STOP framing, 7-bit addressing, ACK/NACK, clock stretching and arbitration.

Read →
How-toJul 11, 2026

Arduino i2c tutorial: the Wire library from scratch

Wire.begin to requestFrom: reading and writing registers, repeated starts, error codes and the pitfalls — a working i2c tutorial for Arduino and ESP32.

Read →
Deep diveJul 11, 2026

i2c cable length: how far can it actually go?

How far i2c can go: the 400 pF capacitance budget, plus tricks to stretch it — slower clocks, stronger pull-ups, buffers and differential extenders.

Read →
How-toJul 11, 2026

i2c scanner: how to scan the i2c bus

Find every device on your i2c bus in a minute — scanner code for Arduino, i2cdetect on Raspberry Pi and MicroPython, plus how to read the results.

Read →
TroubleshootingJul 11, 2026

i2c device not detected? The 7-step checklist

A systematic troubleshooting checklist for when i2cdetect shows nothing: wiring, power, pull-ups, addresses, voltage mismatches and the fixes for each.

Read →
Buyer's guideJul 11, 2026

The best i2c sensors for Raspberry Pi

Six i2c sensors for the Raspberry Pi — environment, CO₂, light, distance, motion and a rock-solid RTC — all 3.3 V-safe, solderless, mature drivers.

Read →
How-toJul 11, 2026

How to enable i2c on the Raspberry Pi

Enable the i2c bus on any Raspberry Pi with raspi-config or config.txt, verify it with i2cdetect, raise the bus speed, and dodge the clock-stretching bug.

Read →
Deep diveJul 11, 2026

i2c clock stretching, explained

What clock stretching is, which sensors rely on it, and why the Raspberry Pi's hardware i2c controller famously mishandles it — with three workarounds.

Read →

Looking for reference?

The evergreen lookups live outside the blog: the i2c address list, pull-up resistor values, i2c vs SPI, address-conflict fixes and the logic-analyzer buyer's guide.