Музыкальная шкатулка на Arduino: MP3-плеер, WS2812, датчик Холла
Музыкальная шкатулка на Arduino — красивый и функциональный проект: при открытии крышки играет случайная мелодия (MP3), загорается светодиодная лента WS2812, вращается фигурка (серво, опционально). Закрыл — всё останавливается. Режимы: случайное воспроизведение или пауза (продолжение с того же места). Датчик Холла + магнит вместо кнопки. MP3-плеер DFPlayer Mini. Точное время DS3231 (опционально). Идеально для детей: сказки, музыка, декор. Умный дом своими руками, подарок, декор комнаты.
Зачем нужна музыкальная шкатулка на Arduino
Обычная шкатулка играет одну мелодию. Наша — живая: открываешь — случайная мелодия, мигают WS2812, крутится фигурка. Закрываешь — пауза или стоп. Записывай сказки, музыку, приветствия. Режим паузы: ребёнок закрыл — потом продолжит с того же места. Датчик Холла + магнит — надёжно, без износа. DFPlayer Mini — MP3 с SD-карты. WS2812 — анимация, автояркость. Проект для детей, подарка, декора, Нового года. Дёшево, интересно, расширяемо.
Компоненты
- Arduino Nano/Uno
- DFPlayer Mini (MP3-плеер)
- Модуль WS2812 (5–20 светодиодов)
- Датчик Холла + магнит
- Динамики 8 Ом 0.5–3 Вт
- Сервопривод (опционально, для фигурки)
- Сундучок/шкатулка
- SD-карта (MP3-файлы)
- БП 5В 2А+
Подключение
- DFPlayer: RX → D10, TX → D11 (SoftwareSerial), VCC → 5В, GND → GND, SPK1/SPK2 → динамики
- WS2812: DIN → D6, VCC → 5В, GND → GND, резистор 330 Ом, конденсатор 1000 мкФ
- Холл: OUT → D2, VCC → 5В, GND → GND
- Серво (опционально): сигнал → D9, VCC → 5В, GND → GND
Скетч музыкальной шкатулки
#include <SoftwareSerial.h>
#include <DFRobotDFPlayerMini.h>
#include <FastLED.h>
#define LED_PIN 6
#define NUM_LEDS 20
CRGB leds[NUM_LEDS];
SoftwareSerial mySerial(10, 11);
DFRobotDFPlayerMini myDFPlayer;
int hallPin = 2;
bool isOpen = false;
unsigned long lastOpen = 0;
void setup() {
FastLED.addLeds<WS2812B, LED_PIN, GRB>(leds, NUM_LEDS);
pinMode(hallPin, INPUT);
mySerial.begin(9600);
myDFPlayer.begin(mySerial);
myDFPlayer.volume(20);
}
void loop() {
if (digitalRead(hallPin) == HIGH) { // открыта
if (!isOpen) {
isOpen = true;
myDFPlayer.randomAll(); // случайная мелодия
FastLED.setBrightness(255);
fill_rainbow(leds, NUM_LEDS, 0, 10);
FastLED.show();
}
lastOpen = millis();
} else { // закрыта
if (isOpen && millis() - lastOpen > 10000) { // 10 сек
isOpen = false;
myDFPlayer.pause();
FastLED.clear();
FastLED.show();
}
}
delay(100);
}
При открытии: воспроизводит случайную мелодию на DFPlayer и запускает светодиодную анимацию WS2812B с радугой.
При закрытии: если прошло >10 секунд с момента открытия, приостанавливает воспроизведение и выключает светодиоды.
Используется FastLED для управления RGB-лентой, SoftwareSerial для DFPlayer.
Режимы работы
1. Случайная мелодия: randomAll() при открытии. 2. Пауза: закрыл — пауза, открыл — продолжение. 3. Стоп: закрыл — стоп. 4. Анимация WS2812: rainbow, fill. 5. Серво: вращение фигурки при открытии.
Расширение
Сказки/рассказы. Голосовое управление. OpenHAB MQTT. Wi-Fi ESP8266. Автояркость. Разные мелодии по времени суток. Фигурка на серво. RGB-подсветка. Уведомления Telegram.
Заключение
Музыкальная шкатулка на Arduino — волшебный проект. MP3, WS2812, Холл, DFPlayer. Случайные мелодии, пауза, анимация. Дёшево, красиво, для детей и декора.
FAQ — Музыкальная шкатулка Arduino
Мелодия не играет?
DFPlayer RX → D10, TX → D11. SD-карта FAT32, MP3-файлы 0001.mp3–9999.mp3. myDFPlayer.begin(). Громкость 20.
WS2812 не светятся?
DIN → D6, резистор 330 Ом, конденсатор 1000 мкФ. FastLED.addLeds
Датчик Холла не срабатывает?
OUT → D2. Магнит близко. digitalRead(HIGH) — открыто. Подтяжка 10 кОм если нужно.
Пауза не работает?
millis() — lastOpen > 10000. lastOpen обновляется при открытии. myDFPlayer.pause().
Случайная мелодия?
myDFPlayer.randomAll(). MP3-файлы 0001.mp3–9999.mp3. Больше файлов — случайнее.
OpenHAB интеграция?
ESP8266 + MQTT. Топики /music. Items Switch/String. Управление мелодиями.
Серво для фигурки?
Сигнал → D9. Servo.attach(9). servo.write(90) при открытии.