mirror of
https://github.com/tinygo-org/drivers.git
synced 2026-08-13 11:23:40 +00:00
91 lines
1.8 KiB
Go
91 lines
1.8 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"
|
|
"tinygo.org/x/drivers/internal/legacy"
|
|
)
|
|
|
|
const TIMEOUT = 23324 // max sensing distance (4m)
|
|
|
|
// Device holds the pins
|
|
type Device struct {
|
|
trigger drivers.PinOutput
|
|
echo drivers.PinInput
|
|
configurePins func()
|
|
}
|
|
|
|
// New returns a new ultrasonic driver given 2 pins
|
|
func New(trigger legacy.PinOutput, echo legacy.PinInput) Device {
|
|
return Device{
|
|
trigger: trigger.Set,
|
|
echo: echo.Get,
|
|
configurePins: func() {
|
|
legacy.ConfigurePinOut(trigger)
|
|
legacy.ConfigurePinInput(echo)
|
|
},
|
|
}
|
|
}
|
|
|
|
// Configure configures the pins of the Device
|
|
func (d *Device) Configure() {
|
|
if d.configurePins == nil {
|
|
panic(legacy.ErrConfigBeforeInstantiated)
|
|
}
|
|
d.configurePins()
|
|
}
|
|
|
|
// 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(false)
|
|
time.Sleep(2 * time.Microsecond)
|
|
d.trigger(true)
|
|
time.Sleep(10 * time.Microsecond)
|
|
d.trigger(false)
|
|
i := uint8(0)
|
|
for {
|
|
if d.echo() {
|
|
t = time.Now()
|
|
break
|
|
}
|
|
i++
|
|
if i > 10 {
|
|
if time.Since(t).Microseconds() > TIMEOUT {
|
|
return 0
|
|
}
|
|
i = 0
|
|
}
|
|
}
|
|
i = 0
|
|
for {
|
|
if !d.echo() {
|
|
return int32(time.Since(t).Microseconds())
|
|
}
|
|
i++
|
|
if i > 10 {
|
|
if time.Since(t).Microseconds() > TIMEOUT {
|
|
return 0
|
|
}
|
|
i = 0
|
|
}
|
|
}
|
|
return 0
|
|
}
|