Devantech SRF02, 08, 10 Ultrasonic Ranger reader

This code reads a Devantech SRF02 ultrasonic ranger (and probably an SRF08 and SRF10 as well) It uses the Wire library for Wiring and Arduino.

SRF02 sensor and Arduino schematic


  SRF02 sensor reader

 language: Wiring/Arduino Reads data from a Devantech SRF02 ultrasonic sensor.

 Should also work for the SRF08 and SRF10 sensors as well.

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:


// the commands needed for the SRF sensors:

#define sensorAddress 0x70

#define readInches 0x50

// use these as alternatives if you want centimeters or microseconds:

#define readCentimeters 0x51

#define readMicroseconds 0x52

// this is the memory register in the sensor that contains the result:

#define resultRegister 0x02

void setup()


  // start the I2C bus


  // open the serial port:



void loop()


  // send the command to read the result in inches:

  sendCommand(sensorAddress, readInches);

  // wait at least 70 milliseconds for a result:


  // set the register that you want to reas the result from:

  setRegister(sensorAddress, resultRegister);

// read the result:

  int sensorReading = readData(sensorAddress, 2);

  // print it:

  Serial.print("distance: ");


  Serial.println(" inches");

  // wait before next reading:




  SendCommand() sends commands in the format that the SRF sensors expect


void sendCommand (int address, int command) {

  // start I2C transmission:


  // send command:



  // end I2C transmission:




  setRegister() tells the SRF sensor to change the address pointer position


void setRegister(int address, int thisRegister) {

  // start I2C transmission:


  // send address to read from:


  // end I2C transmission:




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;

This entry was posted in arduino/wiring. Bookmark the permalink.

Comments are closed.