Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of HCSR04 by
hcsr04.cpp@1:e01896ab28d7, 2016-10-24 (annotated)
- Committer:
- EmbeddedSam
- Date:
- Mon Oct 24 12:59:41 2016 +0000
- Revision:
- 1:e01896ab28d7
- Parent:
- 0:86b2086be101
added timeout functionality
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| antoniolinux | 0:86b2086be101 | 1 | #include "hcsr04.h" |
| antoniolinux | 0:86b2086be101 | 2 | #include "mbed.h" |
| antoniolinux | 0:86b2086be101 | 3 | /* |
| antoniolinux | 0:86b2086be101 | 4 | *HCSR04.cpp |
| antoniolinux | 0:86b2086be101 | 5 | */ |
| antoniolinux | 0:86b2086be101 | 6 | HCSR04::HCSR04(PinName t, PinName e) : trig(t), echo(e) {} |
| antoniolinux | 0:86b2086be101 | 7 | long HCSR04::echo_duration() { |
| antoniolinux | 0:86b2086be101 | 8 | |
| antoniolinux | 0:86b2086be101 | 9 | timer.reset(); //reset timer |
| EmbeddedSam | 1:e01896ab28d7 | 10 | timeout_timer.reset(); |
| EmbeddedSam | 1:e01896ab28d7 | 11 | |
| EmbeddedSam | 1:e01896ab28d7 | 12 | //Initiate Trigger |
| antoniolinux | 0:86b2086be101 | 13 | trig=0; // trigger low |
| antoniolinux | 0:86b2086be101 | 14 | wait_us(2); // wait |
| antoniolinux | 0:86b2086be101 | 15 | trig=1; // trigger high |
| antoniolinux | 0:86b2086be101 | 16 | wait_us(10); |
| antoniolinux | 0:86b2086be101 | 17 | trig=0; // trigger low |
| EmbeddedSam | 1:e01896ab28d7 | 18 | |
| EmbeddedSam | 1:e01896ab28d7 | 19 | timeout_timer.start(); |
| EmbeddedSam | 1:e01896ab28d7 | 20 | |
| EmbeddedSam | 1:e01896ab28d7 | 21 | while(!echo){ |
| EmbeddedSam | 1:e01896ab28d7 | 22 | //Wait for 5V/3.3V pulse to start |
| EmbeddedSam | 1:e01896ab28d7 | 23 | if(timeout_timer.read_ms()>=10){ //100 ms timeout |
| EmbeddedSam | 1:e01896ab28d7 | 24 | timedOut = true; |
| EmbeddedSam | 1:e01896ab28d7 | 25 | break; |
| EmbeddedSam | 1:e01896ab28d7 | 26 | } |
| EmbeddedSam | 1:e01896ab28d7 | 27 | } |
| EmbeddedSam | 1:e01896ab28d7 | 28 | |
| EmbeddedSam | 1:e01896ab28d7 | 29 | //Pulse Started |
| EmbeddedSam | 1:e01896ab28d7 | 30 | if(timedOut == true){ |
| EmbeddedSam | 1:e01896ab28d7 | 31 | //Error, pulse didn't start for some reason |
| EmbeddedSam | 1:e01896ab28d7 | 32 | timedOut = false; |
| EmbeddedSam | 1:e01896ab28d7 | 33 | return 999999; //error pulse not started in time |
| EmbeddedSam | 1:e01896ab28d7 | 34 | } |
| EmbeddedSam | 1:e01896ab28d7 | 35 | else |
| EmbeddedSam | 1:e01896ab28d7 | 36 | { |
| EmbeddedSam | 1:e01896ab28d7 | 37 | timeout_timer.reset(); |
| EmbeddedSam | 1:e01896ab28d7 | 38 | timer.start(); |
| EmbeddedSam | 1:e01896ab28d7 | 39 | timeout_timer.start(); |
| EmbeddedSam | 1:e01896ab28d7 | 40 | while(echo){ |
| EmbeddedSam | 1:e01896ab28d7 | 41 | if(timeout_timer.read_ms()>=10){ |
| EmbeddedSam | 1:e01896ab28d7 | 42 | timedOut = true; |
| EmbeddedSam | 1:e01896ab28d7 | 43 | break; |
| EmbeddedSam | 1:e01896ab28d7 | 44 | } |
| EmbeddedSam | 1:e01896ab28d7 | 45 | } |
| EmbeddedSam | 1:e01896ab28d7 | 46 | if(timedOut == true){ |
| EmbeddedSam | 1:e01896ab28d7 | 47 | timedOut = false; |
| EmbeddedSam | 1:e01896ab28d7 | 48 | return 999999; |
| EmbeddedSam | 1:e01896ab28d7 | 49 | } |
| EmbeddedSam | 1:e01896ab28d7 | 50 | else{ |
| EmbeddedSam | 1:e01896ab28d7 | 51 | timer.stop(); |
| EmbeddedSam | 1:e01896ab28d7 | 52 | return timer.read_us(); |
| EmbeddedSam | 1:e01896ab28d7 | 53 | } |
| EmbeddedSam | 1:e01896ab28d7 | 54 | } |
| EmbeddedSam | 1:e01896ab28d7 | 55 | |
| EmbeddedSam | 1:e01896ab28d7 | 56 | |
| EmbeddedSam | 1:e01896ab28d7 | 57 | |
| EmbeddedSam | 1:e01896ab28d7 | 58 | |
| antoniolinux | 0:86b2086be101 | 59 | |
| antoniolinux | 0:86b2086be101 | 60 | } |
| antoniolinux | 0:86b2086be101 | 61 | |
| antoniolinux | 0:86b2086be101 | 62 | //return distance in cm |
| antoniolinux | 0:86b2086be101 | 63 | long HCSR04::distance(){ |
| antoniolinux | 0:86b2086be101 | 64 | duration = echo_duration(); |
| antoniolinux | 0:86b2086be101 | 65 | distance_cm = (duration/2)/29.1 ; |
| antoniolinux | 0:86b2086be101 | 66 | return distance_cm; |
| antoniolinux | 0:86b2086be101 | 67 | |
| antoniolinux | 0:86b2086be101 | 68 | } |
