Works with the parallax ping sensor. Uses a timer and interrupts to get the time and calculate the distance

Dependents:   CatPot_2v00_T_Sub CatPot_2v10_T_Sub CatPot_2v20_T_Sub CatPot_2v30_T_Sub

Fork of Ping by Joel Rosiene

Ping.cpp

Committer:
lilac0112_1
Date:
2016-03-10
Revision:
3:b9760df91b3d
Parent:
2:e252ca27589b

File content as of revision 3:b9760df91b3d:

#include "Ping.h"

#include "mbed.h"

Ping::Ping(PinName PING_PIN)
        : _event(PING_PIN)
        , _cmd(PING_PIN)
        , _timer()
        {
            _event.rise(this,&Ping::_Starts);
            _event.fall(this,&Ping::_Stops);
            _SPEED_OF_SOUND_CM = 33;
        } 
        
void Ping::_Starts(void)
{
      _Valid = false;  // start the timere, and invalidate the current time.
      _Busy = true;
      _timer.start();
      _Time = _timer.read_us();      
}

void Ping::_Stops(void)
{
      _Valid = true;  // When it stops, update the time
      _Busy = false;
      _Time = _timer.read_us()-_Time;
}

void Ping::Send()
{
     
     _cmd.output();
     _cmd.write(0);  // see the ping documentation http://www.parallax.com/Portals/0/Downloads/docs/prod/acc/28015-PING-v1.6.pdf
     wait_us(1);
     _cmd.write(1);
     wait_us(11);
     _cmd.write(0);
     _cmd.input();
     
}
void Ping::Set_Speed_of_Sound(int SoS_ms )
{
     _SPEED_OF_SOUND_CM = SoS_ms;
}

int Ping::Read_cm()
// -1 means not valid.
{
    if(_Valid && ~_Busy) 
        return ((_Time*_SPEED_OF_SOUND_CM)/1000/2);
    else 
        return -1;
}