from machine import Pin, I2C, PWM
import time
import ssd1306
TRIG_PIN = 5
ECHO_PIN = 18
BUTTON_PIN = 14
BUZZER_PIN = 27
BLUE_LED_PIN = 26
YELLOW_LED_PIN = 25
RED_LED_PIN = 33
ORANGE_LED_PIN = 32
NORMAL_LEVEL = 15
ALERT_LEVEL = 40
WARNING_LEVEL = 80
DANGER_LEVEL = 80
i2c = I2C(0, scl=Pin(15), sda=Pin(4), freq=400000)
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
trig = Pin(TRIG_PIN, Pin.OUT)
echo = Pin(ECHO_PIN, Pin.IN)
button = Pin(BUTTON_PIN, Pin.IN, Pin.PULL_UP)
buzzer = PWM(Pin(BUZZER_PIN), freq=1000, duty=0)
blue_led = Pin(BLUE_LED_PIN, Pin.OUT)
yellow_led = Pin(YELLOW_LED_PIN, Pin.OUT)
red_led = Pin(RED_LED_PIN, Pin.OUT)
orange_led = Pin(ORANGE_LED_PIN, Pin.OUT)
def get_distance():
trig.value(1)
time.sleep_us(10)
trig.value(0)
while echo.value() == 0:
pulse_start = time.ticks_us()
while echo.value() == 1:
pulse_end = time.ticks_us()
pulse_duration = pulse_end - pulse_start
distance = (pulse_duration * 0.0343) / 2
return distance
def reset_system():
global buzzer
buzzer.duty(0)
blue_led.value(1)
yellow_led.value(0)
orange_led.value(0)
red_led.value(0)
oled.fill(0)
oled.text("System Reset", 0, 0)
oled.show()
def main():
reset_system()
while True:
distance = get_distance()
if button.value() == 0:
reset_system()
time.sleep(0.5)
oled.fill(0)
oled.text("Height: {:.1f} cm".format(distance), 0, 0)
if distance <= NORMAL_LEVEL:
# Normal level
blue_led.value(1)
yellow_led.value(0)
orange_led.value(0)
red_led.value(0)
buzzer.duty(0)
oled.text("Status: NORMAL", 0, 10)
elif distance <= ALERT_LEVEL:
# Alert level
blue_led.value(0)
yellow_led.value(1)
orange_led.value(0)
red_led.value(0)
buzzer.duty(512)
oled.text("Status: ALERT", 0, 10)
time.sleep(0.5)
buzzer.duty(0)
elif distance <= WARNING_LEVEL:
# Warning level
blue_led.value(0)
yellow_led.value(0)
orange_led.value(1)
red_led.value(0)
for _ in range(3):
buzzer.duty(512)
time.sleep(0.2)
buzzer.duty(0)
time.sleep(0.2)
oled.text("Status: WARNING", 0, 10)
elif distance >= DANGER_LEVEL:
# Danger level
blue_led.value(0)
yellow_led.value(0)
orange_led.value(0)
red_led.value(1)
for _ in range(5):
buzzer.duty(512)
time.sleep(0.2)
buzzer.duty(0)
time.sleep(0.2)
oled.text("Status: DANGER", 0, 10)
oled.show()
time.sleep(0.1)
if __name__ == "__main__":
main()