Wizard reading from the SFR02 Ultrasonic range finder

Hi, I´m working with the SFR02 Ultrasonic Range Finder (Devantech). And is given me one real measurement and then repeat 16 cm fake measurement four or five times, and then another real measurement. So this fake measurement doesn´t allow me to get a continous real mesurement.


SFR02 Spec.

Range detection 16 cm to 600 cm

I use this code


// include Wire library to read and write I2C commands:

#include <Wire.h>

// 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, readCentimeters);

  // 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(" Centimeters");

  // 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;


how much time is there between the readings? you have a delay of 70 millis() but it could be more. NB five time 70 + the sertial prints etc ==> 500 millis between good readings.

Most devices that need time to "recover" from measurements. Check the datasheet, what does it say?


(and please don't shout ;)

Rob, Thanks for the reply. I re checked the datasheet, the complete measurement cycle is 65ms, and recommends 70 ms delay between readings. Also said that the SFR02 doesn´t response to any command on the I2C bus whilst it is ranging, so I have no clue by is getting this 16cm false measurement.

About the shout, was a mistake. didn´t see it.

Any tip or advice to give it a try?

I would try it via serial comms and see if the behavior is the same.

Hi Pitu,

The strange thing is that it is (seems) to be consequent. How about the wiring? What is the length of the I2C wire?

Do have you pull up resistors in place ? Depending on the length they must be smaller See - http://www.gammon.com.au/forum/?id=10896 - at the bottom.

Further no ideas yet, Rob

I´m being doing some tests and now is given me right values from 16 cm away until 27 cm, but as soon as I try beyond 27 cm, it´s begin to reply with the fake 16 cm measurament .

I´m using a 100uf cap in parallel with the range finder to smooth it's power supply. As is recomend in the SFR02 Sonic Range Finder Reader Tutorial. But it didn´t make a diference about de ranging.

( http://arduino.cc/en/Tutorial/SFRRangerReader ).

Rob, the length of the 12C wire is less than 10 cm, but I planed to use longer wiring, so I´ll test with the 4.7k to check if I could get better results.

If doesn´t work, i´ll try via serial as jraskell suggest.

Guys, Any idea how to go with the SRF02 over Serial? The 2nd challenge how do integrate the SRF to any ATTiny? Any ideas are welcomed Y3G