#AFRINA RIDWANA BINTI AHMAD RIZAL
import machine
import uasyncio as asyncio
from lcd1602 import LCD
from hcsr04 import HCSR04
# Initialize hardware components
i2c = machine.I2C(1, scl=machine.Pin(7), sda=machine.Pin(6))
lcd = LCD(addr=0x27)
pot = machine.ADC(28)
ledR = machine.Pin(12, machine.Pin.OUT)
ledG = machine.Pin(13, machine.Pin.OUT)
PB = machine.Pin(16, machine.Pin.IN, machine.Pin.PULL_UP)
sensor = HCSR04(trigger_pin=2, echo_pin=3)
async def wait_for_button_press():
while PB.value():
await asyncio.sleep(0.1)
await asyncio.sleep(0.2)
while not PB.value():
await asyncio.sleep(0.1)
async def display_startup():
lcd.clear()
lcd.write(1, 0, "Pengesan Jarak")
await asyncio.sleep(2)
lcd.clear()
lcd.write(4, 0, "Tekan PB")
lcd.write(3, 1, "untuk MULA")
await wait_for_button_press()
async def led_blink():
while True:
ledR.toggle()
await asyncio.sleep(0.5)
async def get_distance_input(prompt):
last_pot_value = None
while True:
pot_value = int(10 + (pot.read_u16() >> 6) / 1023.0 * 90)
if pot_value != last_pot_value:
lcd.clear()
lcd.write(0, 0, prompt)
lcd.write(0, 1, f"Dist: {pot_value} cm")
last_pot_value = pot_value
await asyncio.sleep(0.5)
if not PB.value():
await wait_for_button_press()
return pot_value
async def scan_mode(min_dist, max_dist):
last_distance = None
while True:
distance = sensor.distance_cm()
if distance != last_distance:
lcd.clear()
lcd.write(0, 0, f"Distance: {distance} cm")
if min_dist <= distance <= max_dist:
lcd.write(0, 1, "Status: OK")
ledR.off()
ledG.off()
else:
lcd.write(0, 1, "OUT OF RANGE")
ledR.off()
ledG.on()
last_distance = distance
await asyncio.sleep(0.1)
if not PB.value():
await wait_for_button_press()
return
async def main():
await display_startup()
while True:
min_dist = await get_distance_input("Set Min Dist")
max_dist = await get_distance_input("Set Max Dist")
await scan_mode(min_dist, max_dist)
# Create event loop and tasks
loop = asyncio.get_event_loop()
loop.create_task(led_blink())
loop.create_task(main())
loop.run_forever()