Using the I2C bus

The I2C bus is a great way to connect modules to your HelvePic32. in this example I connect three modules:

  • a 8x8 led matrix from adafruit (0x72)
  • a 128x64 pixel OLED with a SSD1306 driver chip (0x3c)
  • a 14-segment alphanumeric display from adafruit (0x70)

The key to the module is the I2C address. There is a simplecode that scans the bus and displays all device found. This code came from the arduino i2cscanner, I just had to fix a call to a wire routine:


// --------------------------------------

// i2c_scanner


// Version 1

// The original author is not know.

// Version 2, Juni 2012, Using Arduino 1.0.1

// Adapted to be as simple as possible by user Krodal

// Version 3, Feb 26 2013

// V3 by louarnold

// Version 4, March 3, 2013, Using Arduino 1.0.3

// by user Krodal.

// Changes by louarnold removed.

// Scanning addresses changed from 0...127 to 1...119,

// according to the i2c scanner by Nick Gammon


// Version 5, March 28, 2013

// As version 4, but address scans now to 127.

// A sensor seems to use address 120.

// This sketch tests the standard 7-bit addresses

// Devices with higher bit address might not be seen properly.


#include <Wire.h>


void setup()




Serial.println("\nI2C Scanner");



void loop()


byte error, address;

int nDevices;


nDevices = 0;

for(address = 8; address < 127; address++ )


// The i2c_scanner uses the return value of

// the Write.endTransmisstion to see if

// a device did acknowledge to the address.


error = Wire.endTransmission();

if (error == 0)


Serial.print("I2C device found at address 0x");

if (address<16) Serial.print("0");


Serial.println(" !");



else if (error==4)


Serial.print("Unknow error at address 0x");

if (address<16) Serial.print("0");




if (nDevices == 0) Serial.println("No I2C devices found\n");

else Serial.println("done\n");

delay(5000); // wait 5 seconds for next scan





The Serial Monitor then shows the expected addresses:

I2C Scanner
I2C device found at address 0x3c
I2C device found at address 0x70 
I2C device found at address 0x72

I was able to use the adafruit libraries without modifications. I just had to replace the call to pgm_read_word as the PIC32 processors do not have (need) PROGMEM