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")