Найти тему

DFPlayer mini: ваш друг по части звука

DFPlayer mini хорошо работает и сам по себе
DFPlayer mini хорошо работает и сам по себе

Хотел было поворчать по поводу очередных новостей из мира интернета вещей - опять в каком-то городе изобразили готовность к автоматизации сбора данных с датчиков. При этом эффект от внедрения настолько размыт, что сразу говорят, что "все станет понятно только после накопления статистических данных".

Но это уже было, а я наконец помирил под управлением ESP32 сразу три UART устройства: GPS, GPRS и MP3.

Кто-то скажет, что нафига mp3 если ESP 32 и так умеет гнать звук из 25-ой ноги (к слову говоря, esp8266 тоже так умеет). Это делается за счет DAC - преобразования цифрового сигнала в аналоговый. Но умеет-то умеет, но у меня звук получился гадкий, не разберёшь слов.

Поскольку на отладку времени нет, то воткнул старый добрый DFplayer mini.

Кстати, TX/RX можно цеплять на любые ноги, когда подключаешь UART, это вообще не принципиально. На esp8266 тоже - определяешь их через SoftwareSerial и в путь.

Ну так вот. DFplayer. На мой взгляд - лучший девайс за свои деньги. Кто не знает:

1. Им можно управлять как от имени ESP, так и с помощью кнопочек, причем кнопки цепляются непосредственно к DFplayer. Это реально самостоятельный плеер, который даже свой эквалайзер имеет в виде пресетов.

2. Его почти невозможно сжечь: сколько раз я путал и подавал то питание, то землю не туда... Нагревается, как чайник, но не умирает.

3. У него есть как стереовыход на усилок или наушники, так и моно выход на динамик. Написано, что динамик надо 8Ом и не более 3Вт. Не знаю, у меня 30 Ом динамик из телефона (стационарного) прижился

4. Он ест 5 вольт, размер чуть больше microSD

5. Стоит копейки - на али можно найти дешевле ста рублей, особенно если брать пачку

При этом я встречал отзывы, что есть "настоящие", рублей за 200 и они реально лучше звучат. Скажу честно - не пробовал, хотя внимательное изучение фото "настоящего" не выявило отличий.

Приятно в плейере то, что все ноги, которые идут на логическое управление, питание и аудио выход - с одной стороны, а все, что связано с управлением вручную (кнопки) - с другой стороны платки.

DFPlayer распиновка
DFPlayer распиновка

Понятное дело, что никто не мешает замыкать его контакты чем угодно, хоть датчиком, хоть контактной группой. Таким образом вы легко получите без программирования оригинальный колокольчик себе на дверь с той музыкой, с какой захотите (или не музыкой.. кому как).

Он вообще идеально впишется и в автомобиль, и как сирена, и как голосовое оповещение для залов и автобусов.

Я пробовал программировать его в лоб, через Python, для M5StickC

Вот мой код:

from m5stack import *
from m5ui import *
from uiflow import *
import utime
from machine import UART, Timer
setScreenColor(0x111111)
IDLE = 0
PAUSED = 1
PLAYING = 2
sound = 1
class Player:
def __init__(self, pin_TX, pin_RX):
self.uart = UART(1, 9600, tx=pin_TX, rx=pin_RX)
self.cmd(0x3F) # send initialization parametres
self._fadeout_timer = Timer(-1)
self._volume = 15
self._max_volume = 15
self._fadeout_speed = 0
def cmd(self, command, parameter=0x00):
query = bytes([0x7e, 0xFF, 0x06, command, 0x00, 0x00, parameter, 0xEF])
self.uart.write(query)
def _fade_out_process(self, timer):
new_volume = self._volume - self._fadeout_speed
if new_volume <= 0:
print("fadeout finished")
new_volume = 0
self._fadeout_timer.deinit()
self.stop()
new_volume = self._max_volume
self.volume(new_volume)
def play(self, track_id=False):
if not track_id:
self.resume()
elif track_id == 'next':
self.cmd(0x01)
elif track_id == 'prev':
self.cmd(0x02)
elif isinstance(track_id, int):
self.cmd(0x03, track_id)
def pause(self):
self.cmd(0x0E)
def resume(self):
self.cmd(0x0D)
def stop(self):
self.cmd(0x16)
def fadeout(self, fadeout_ms=1000):
fadeout_ms = int(sorted([500, fadeout_ms, 3000])[1])
fade_out_step_ms = 100
self._fadeout_speed = self._volume * \
fade_out_step_ms / fadeout_ms # ten steps per second
self._fadeout_timer.init(
period=fade_out_step_ms, callback=self._fade_out_process)
def loop_track(self, track_id):
self.cmd(0x08, track_id)
def loop(self):
self.cmd(0x19)
def loop_disable(self):
self.cmd(0x19, 0x01)
def volume_up(self):
self._volume += 1
self.cmd(0x04)
def volume_down(self):
self._volume -= 1
self.cmd(0x05)
def volume(self, volume=False):
if volume:
self._volume = int(sorted([0, volume, self._max_volume])[1])
print("volume", self._volume)
self.cmd(0x06, self._volume)
return self._volume
# hardware
def module_sleep(self):
self.cmd(0x0A)
def module_wake(self):
self.cmd(0x0B)
def module_reset(self):
self.cmd(0x0C)
def buttonA_wasPressed():
music = Player(pin_TX=26, pin_RX=36)
music.volume(30)
music.play(38)
wait(1.4)
pass
btnA.wasPressed(buttonA_wasPressed)

Под Arduino IDE существует сразу несколько библиотек работы с ним: основные это DFRbotDFPlayerMini и DFPlayerMini_fast. С ними идут понятные примеры, откроете - увидите, здесь приводить не буду.Р

В ESPEASY он есть только в прошивке с суффиксом test, и понимает команды play с номером трека, stop, vol с уровнем громкости и eq с номером пресета эквалайзера. Вполне достаточно, чтобы устроить романтический вечер с музыкой и камином )