import utime
from machine import I2C, Pin, Timer
from pico_i2c_lcd import I2cLcd
trigger_pins = [Pin(2, Pin.OUT),
Pin(4, Pin.OUT),
Pin(6, Pin.OUT)]
echo_pins = [Pin(3, Pin.IN),
Pin(5, Pin.IN),
Pin(7, Pin.IN)]
threshold_distance = 100
i2c = I2C(0, sda=Pin(0), scl=Pin(1), freq=400000)
lcd = I2cLcd(i2c, 0x27, 2, 16)
detected_room = None
def get_distance(trigger, echo):
trigger.value(0)
utime.sleep_us(2)
trigger.value(1)
utime.sleep_us(10)
trigger.value(0)
while echo.value() == 0:
pulse_start = utime.ticks_us()
while echo.value() == 1:
pulse_end = utime.ticks_us()
pulse_duration = utime.ticks_diff(pulse_end, pulse_start)
distance = (pulse_duration * 0.0343) / 2
return distance
def update_lcd():
lcd.clear()
lcd.move_to(0, 0)
if detected_room:
lcd.putstr("Motion detected in")
lcd.move_to(0, 1)
lcd.putstr(detected_room)
def check_rooms(t):
global detected_room
distance_room1 = get_distance(trigger_pins[0], echo_pins[0])
if distance_room1 < threshold_distance:
detected_room = "Room 1"
update_lcd()
return
distance_room2 = get_distance(trigger_pins[1], echo_pins[1])
if distance_room2 < threshold_distance:
detected_room = "Room 2"
update_lcd()
return
distance_room3 = get_distance(trigger_pins[2], echo_pins[2])
if distance_room3 < threshold_distance:
detected_room = "Room 3"
update_lcd()
return
detected_room = None
update_lcd()
tim = Timer(mode=Timer.PERIODIC, freq=1, callback=check_rooms)