# Exercise 13(b)
from machine import Pin, time_pulse_us
from time import sleep_ms,sleep_us
from neopixel import NeoPixel
#Define the GPIO lines needed
echo_pin = Pin(18, Pin.IN)
trig_pin = Pin(19, Pin.OUT)
# Initialize 16-element NeoPixel Ring on GPIO pin 14
ring = NeoPixel(Pin(14), 16)
def all_white():
# set all elements to white
for i in range(16):
ring[i] = (255, 255, 255)
ring.write()
def some_green(number):
# set some elements to green
for i in range(number+1):
ring[i] = (0, 255, 0)
ring.write()
for i in range(number,16): # turn off all unwanted elements
ring[i] = (0, 0, 0)
ring.write()
def some_red(number):
# set some elements to green
for i in range(number+1):
ring[i] = (255, 0, 0)
ring.write()
for i in range(number,16): # turn off all unwanted elements
ring[i] = (0, 0, 0)
ring.write()
# Ensure the trigger line is zero to begin with
trig_pin.value(0)
sleep_us(10)
while True:
trig_pin.value(1) # signal to output pulses
sleep_us(10) # only need a short burst of pulses
trig_pin.value(0) # signal to stop pulses
# determine how long before an echo signal is received
pulse_duration = time_pulse_us(echo_pin, 1, 1000000) # Wait for a LOW pulse, 1s timeout
if pulse_duration > -1:
echo_duration = pulse_duration/2
# calculate the distance in cms
object_distance = 341 * (echo_duration/1000000)*100
print(f' The object is {object_distance:.1f} cms away')
# calculate how many elements need illuminating
element_number = int(object_distance/12.5)
if object_distance>200:
all_white()
elif object_distance>60 and object_distance<=200:
some_green(element_number)
elif object_distance<=60:
some_red(element_number)