from machine import Pin, PWM
import neopixel
import time
# --- НАЛАШТУВАННЯ ПЕРИФЕРІЇ (Чітко за вашим diagram.json) ---
NUM_LEDS = 16 # Кількість світлодіодів у кільці
LED_PIN = 22 # GPIO для світлодіодного кільця (провід white)
BUZZER_PIN = 14 # GPIO для зуммера (провід green)
# Ініціалізація адресного кільця
ring = neopixel.NeoPixel(Pin(LED_PIN), NUM_LEDS)
# Безпечна ініціалізація зуммера для Wokwi (стартуємо без звуку)
buzzer = PWM(Pin(BUZZER_PIN), freq=440, duty_u16=0)
# --- ТАБЛИЦЯ СИНЕСТЕЗІЇ (Нота -> Частота в Гц та унікальний колір RGB) ---
NOTE_DATA = {
"C5": {"freq": 523, "color": (255, 0, 0)}, # До -> Червоний
"B4": {"freq": 494, "color": (255, 127, 0)}, # Сі -> Помаранчевий
"A4": {"freq": 440, "color": (255, 255, 0)}, # Ля -> Жовтий
"G5": {"freq": 784, "color": (0, 255, 0)}, # Соль -> Зелений
"F#5": {"freq": 740, "color": (0, 255, 255)}, # Фа# -> Блакитний
"E5": {"freq": 659, "color": (0, 0, 255)}, # Мі -> Синій
"D5": {"freq": 587, "color": (139, 0, 255)}, # Ре -> Фіолетовий
"PAUSE": {"freq": 0, "color": (0, 0, 0)} # Пауза -> Вимкнено
}
# Масив мелодії (назва ноти, тривалість у секундах)
MELODY = [
("E5", 0.3), ("G5", 0.3), ("F#5", 0.2), ("D5", 0.3),
("E5", 0.3), ("B4", 0.3), ("A4", 0.6), ("PAUSE", 0.1),
("G5", 0.3), ("F#5", 0.2), ("D5", 0.3),
("C5", 0.3), ("B4", 0.6), ("PAUSE", 0.5)
]
print("Проєкт 'Колір за нотою' для нового шаблону ESP32 запущено...")
while True:
for note_name, duration in MELODY:
# Переводимо тривалість у мілісекунди
current_duration = int(duration * 1000)
# Отримуємо частоту та колір для поточної ноти
data = NOTE_DATA[note_name]
freq = data["freq"]
color = data["color"]
if freq == 0:
# Якщо пауза — повністю гасимо звук і кільце
buzzer.deinit()
ring.fill((0, 0, 0))
ring.write()
else:
# Переініціалізуємо ШИМ під частоту поточної ноти
buzzer = PWM(Pin(BUZZER_PIN), freq=freq, duty_u16=32768) # 50% гучності
# ЗалиInternal заливаємо все кільце кольором, що відповідає ноті
ring.fill(color)
ring.write()
# Тривалість звучання ноти
time.sleep_ms(current_duration)
# Робимо мікропаузу деініціалізації між нотами, щоб вони звуком не зливалися
buzzer.deinit()
time.sleep_ms(25)