Ultra

Dependents:   Group2 c8_Final_course1

Committer:
kmsmile2
Date:
Wed Jun 12 08:06:16 2019 +0000
Revision:
5:77c5e5b512c7
Parent:
4:e0f9c9fb4cf3
ultra;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ejteb 0:6aa04a8c8d4c 1 #include "ultrasonic.h"
ejteb 0:6aa04a8c8d4c 2
kmsmile2 5:77c5e5b512c7 3 // generate a 10 us pulse to start HCSR04 ultrasonic sensor and
kmsmile2 5:77c5e5b512c7 4 // enable IRQ for echo pin.
kmsmile2 5:77c5e5b512c7 5 Ultrasonic::Ultrasonic(PinName trigPin, PinName echoPin, float timeout, bool repeat):\
kmsmile2 5:77c5e5b512c7 6 _trig(trigPin), _echo(echoPin), _toVal(timeout), _repeat(repeat)
kmsmile2 5:77c5e5b512c7 7 {
kmsmile2 5:77c5e5b512c7 8 _timer.reset();
kmsmile2 5:77c5e5b512c7 9 _echo.rise(this, &Ultrasonic::_startT);
kmsmile2 5:77c5e5b512c7 10 _echo.fall(this, &Ultrasonic::_endT);
kmsmile2 5:77c5e5b512c7 11 _echo.disable_irq();
kmsmile2 5:77c5e5b512c7 12 _done = 0;
kmsmile2 5:77c5e5b512c7 13 _cnt = 0;
kmsmile2 5:77c5e5b512c7 14 }
kmsmile2 5:77c5e5b512c7 15
kmsmile2 5:77c5e5b512c7 16 Ultrasonic::~Ultrasonic()
kmsmile2 5:77c5e5b512c7 17 {
kmsmile2 5:77c5e5b512c7 18 }
kmsmile2 5:77c5e5b512c7 19
kmsmile2 5:77c5e5b512c7 20 void Ultrasonic::trig(void)
kmsmile2 5:77c5e5b512c7 21 {
kmsmile2 5:77c5e5b512c7 22 _done = 0;
kmsmile2 5:77c5e5b512c7 23 _echo.enable_irq();
kmsmile2 5:77c5e5b512c7 24 _trig = 1; // trigger = 1
kmsmile2 5:77c5e5b512c7 25 wait_us(10); // for 10 sec
kmsmile2 5:77c5e5b512c7 26 _trig = 0; // turn off the trigger
kmsmile2 5:77c5e5b512c7 27 }
kmsmile2 5:77c5e5b512c7 28
kmsmile2 5:77c5e5b512c7 29 int Ultrasonic::getDistance(void)
kmsmile2 5:77c5e5b512c7 30 {
kmsmile2 5:77c5e5b512c7 31 if(_distance >= 0) // if the _distance is equal or more than 0, resume that detection is completed.
kmsmile2 5:77c5e5b512c7 32 return _distance; // return _distance.
kmsmile2 5:77c5e5b512c7 33 else
kmsmile2 5:77c5e5b512c7 34 return -1; // if not, return the '-1'.
kmsmile2 5:77c5e5b512c7 35 }
kmsmile2 5:77c5e5b512c7 36
kmsmile2 5:77c5e5b512c7 37 // return the echo pulse duration in us and return -1 in case of failure.
kmsmile2 5:77c5e5b512c7 38 int Ultrasonic::getPulseDuration(void)
kmsmile2 5:77c5e5b512c7 39 {
kmsmile2 5:77c5e5b512c7 40 if(_pulseDuration >= 0) // if the _pulseDuration is equal or more than 0, resume that detection is completed.
kmsmile2 5:77c5e5b512c7 41 return _pulseDuration; // return _pulseDuration.
kmsmile2 5:77c5e5b512c7 42 else
kmsmile2 5:77c5e5b512c7 43 return -1; // if not, return the '-1'.
kmsmile2 5:77c5e5b512c7 44 }
kmsmile2 5:77c5e5b512c7 45
kmsmile2 5:77c5e5b512c7 46 int Ultrasonic::getStatus(void)
kmsmile2 5:77c5e5b512c7 47 {
kmsmile2 5:77c5e5b512c7 48 return _done; // Measurement status
kmsmile2 5:77c5e5b512c7 49 }
kmsmile2 5:77c5e5b512c7 50
kmsmile2 5:77c5e5b512c7 51 void Ultrasonic::clearStatus(void)
kmsmile2 5:77c5e5b512c7 52 {
kmsmile2 5:77c5e5b512c7 53 _done = 0;
kmsmile2 5:77c5e5b512c7 54 _timer.reset();
kmsmile2 5:77c5e5b512c7 55 _echo.disable_irq();
kmsmile2 5:77c5e5b512c7 56 _cnt = 0;
kmsmile2 5:77c5e5b512c7 57 _distance = 0;
kmsmile2 5:77c5e5b512c7 58 }
kmsmile2 5:77c5e5b512c7 59
kmsmile2 5:77c5e5b512c7 60 void Ultrasonic::pauseMeasure(void)
kmsmile2 5:77c5e5b512c7 61 {
kmsmile2 5:77c5e5b512c7 62 _timeout.detach(); // make timeout detach to pause the measurement
kmsmile2 5:77c5e5b512c7 63 }
kmsmile2 5:77c5e5b512c7 64
kmsmile2 5:77c5e5b512c7 65
kmsmile2 5:77c5e5b512c7 66 void Ultrasonic::setMode(bool mode)
kmsmile2 5:77c5e5b512c7 67 {
kmsmile2 5:77c5e5b512c7 68 _repeat = mode; // input the value to _repeat according to the value of mode
kmsmile2 5:77c5e5b512c7 69 // _repeat determine the way of measurement
kmsmile2 5:77c5e5b512c7 70 }
kmsmile2 5:77c5e5b512c7 71
kmsmile2 5:77c5e5b512c7 72 void Ultrasonic::setTime(float time)
kmsmile2 5:77c5e5b512c7 73 {
kmsmile2 5:77c5e5b512c7 74 _toVal = time; // input the value to _toVal accoring to the value of time
kmsmile2 5:77c5e5b512c7 75 // _toVal make the interrupt of _timer which is a timer object
kmsmile2 5:77c5e5b512c7 76 }
kmsmile2 5:77c5e5b512c7 77
kmsmile2 5:77c5e5b512c7 78 void Ultrasonic::_startT(void)
kmsmile2 5:77c5e5b512c7 79 {
kmsmile2 5:77c5e5b512c7 80 _timer.start(); // read timer microseconds, this is starting time of the measurement
kmsmile2 5:77c5e5b512c7 81 }
kmsmile2 5:77c5e5b512c7 82
kmsmile2 5:77c5e5b512c7 83 void Ultrasonic::_endT(void)
kmsmile2 5:77c5e5b512c7 84 {
kmsmile2 5:77c5e5b512c7 85 _timer.stop(); // when the pulse is falling, timer pulsetime is stopped.
kmsmile2 5:77c5e5b512c7 86 _pulseDuration = _timer.read_us(); // and the value of timer pulsetime enter the variable 'pulsedur'
kmsmile2 5:77c5e5b512c7 87 _distance = (_pulseDuration*343)/20000; // 340m/s * sec / 2(rounded) / 10000 (/u*100)
kmsmile2 5:77c5e5b512c7 88 _timer.reset(); // After knowing the distance, time pulsetime is reseted.
kmsmile2 5:77c5e5b512c7 89 if(_repeat == true)
ejteb 0:6aa04a8c8d4c 90 {
kmsmile2 5:77c5e5b512c7 91 _timeout.attach(this, &Ultrasonic::_timeout_cb, _toVal);
kmsmile2 5:77c5e5b512c7 92 printf("%d trial: %dcm\r\n", (_cnt+1), _distance);
ejteb 0:6aa04a8c8d4c 93 }
kmsmile2 5:77c5e5b512c7 94 else
ejteb 0:6aa04a8c8d4c 95 {
kmsmile2 5:77c5e5b512c7 96 _echo.disable_irq();
kmsmile2 5:77c5e5b512c7 97 _done = 1;
kmsmile2 5:77c5e5b512c7 98 //printf("%dcm\r\n", _distance);
ejteb 0:6aa04a8c8d4c 99 }
kmsmile2 5:77c5e5b512c7 100 }
kmsmile2 5:77c5e5b512c7 101
kmsmile2 5:77c5e5b512c7 102 void Ultrasonic::_timeout_cb(void)
kmsmile2 5:77c5e5b512c7 103 {
kmsmile2 5:77c5e5b512c7 104
kmsmile2 5:77c5e5b512c7 105 if(_cnt >= 9)
ejteb 0:6aa04a8c8d4c 106 {
kmsmile2 5:77c5e5b512c7 107 _echo.disable_irq();
kmsmile2 5:77c5e5b512c7 108 _done = 1;
kmsmile2 5:77c5e5b512c7 109 _cnt = 0;
ejteb 0:6aa04a8c8d4c 110 }
kmsmile2 5:77c5e5b512c7 111 else
ejteb 0:6aa04a8c8d4c 112 {
kmsmile2 5:77c5e5b512c7 113 trig();
kmsmile2 5:77c5e5b512c7 114 _cnt++;
ejteb 0:6aa04a8c8d4c 115 }
kmsmile2 5:77c5e5b512c7 116 }
kmsmile2 5:77c5e5b512c7 117