from machine import*
from time import*
import machine, time
__version__ = '0.2.0'
__author__ = 'Roberto Sánchez'
__license__ = "Apache License 2.0. https://www.apache.org/licenses/LICENSE-2.0"
class HCSR04:
"""
Driver to use the untrasonic sensor HC-SR04.
The sensor range is between 2cm and 4m.
The timeouts received listening to echo pin are converted to OSError('Out of range')
"""
# echo_timeout_us is based in chip range limit (400cm)
def __init__(self, trigger_pin, echo_pin, echo_timeout_us=500*2*30):
"""
trigger_pin: Output pin to send pulses
echo_pin: Readonly pin to measure the distance. The pin should be protected with 1k resistor
echo_timeout_us: Timeout in microseconds to listen to echo pin.
By default is based in sensor limit range (4m)
"""
self.echo_timeout_us = echo_timeout_us
# Init trigger pin (out)
self.trigger = Pin(trigger_pin, mode=Pin.OUT, pull=None)
self.trigger.value(0)
# Init echo pin (in)
self.echo = Pin(echo_pin, mode=Pin.IN, pull=None)
def _send_pulse_and_wait(self):
"""
Send the pulse to trigger and listen on echo pin.
We use the method `machine.time_pulse_us()` to get the microseconds until the echo is received.
"""
self.trigger.value(0) # Stabilize the sensor
time.sleep_us(5)
self.trigger.value(1)
# Send a 10us pulse.
time.sleep_us(10)
self.trigger.value(0)
try:
pulse_time = machine.time_pulse_us(self.echo, 1, self.echo_timeout_us)
return pulse_time
except OSError as ex:
if ex.args[0] == 110: # 110 = ETIMEDOUT
raise OSError('Out of range')
raise ex
def distance_mm(self):
"""
Get the distance in milimeters without floating point operations.
"""
pulse_time = self._send_pulse_and_wait()
# To calculate the distance we get the pulse_time and divide it by 2
# (the pulse walk the distance twice) and by 29.1 becasue
# the sound speed on air (343.2 m/s), that It's equivalent to
# 0.34320 mm/us that is 1mm each 2.91us
# pulse_time // 2 // 2.91 -> pulse_time // 5.82 -> pulse_time * 100 // 582
mm = pulse_time * 100 // 582
return mm
def distance_cm(self):
"""
Get the distance in centimeters with floating point operations.
It returns a float
"""
pulse_time = self._send_pulse_and_wait()
# To calculate the distance we get the pulse_time and divide it by 2
# (the pulse walk the distance twice) and by 29.1 becasue
# the sound speed on air (343.2 m/s), that It's equivalent to
# 0.034320 cm/us that is 1cm each 29.1us
cms = (pulse_time / 2) / 29.1
return cms
hcs=HCSR04( trigger_pin=17 , echo_pin=5 , echo_timeout_us=500*30*2)
hcs1=HCSR04( trigger_pin=12 , echo_pin=14 , echo_timeout_us=500*30*2)
ledr_p=Pin(25,Pin.OUT)
ledv_p=Pin(27,Pin.OUT)
ledr_t=Pin(19,Pin.OUT)
ledb_t=Pin(21,Pin.OUT)
ledr_v=Pin(15,Pin.OUT)
ledv_v=Pin(0,Pin.OUT)
ledj_v=Pin(2,Pin.OUT)
s=PWM(Pin(18,mode=Pin.OUT))
s.freq(50)
while True:
d_train = hcs.distance_cm()
print(d_train)
d_pieton = hcs1.distance_cm()
print(d_pieton)
if d_train<=100:
ledr_v.on()
ledr_p.on()
ledv_p.off()
s.duty(75)
for i in range(5):
ledb_t.on()
ledr_t.off()
sleep(0.2)
ledb_t.off()
ledr_t.on()
sleep(0.2)
else:
s.duty(27)
ledr_t.off()
ledr_v.off()
if d_pieton<=10:
ledv_p.on()
ledr_p.off()
ledr_v.on()
else:
ledv_p.off()
ledr_p.on()
ledr_v.off()
for z in range(3):
ledv_v.on()
ledr_v.off()
sleep(1)
ledv_v.off()
for x in range(3):
ledj_v.on()
sleep(0.2)
ledj_v.off()
sleep(0.2)
ledr_v.on()
sleep(1)