from machine import Pin, time_pulse_us, SoftI2C
from time import sleep_us, sleep
import ssd1306
# =========================
# OLED
# =========================
i2c = SoftI2C(scl=Pin(22), sda=Pin(21))
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
# =========================
# ULTRASONIC
# =========================
TRIG = Pin(26, Pin.OUT)
ECHO = Pin(25, Pin.IN)
# =========================
# LED (ACTIVE LOW)
# =========================
GREEN = Pin(18, Pin.OUT)
YELLOW = Pin(19, Pin.OUT)
RED = Pin(23, Pin.OUT)
# =========================
# RELAY
# =========================
RELAY = Pin(27, Pin.OUT)
# =========================
# TURN OFF ALL
# ACTIVE LOW
# =========================
GREEN.value(1)
YELLOW.value(1)
RED.value(1)
# =========================
# DISTANCE FUNCTION
# =========================
def get_distance():
TRIG.off()
sleep_us(2)
TRIG.on()
sleep_us(10)
TRIG.off()
duration = time_pulse_us(ECHO, 1, 30000)
if duration < 0:
return 0
distance = duration / 58
return distance
# =========================
# MAIN LOOP
# =========================
while True:
distance = get_distance()
# ==================================
# OFF ALL LED FIRST
# ==================================
GREEN.value(1)
YELLOW.value(1)
RED.value(1)
RELAY.value(0)
# ==================================
# CONDITION
# ==================================
if distance > 300:
status = "DANGER"
RED.value(0) # RED ON
RELAY.value(1)
elif distance >= 150 and distance <= 300:
status = "WARNING"
YELLOW.value(0) # YELLOW ON
else:
status = "SAFE"
GREEN.value(0) # GREEN ON
print("Distance:", distance)
print("Status:", status)
# ==================================
# OLED DISPLAY
# ==================================
oled.fill(0)
oled.text("FLOOD SYSTEM", 0, 0)
oled.text("Distance:", 0, 20)
oled.text(str(round(distance, 1)), 0, 32)
oled.text("cm", 40, 32)
oled.text("Status:", 0, 50)
oled.text(status, 60, 50)
oled.show()
sleep(1)