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 Arduino.cc user Krodal

// Version 3, Feb 26 2013

// V3 by louarnold

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

// by Arduino.cc user Krodal.

// Changes by louarnold removed.

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

// according to the i2c scanner by Nick Gammon

// http://www.gammon.com.au/forum/?id=10896

// 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()

{

Wire.begin();

Serial.begin(9600);

Serial.println("\nI2C Scanner");

}

 

void loop()

{

byte error, address;

int nDevices;

Serial.println("Scanning...");

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.

Wire.beginTransmission(address);

error = Wire.endTransmission();

if (error == 0)

{

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

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

Serial.print(address,HEX);

Serial.println(" !");

nDevices++;

}

else if (error==4)

{

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

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

Serial.println(address,HEX);

}

}

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
Scanning...
I2C device found at address 0x3c
I2C device found at address 0x70 
I2C device found at address 0x72
done

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