from machine import Pin, I2C
from time import sleep, ticks_ms
import math
import framebuf

# پیکربندی سنسور اولتراسونیک
TRIG = Pin(3, Pin.OUT)
ECHO = Pin(2, Pin.IN)

# پیکربندی OLED
i2c = I2C(0, scl=Pin(5), sda=Pin(4))
oled_width = 128
oled_height = 64
buffer = bytearray(oled_height * oled_width // 8)
fb = framebuf.FrameBuffer(buffer, oled_width, oled_height, framebuf.MONO_VLSB)

# تابع نمایش روی OLED
def display_text(text):
    fb.fill(0)
    fb.text(text, 0, 0)
    i2c.writeto(0x3c, b'\x00' + bytes([0xAE]))  # خاموش کردن نمایشگر
    for i in range(0, len(buffer), 16):
        i2c.writeto(0x3c, b'\x40' + buffer[i:i+16])
    i2c.writeto(0x3c, b'\x00' + bytes([0xAF]))  # روشن کردن نمایشگر

# تابع خواندن فاصله
def read_distance():
    TRIG.low()
    sleep(0.002)
    TRIG.high()
    sleep(0.00001)
    TRIG.low()

    while ECHO.value() == 0:
        pulse_start = ticks_ms()
    while ECHO.value() == 1:
        pulse_end = ticks_ms()

    duration = pulse_end - pulse_start
    distance = duration * 0.343 / 2  # سرعت صوت ~343m/s
    return distance

# اندازه‌گیری میرایی
print("شروع اندازه‌گیری میرایی...")
display_text("Measuring...")

amplitudes = []
start_time = ticks_ms()

while True:
    dist = read_distance()
    amplitudes.append(dist)
    print("Distance:", dist)

    # بررسی اینکه آیا نوسان به پایان رسیده
    if len(amplitudes) > 10:
        recent = amplitudes[-10:]
        max_diff = max(recent) - min(recent)
        if max_diff < 1.0:  # کمتر از 1 سانتی‌متر نوسان = توقف
            break

    sleep(0.1)

end_time = ticks_ms()
duration_sec = (end_time - start_time) / 1000

print("نوسان متوقف شد.")
print("مدت زمان میرایی:", duration_sec, "ثانیه")
display_text("Damped in:\n" + str(duration_sec) + " sec")
BOOTSELLED1239USBRaspberryPiPico©2020RP2-8020/21P64M15.00TTT