Simple library for reading distance from SRF02 Ultrasonic Sensor in I2C mode. With the use of imperial readings too

Fork of SRF02 by Craig Evans

Committer:
el15pjt
Date:
Fri Apr 15 13:24:10 2016 +0000
Revision:
3:78c8202f8929
Parent:
0:b729d2ce03bd
Menus added. Bug in buzzer still!

Who changed what in which revision?

UserRevisionLine numberNew contents of line
eencae 0:b729d2ce03bd 1 /**
eencae 0:b729d2ce03bd 2 @file SRF02.cpp
eencae 0:b729d2ce03bd 3
eencae 0:b729d2ce03bd 4 @brief Member functions implementations
eencae 0:b729d2ce03bd 5
eencae 0:b729d2ce03bd 6 */
eencae 0:b729d2ce03bd 7 #include "mbed.h"
eencae 0:b729d2ce03bd 8 #include "SRF02.h"
eencae 0:b729d2ce03bd 9
eencae 0:b729d2ce03bd 10 SRF02::SRF02(PinName sdaPin, PinName sclPin)
eencae 0:b729d2ce03bd 11 {
eencae 0:b729d2ce03bd 12 i2c = new I2C(sdaPin,sclPin); // create new I2C instance and initialise
eencae 0:b729d2ce03bd 13 i2c->frequency(400000); // I2C Fast Mode - 400kHz
eencae 0:b729d2ce03bd 14 leds = new BusOut(LED4,LED3,LED2,LED1);
eencae 0:b729d2ce03bd 15
eencae 0:b729d2ce03bd 16 }
eencae 0:b729d2ce03bd 17
el15pjt 3:78c8202f8929 18 int SRF02::getDistannceInch()
el15pjt 3:78c8202f8929 19 {
el15pjt 3:78c8202f8929 20 char data[2];
el15pjt 3:78c8202f8929 21
el15pjt 3:78c8202f8929 22 // need to send CM command to command register
el15pjt 3:78c8202f8929 23 data[0] = CMD_REG;
el15pjt 3:78c8202f8929 24 data[1] = INCH_CMD;
el15pjt 3:78c8202f8929 25 int ack = i2c->write(SRF02_W_ADD,data,2);
el15pjt 3:78c8202f8929 26 if (ack)
el15pjt 3:78c8202f8929 27 error(); // if we don't receive acknowledgement, flash error message
el15pjt 3:78c8202f8929 28
el15pjt 3:78c8202f8929 29 // this will start the sensor ranging, the datasheet suggests a delay of at least 65 ms before reading the result
el15pjt 3:78c8202f8929 30 wait_ms(70);
el15pjt 3:78c8202f8929 31
el15pjt 3:78c8202f8929 32 // we can now read the result - tell the sensor we want the high byte
el15pjt 3:78c8202f8929 33 char reg = RANGE_H_REG;
el15pjt 3:78c8202f8929 34 ack = i2c->write(SRF02_W_ADD,&reg,1);
el15pjt 3:78c8202f8929 35 if (ack)
el15pjt 3:78c8202f8929 36 error(); // if we don't receive acknowledgement, flash error message
el15pjt 3:78c8202f8929 37
el15pjt 3:78c8202f8929 38 // if we read two bytes, the register is automatically incremented (H and L)
el15pjt 3:78c8202f8929 39 ack = i2c->read(SRF02_R_ADD,data,2);
el15pjt 3:78c8202f8929 40 if (ack)
el15pjt 3:78c8202f8929 41 error(); // if we don't receive acknowledgement, flash error message
el15pjt 3:78c8202f8929 42
el15pjt 3:78c8202f8929 43 // high byte is first, then low byte, so combine into 16-bit value
el15pjt 3:78c8202f8929 44 return (data[0] << 8) | data[1];
el15pjt 3:78c8202f8929 45 }
eencae 0:b729d2ce03bd 46 int SRF02::getDistanceCm()
eencae 0:b729d2ce03bd 47 {
eencae 0:b729d2ce03bd 48 char data[2];
eencae 0:b729d2ce03bd 49
eencae 0:b729d2ce03bd 50 // need to send CM command to command register
eencae 0:b729d2ce03bd 51 data[0] = CMD_REG;
eencae 0:b729d2ce03bd 52 data[1] = CM_CMD;
eencae 0:b729d2ce03bd 53 int ack = i2c->write(SRF02_W_ADD,data,2);
eencae 0:b729d2ce03bd 54 if (ack)
eencae 0:b729d2ce03bd 55 error(); // if we don't receive acknowledgement, flash error message
eencae 0:b729d2ce03bd 56
eencae 0:b729d2ce03bd 57 // this will start the sensor ranging, the datasheet suggests a delay of at least 65 ms before reading the result
eencae 0:b729d2ce03bd 58 wait_ms(70);
eencae 0:b729d2ce03bd 59
eencae 0:b729d2ce03bd 60 // we can now read the result - tell the sensor we want the high byte
eencae 0:b729d2ce03bd 61 char reg = RANGE_H_REG;
eencae 0:b729d2ce03bd 62 ack = i2c->write(SRF02_W_ADD,&reg,1);
eencae 0:b729d2ce03bd 63 if (ack)
eencae 0:b729d2ce03bd 64 error(); // if we don't receive acknowledgement, flash error message
eencae 0:b729d2ce03bd 65
eencae 0:b729d2ce03bd 66 // if we read two bytes, the register is automatically incremented (H and L)
eencae 0:b729d2ce03bd 67 ack = i2c->read(SRF02_R_ADD,data,2);
eencae 0:b729d2ce03bd 68 if (ack)
eencae 0:b729d2ce03bd 69 error(); // if we don't receive acknowledgement, flash error message
eencae 0:b729d2ce03bd 70
eencae 0:b729d2ce03bd 71 // high byte is first, then low byte, so combine into 16-bit value
eencae 0:b729d2ce03bd 72 return (data[0] << 8) | data[1];
eencae 0:b729d2ce03bd 73 }
eencae 0:b729d2ce03bd 74
eencae 0:b729d2ce03bd 75 void SRF02::error()
eencae 0:b729d2ce03bd 76 {
eencae 0:b729d2ce03bd 77 while(1) {
eencae 0:b729d2ce03bd 78 leds->write(15);
eencae 0:b729d2ce03bd 79 wait(0.1);
eencae 0:b729d2ce03bd 80 leds->write(0);
eencae 0:b729d2ce03bd 81 wait(0.1);
eencae 0:b729d2ce03bd 82 }
eencae 0:b729d2ce03bd 83 }