from machine import Pin, PWM
from neopixel import NeoPixel
from time import sleep_ms
import gc
# تنظیمات ال ای دی ها و بوق
# لیستی از شماره پینها برای متصل کردن ال ای دی ها
pixel_pins = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
# ایجاد لیستی از اشیاء نپوبیکسل برای هر پین با 16 ال ای دی در هر رشته
pixels_list = [NeoPixel(Pin(pin), 16) for pin in pixel_pins]
# شماره پین برای بوق
BUZZER_PIN = 13
# ایجاد شیء بی دبلیو ام برای بوق
buzzer = PWM(Pin(BUZZER_PIN))
# تعریف فرکانس نتها (هرتز) و رنگها برای نتهای مختلف
notes = {
'C4': 262, 'D4': 294, 'E4': 330, 'F4': 349, 'G4': 392, 'A4': 440, 'B4': 494,
'C5': 523, 'D5': 587, 'E5': 659, 'F5': 698, 'G5': 784, 'A5': 880, 'B5': 987,
'AS4': 466, 'GS4': 415
}
note_colors = {
'C4': (255, 0, 0), # قرمز
'D4': (0, 255, 0), # سبز
'E4': (0, 0, 255), # آبی
'F4': (255, 255, 0), # زرد
'G4': (255, 0, 255), # بنفش
'A4': (0, 255, 255), # فیروزهای
'B4': (255, 255, 255),# سفید
'C5': (128, 0, 0), # قهوهای
'D5': (0, 128, 0), # سبز تیره
'E5': (0, 0, 128), # آبی تیره
'F5': (128, 128, 0), # زرد تیره
'G5': (128, 0, 128), # بنفش تیره
'A5': (0, 128, 128), # فیروزهای تیره
'B5': (128, 128, 128),# خاکستری
'AS4': (255, 105, 180), # صورتی
'GS4': (128, 0, 128) # بنفش
}
# لیست نتها و مدت زمانهای مربوطه برای ملودی
melody = [
'C4', 'C4',
'D4', 'C4', 'F4',
'E4', 'C4', 'C4',
'D4', 'C4', 'G4',
'F4', 'C4', 'C4',
'C5', 'A4', 'F4',
'E4', 'D4', 'AS4', 'AS4',
'A4', 'F4', 'G4',
'F4'
]
durations = [
4, 8,
4, 4, 4,
2, 4, 8,
4, 4, 4,
2, 4, 8,
4, 4, 4,
4, 4, 4, 8,
4, 4, 4,
2
]
# تابع برای تنظیم رنگ بهینه برای تمامی پیکسلها
def apply_color(color):
"""
این تابع رنگ مشخص شده را به تمام ال ای دی ها های متصل به پینها اعمال میکند.
"""
for pixels in pixels_list:
for i in range(16):
pixels[i] = color # تنظیم رنگ برای هر ال ای دی
pixels.write() # بهروزرسانی ال ای دی ها
# تابع برای پخش ملودی و هماهنگ کردن افکتهای نوری
def play_melody():
"""
این تابع ملودی را پخش میکند و رنگهای مربوط به نتها را به ال ای دی ها اعمال میکند.
"""
for note, duration in zip(melody, durations):
# دریافت فرکانس نت و رنگ مربوطه
freq = notes.get(note, 0) # فرکانس نت
color = note_colors.get(note, (0, 0, 0)) # رنگ مربوط به نت
if freq:
buzzer.freq(freq) # تنظیم فرکانس بوق
buzzer.duty_u16(32768) # تنظیم حجم صدا به نصف
else:
buzzer.duty_u16(0) # خاموش کردن صدا
# اعمال رنگ به ال ای دی ها
apply_color(color)
# محاسبه مدت زمان نت و توقف بین نتها
note_duration = 1000 / duration # مدت زمان نت به میلیثانیه
sleep_ms(int(note_duration)) # توقف برای مدت زمان نت
buzzer.duty_u16(0) # خاموش کردن صدا بعد از پخش نت
sleep_ms(int(note_duration * 1.30)) # توقف بین نتها
# تابع اصلی برای اجرای کد
def main():
"""
این تابع حلقهای را اجرا میکند که به طور مداوم ملودی را پخش میکند و حافظه را مدیریت میکند.
"""
while True:
play_melody() # پخش ملودی
gc.collect() # جمعآوری زبالهها برای بهینهسازی حافظه
#print("Free memory:", gc.mem_free(), "bytes") # چاپ وضعیت حافظه آزاد
# اجرای تابع اصلی
main()