mirror of
https://github.com/tinygo-org/drivers.git
synced 2026-07-26 10:38:41 +00:00
38c606d813
Signed-off-by: deadprogram <ron@hybridgroup.com>
83 lines
1.6 KiB
Go
83 lines
1.6 KiB
Go
// Package hcsr04 provides a driver for the HC-SR04 ultrasonic distance sensor
|
|
//
|
|
// Datasheet:
|
|
// https://cdn.sparkfun.com/datasheets/Sensors/Proximity/HCSR04.pdf
|
|
package hcsr04
|
|
|
|
import (
|
|
"time"
|
|
|
|
"tinygo.org/x/drivers"
|
|
)
|
|
|
|
const TIMEOUT = 23324 // max sensing distance (4m)
|
|
|
|
// Device holds the pins
|
|
type Device struct {
|
|
trigger drivers.Pin
|
|
echo drivers.Pin
|
|
}
|
|
|
|
// New returns a new ultrasonic driver given 2 pins
|
|
func New(trigger, echo drivers.Pin) Device {
|
|
return Device{
|
|
trigger: trigger,
|
|
echo: echo,
|
|
}
|
|
}
|
|
|
|
// Configure expects that the pins of the Device have already
|
|
// been configured by the user. Trigger pin should be an output
|
|
// and echo pin should be an input.
|
|
func (d *Device) Configure() {
|
|
}
|
|
|
|
// ReadDistance returns the distance of the object in mm
|
|
func (d *Device) ReadDistance() int32 {
|
|
pulse := d.ReadPulse()
|
|
|
|
// sound speed is 343000 mm/s
|
|
// pulse is roundtrip measured in microseconds
|
|
// distance = velocity * time
|
|
// 2 * distance = 343000 * (pulse/1000000)
|
|
return (pulse * 1715) / 10000 //mm
|
|
}
|
|
|
|
// ReadPulse returns the time of the pulse (roundtrip) in microseconds
|
|
func (d *Device) ReadPulse() int32 {
|
|
t := time.Now()
|
|
d.trigger.Low()
|
|
time.Sleep(2 * time.Microsecond)
|
|
d.trigger.High()
|
|
time.Sleep(10 * time.Microsecond)
|
|
d.trigger.Low()
|
|
i := uint8(0)
|
|
for {
|
|
if d.echo.Get() {
|
|
t = time.Now()
|
|
break
|
|
}
|
|
i++
|
|
if i > 10 {
|
|
if time.Since(t).Microseconds() > TIMEOUT {
|
|
return 0
|
|
}
|
|
i = 0
|
|
}
|
|
}
|
|
i = 0
|
|
for {
|
|
if !d.echo.Get() {
|
|
return int32(time.Since(t).Microseconds())
|
|
}
|
|
i++
|
|
if i > 10 {
|
|
if time.Since(t).Microseconds() > TIMEOUT {
|
|
return 0
|
|
}
|
|
i = 0
|
|
}
|
|
}
|
|
return 0
|
|
}
|