from machine import Pin, time_pulse_us
import time
# Pins
trig = Pin(26, Pin.OUT)
echo = Pin(18, Pin.IN)
led_red = Pin(3, Pin.OUT)
led_yellow = Pin(5, Pin.OUT)
led_green = Pin(4, Pin.OUT) # Changed from GPIO6 to GPIO4
buzzer = Pin(27, Pin.OUT)
def get_distance():
trig.value(0)
time.sleep_us(2)
trig.value(1)
time.sleep_us(10)
trig.value(0)
try:
duration = time_pulse_us(echo, 1, 30000) # Timeout 30ms
distance = (duration / 2) / 29.1
except OSError:
distance = None
return distance
# Thresholds (in cm)
LOW_LEVEL = 20 # <=20 cm water level = HIGH water
MEDIUM_LEVEL = 40 # 21-40 cm = MEDIUM water
HIGH_LEVEL = 60 # >40 cm = LOW water
def indicate_level(distance):
# Turn off all outputs first
led_red.value(0)
led_yellow.value(0)
led_green.value(0)
buzzer.value(0)
if distance is None:
print("Error reading distance")
return
print("Distance: {:.2f} cm".format(distance))
if distance > HIGH_LEVEL:
print("Water Level: LOW")
led_red.value(1)
buzzer.value(1)
elif LOW_LEVEL < distance <= HIGH_LEVEL:
print("Water Level: MEDIUM")
led_yellow.value(1)
buzzer.value(0)
elif distance <= LOW_LEVEL:
print("Water Level: HIGH")
led_green.value(1)
buzzer.value(0)
else:
print("Water Level: Unknown")
while True:
dist = get_distance()
indicate_level(dist)
time.sleep(2)