I searched the internet and the forums trying to find code that worked for this range finder. I only found a couple of examples and neither worked. So a friend and myself set down and figured it out. We used the old code as our template and modified it.
All you have to do to make this work with your device is hook to 5v, ground, and digital pin 10.
Enjoy.
// Code modified and developed by Will Myers and Justin Miller
#include <SoftwareSerial.h>
#define txrxPin 10 // Defines Pin 10 to be used as both rx and tx for the SRF01
#define srfAddress 0x01 // Address of the SFR01
#define getSoft 0x5D // Byte to tell SRF01 we wish to read software version
#define getRange 0x53 // Byte used to get range from SRF01 in inches
#define getStatus 0x5F // Byte used to get the status of the transducer
SoftwareSerial UltrasonicBus(txrxPin, txrxPin); // Sets up the SoftwareSerial with Digital Pin 10 and sets the name to "UltrasonicBus"
void setup(){
Serial.begin(19200);
UltrasonicBus.begin(9600);
delay(200); // Waits some time to make sure that SRF01 is powered up
Serial.println("SRF01 Test");
SRF01_Cmd(srfAddress, getSoft); // Calls a function to get the SRF01 software version
while (UltrasonicBus.available() < 1); // Waits to get good data
int softVer = UltrasonicBus.read(); // Read software version from SRF01
Serial.print("V:");
Serial.println(softVer); // Prints the software version to LCD03
delay(200);
Serial.println("Initialization Complete"); // After inititalization is complete you should see the correct version of your device printed to the serial monitor
}
void loop(){
int max = 1; // Setup so that you can averaqe readings
int sum = 0; // Currently I am not taking an average.. Max = 1
for (int count = 0; count < max; count++) {
sum = sum + doRange(); // Calls a function to get range from SRF01 and sums the ranges up so that you can take an avg
}
int range = sum / max;
Serial.print("Range avg = ");
Serial.print(range); // Print range result to the screen
Serial.println(" "); // Print some spaces to the screen to make sure space direcly after the result is clear
checkLock(); // Calls a function to check if the transducer is locked or unlocked
}
void SRF01_Cmd(byte Address, byte cmd){ // Function to send commands to the SRF01
pinMode(txrxPin, OUTPUT); // Set pin to output and send break by sending pin low, waiting 2ms and sending it high again for 1ms
digitalWrite(txrxPin, LOW);
delay(2);
digitalWrite(txrxPin, HIGH);
delay(1);
UltrasonicBus.write(Address); // Send the address of the SRF01
UltrasonicBus.write(cmd); // Send commnd byte to SRF01
pinMode(txrxPin, INPUT); // Make input ready for Rx
int availableJunk = UltrasonicBus.available(); // Filter out the junk data
for(int x = 0; x < availableJunk; x++){
byte junk = UltrasonicBus.read();
}
}
void checkLock() {
SRF01_Cmd(srfAddress, getStatus); // Call to a function that checks if the trancducer is locked or unlocked
byte statusByte = UltrasonicBus.read(); // Reads the SRF01 status, The least significant bit tells us if it is locked or unlocked
int status = statusByte & 0x01; // Get status of lease significan bit
if(status == 0)
{
Serial.println("Unlocked"); // Prints the word unlocked followd by a couple of spaces to make sure space after has nothing in
}
else
{
Serial.println("Locked "); // Prints the word locked followd by a couple of spaces to make sure that the space after has nothing in
}
}
int doRange() {
SRF01_Cmd(srfAddress, getRange); // Calls a function to get range from SRF01
while (UltrasonicBus.available() < 2); // Waits to get good data
byte highByte = UltrasonicBus.read(); // Get high byte
byte lowByte = UltrasonicBus.read(); // Get low byte
int dist = ((highByte<<8)+lowByte); // Put them together
return dist;
}