Cheap ultrasonic range finder works with interrupts. Fork of original https://os.mbed.com/components/HC-SR04/ and update for MbedOS6+
Dependents: Nucleo_UltrasonicHelloWorld xxx_Sonar-HC-SR04_Lsg
ultrasonic.cpp
- Committer:
- JohnnyK
- Date:
- 2021-06-10
- Revision:
- 6:9808e2c61247
- Parent:
- 5:6fd0e9c7ead4
File content as of revision 6:9808e2c61247:
#include "ultrasonic.h" ultrasonic::ultrasonic(PinName trigPin, PinName echoPin, Kernel::Clock::duration_u32 updateSpeed, Kernel::Clock::duration_u32 timeout):_trig(trigPin), _echo(echoPin) { _updateSpeed = updateSpeed; _timeout = timeout; } ultrasonic::ultrasonic(PinName trigPin, PinName echoPin, Kernel::Clock::duration_u32 updateSpeed, Kernel::Clock::duration_u32 timeout, void onUpdate(int)) :_trig(trigPin), _echo(echoPin) { _onUpdateMethod=onUpdate; _updateSpeed = updateSpeed; _timeout = timeout; _t.start (); } void ultrasonic::_startT() { if(chrono::duration_cast<chrono::milliseconds>(_t.elapsed_time()).count()>600) { _t.reset (); } start = chrono::duration_cast<chrono::microseconds>(_t.elapsed_time()).count(); } void ultrasonic::_updateDist() { end = chrono::duration_cast<chrono::microseconds>(_t.elapsed_time()).count(); done = 1; _distance = (end - start)/6; _tout.detach(); _tout.attach(callback(this,&ultrasonic::_startTrig), _updateSpeed); } void ultrasonic::_startTrig(void) { _tout.detach(); _trig=1; wait_us(10); done = 0; _echo.rise(callback(this,&ultrasonic::_startT)); _echo.fall(callback(this,&ultrasonic::_updateDist)); _echo.enable_irq (); _tout.attach(callback(this,&ultrasonic::_startTrig),_timeout); _trig=0; } int ultrasonic::getCurrentDistance(void) { return _distance; } void ultrasonic::pauseUpdates(void) { _tout.detach(); _echo.rise(NULL); _echo.fall(NULL); } void ultrasonic::startUpdates(void) { _startTrig(); } void ultrasonic::attachOnUpdate(void method(int)) { _onUpdateMethod = method; } void ultrasonic::changeUpdateSpeed(Kernel::Clock::duration_u32 updateSpeed) { _updateSpeed = updateSpeed; } int ultrasonic::isUpdated(void) { //printf("%d", done); d=done; done = 0; return d; } void ultrasonic::checkDistance(void) { if(isUpdated()) { (*_onUpdateMethod)(_distance); } }