Works with interrupts
Dependents: Nucleo_UltrasonicHelloWorld Proj Nucleo_UltrasonicHelloWorld mbedTurtleCar ... more
ultrasonic.cpp
00001 #include "ultrasonic.h" 00002 00003 ultrasonic::ultrasonic(PinName trigPin, PinName echoPin, float updateSpeed, float timeout):_trig(trigPin), _echo(echoPin) 00004 { 00005 _updateSpeed = updateSpeed; 00006 _timeout = timeout; 00007 } 00008 00009 ultrasonic::ultrasonic(PinName trigPin, PinName echoPin, float updateSpeed, float timeout, void onUpdate(int)) 00010 :_trig(trigPin), _echo(echoPin) 00011 { 00012 _onUpdateMethod=onUpdate; 00013 _updateSpeed = updateSpeed; 00014 _timeout = timeout; 00015 _t.start (); 00016 } 00017 void ultrasonic::_startT() 00018 { 00019 if(_t.read()>600) 00020 { 00021 _t.reset (); 00022 } 00023 start = _t.read_us (); 00024 } 00025 00026 void ultrasonic::_updateDist() 00027 { 00028 end = _t.read_us (); 00029 done = 1; 00030 _distance = (end - start)/6; 00031 _tout.detach(); 00032 _tout.attach(this,&ultrasonic::_startTrig, _updateSpeed); 00033 } 00034 void ultrasonic::_startTrig(void) 00035 { 00036 _tout.detach(); 00037 _trig=1; 00038 wait_us(10); 00039 done = 0; 00040 _echo.rise(this,&ultrasonic::_startT); 00041 _echo.fall(this,&ultrasonic::_updateDist); 00042 _echo.enable_irq (); 00043 _tout.attach(this,&ultrasonic::_startTrig,_timeout); 00044 _trig=0; 00045 } 00046 00047 int ultrasonic::getCurrentDistance(void) 00048 { 00049 return _distance; 00050 } 00051 void ultrasonic::pauseUpdates(void) 00052 { 00053 _tout.detach(); 00054 _echo.rise(NULL); 00055 _echo.fall(NULL); 00056 } 00057 void ultrasonic::startUpdates(void) 00058 { 00059 _startTrig(); 00060 } 00061 void ultrasonic::attachOnUpdate(void method(int)) 00062 { 00063 _onUpdateMethod = method; 00064 } 00065 void ultrasonic::changeUpdateSpeed(float updateSpeed) 00066 { 00067 _updateSpeed = updateSpeed; 00068 } 00069 float ultrasonic::getUpdateSpeed() 00070 { 00071 return _updateSpeed; 00072 } 00073 int ultrasonic::isUpdated(void) 00074 { 00075 //printf("%d", done); 00076 d=done; 00077 done = 0; 00078 return d; 00079 } 00080 void ultrasonic::checkDistance(void) 00081 { 00082 if(isUpdated()) 00083 { 00084 (*_onUpdateMethod)(_distance); 00085 } 00086 }
Generated on Tue Jul 12 2022 12:36:21 by 1.7.2