This code reads a Devantech CMPS03 digital compass on Wiring or Arduino using the Wire library for I2C.
/* CMPS03 compass reader language: Wiring/Arduino Reads data from a Devantech CMP03 compass sensor. Sensor connections: SDA - Analog pin 4 SCL - Analog pin 5 created 5 Mar. 2007 by Tom Igoe */ // include Wire library to read and write I2C commands: #include// the commands needed for the SRF sensors: #define sensorAddress 0x60 // this is the memory register in the sensor that contains the result: #define resultRegister 0x02 void setup() { // start the I2C bus Wire.begin(); // open the serial port: Serial.begin(9600); } void loop() { // send the command to read the result in inches: setRegister(sensorAddress, resultRegister); // read the result: int bearing = readData(sensorAddress, 2); // print it: Serial.print("bearing: "); Serial.print(bearing/10); Serial.println(" degrees"); // wait before next reading: delay(70); } /* setRegister() tells the SRF sensor to change the address pointer position */ void setRegister(int address, int thisRegister) { // start I2C transmission: Wire.beginTransmission(address); // send address to read from: Wire.send(thisRegister); // end I2C transmission: Wire.endTransmission(); } /* readData() returns a result from the SRF sensor */ int readData(int address, int numBytes) { int result = 0; // the result is two bytes long // send I2C request for data: Wire.requestFrom(address, numBytes); // wait for two bytes to return: while (Wire.available() < 2 ) { // wait for result } // read the two bytes, and combine them into one int: result = Wire.receive() * 256; result = result + Wire.receive(); // return the result: return result; }