越来越多的人似乎在没有 LMS 服务器的情况下使用它,仅用于 BT、AirPlay 或 Spotify。这很好,但请注意,squeezeliteESP32 主要是罗技媒体服务器播放器,并且是围绕该概念设计的。所有其他模式都是附加组件,因此其他模式也有其缺点。因此,请确保在打开问题之前阅读此内容
Squeezelite-esp32 是一款音频软件套件,可在 espressif 的 esp32 和 esp32-s3 wifi (b/g/n) 和蓝牙芯片组上运行。它提供以下功能
根据连接到 esp32 的硬件,您可以将音频发送到本地 DAC、SPDIF 或蓝牙扬声器。所需的最低硬件是具有 4MB 闪存和 4MB PSRAM 的 WROVER 模块 (https://www.espressif.com/en/products/modules/esp32)。独立使用该模块后,只需接通电源,您就可以传输到蓝牙扬声器。您还可以仅使用电缆或光学传感器将音频发送到大多数 I2S DAC 以及 SPDIF 接收器。
但是squeezelite-esp32是高度可扩展的,你可以添加
其他功能包括
要控制均衡器或使用 LMS 上的显示,需要新的播放器模型,这是通过作为 LMS 第三方存储库一部分的插件提供的
(这里提出的意见所以我=@philippe44) squeezelite-esp32的主要构建是一个16位内部核心,所有计算都以32位或浮点精度进行。这是我为了保持 CPU 性能(它已经极大地扩展了 esp32 芯片组)并优化内存使用而做出的设计选择,因为我们只有 4MB 的可用 RAM。有些人可能正确地评论说 WROVER 模块有 8MB RAM,但处理器只能寻址 4MB,其余 4MB 必须由较小的块进行分页,我对此没有耐心。
现在,当我将squeezelite 移植到esp32 时,我还使核心在编译时兼容16 或32 位。到目前为止,它可以在 32 位下运行,但进行的测试较少。您可以选择以32位模式编译它。我对 16 位以上的样本不是很感兴趣,因为它没有带来任何东西(我有信息论的工程背景)。
能力 | 16位 | 32位 | 评论 |
---|---|---|---|
最大采样率 | 192k | 96k | 192k 非常具有挑战性,尤其是与显示器结合使用时 |
最大位深度 | 16 | 24 | 16 位模式下 24 位被截断 |
斯普迪夫 | 16位 | 20位 | |
mp3、aac、opus、ogg/vorbis | 48k | 48k | |
阿拉克、弗拉克、奥格 | 96k | 96k | |
PCM、WAV、AIF | 192k | 96k | |
均衡器 | 是 | 氮 | 最大 48kHz(重采样后)- 在 >48k 轨道上跳过均衡 |
重采样 | 是 | 氮 | |
交叉淡入淡出 | 10秒 | <5秒 | 取决于缓冲区大小和采样率 |
esp32 必须以 240 MHz 运行,Quad-SPI I/O 为 80 MHz,时钟为 40 Mhz。尽管如此,它的运行量仍然很大,特别是知道它有串行闪存和 PSRAM,所以值得称赞 Espressif 的芯片组优化。现在,要实现所有解码、重采样、均衡、增益、显示、频谱/视觉效果,需要在内部/外部 RAM 的使用、任务优先级和缓冲区处理之间实现非常(非常)微妙的平衡。它并不完美,您将系统推向极限越多,某些文件无法播放的风险就越高(见下文)。一般来说,显示器始终具有最低优先级,您会注意到滚动和 VU/频谱刷新率减慢。现在,甚至显示线程也有一些关键部分并影响功能。例如,具有低 SPI 速度的 16 位深度彩色显示器可能会阻止 24/96 flac 工作,但仍可与 pcm 24/96 一起工作
在 16 位模式下,虽然报告的最大速率为 192 kHz,但强烈建议将报告的采样率限制为 96k (-Z 96000)。请注意,由于 TCP/IP 堆栈性能的原因,某些高速 24/96k 在线流可能会出现卡顿。这通常是由于服务器发送小数据包而 esp32 无法足够快地接收编码音频,无论任务优先级设置如何(我已经尝试稍微调整一下)。在这种情况下,最好的选择是让 LMS 代理流,因为它将提供更大的块和可以处理的“更平滑”的流。
另请注意,某些编解码器比其他编解码器消耗更多的 CPU,或者没有进行太多优化。我已尽力调整这些,但这种优化级别包括编写一些令人痛苦的程序集。当文件使用 SBR 编码时,AAC 是一种要求非常高的编解码器。它允许重建频谱的上部部分,从而提高采样率,但编解码器规范是可选的,您可以简单地解码较低频段并接受较低的采样率 - 请参阅下面的 AAC_DISABLE_SBR 选项。
重要提示:在 esp32(不是 esp32-s3)上,启用“统计”时,将 Spotify 与 SPDIF 结合使用会产生断断续续的音频。你必须禁用它们
任何具有至少 4MB 闪存和 4MB PSRAM 的基于 esp32 的硬件都能够运行queuelite-esp32,并且有各种包含此类芯片的主板。下面提到了一些,但任何一个都应该有效。您可以在这里找到各种帮助和说明
为了清楚起见,WROOM 模块无法工作,因为它们不包含 PSRAM。有些设计可能会在外部添加它,但这(非常)不可能。
根据上面的描述,WROVER 模块足以运行 Squeezelite-esp32,但这需要一些修补才能将其扩展为具有模拟音频或硬件按钮(例如)
请注意,当发送到蓝牙扬声器(源)时,只能使用 44.1 kHz,因此您可以让 LMS 进行重采样,但必须确保它仅发送 44.1 kHz 曲目或启用内部重采样(使用 -R)选项。如果您连接 DAC,采样率的选择将取决于其功能。请参阅下文了解更多详情。
大多数 DAC 只需通过 I2S 连接即可开箱即用,但有些需要使用 I2C 发送特定命令。请参阅下面的 DAC 选项以了解如何发送这些专用命令。内置对 TAS575x、TAS5780、TAS5713 和 AC101 DAC 的支持。
也支持像这样的基于 esp32-s3 的模块,但需要 esp-idf 4.4。它尚未成为正式版本的一部分,但它可以编译并运行。 s3没有蓝牙音频。请注意,CPU 性能大大增强。
这是 Squeezelite-esp32 的主要硬件伴侣,是一起开发的。有关功能的详细信息可以在此处和此处找到。
如果要重建,请使用squeezelite-esp32-SqueezeAmp-sdkconfig.defaults
配置文件。
注意:您可以使用预构建的二进制文件 SqueezeAMP4MBFlash,它已正确设置所有硬件 I/O。您还可以使用通用二进制 I2S4MBFlash,在这种情况下,应设置 NVS 参数以获得完全相同的行为
12=green,13=red,34=jack,2=spkfault
channel=7,scale=20.24
model=TAS57xx,bck=33,ws=25,do=32,sda=27,scl=26,mute=14:0
bck=33,ws=25,do=15
IR 可用作唤醒信号(设置sleep_config
为wake=0:0
)。它是一个上拉电阻,因此在未接收到任何数据时它会保持在 1,这意味着它不能与其他唤醒 IO 结合使用。有关多个输入唤醒限制的更多详细信息,请参阅睡眠。
这款便携式电池供电扬声器与squeezelite-esp32兼容,每次更新都会提供专用版本。如果要重建,请使用squeezelite-esp32-Muse-sdkconfig.defaults
配置文件。
注意:您可以使用预构建的二进制文件 Muse4MBFlash,它已正确设置所有硬件 I/O。您还可以使用通用二进制 I2S4MBFlash,在这种情况下,应设置 NVS 参数以获得完全相同的行为
muse
channel=5,scale=7.48,atten=3,cells=1
"mosi=15,miso=2,clk=14
(这一项可能是可选的)model=I2S,bck=5,ws=25,do=26,di=35,i2c=16,sda=18,scl=23,mck=0
{"init":[ {"reg":0,"val":128}, {"reg":0,"val":0}, {"reg":25,"val":4}, {"reg":1,"val":80}, {"reg":2,"val":0}, {"reg":8,"val":0}, {"reg":4,"val":192}, {"reg":0,"val":18}, {"reg":1,"val":0}, {"reg":23,"val":24}, {"reg":24,"val":2}, {"reg":38,"val":9}, {"reg":39,"val":144}, {"reg":42,"val":144}, {"reg":43,"val":128}, {"reg":45,"val":128}, {"reg":27,"val":0}, {"reg":26,"val":0}, {"reg":2,"val":240}, {"reg":2,"val":0}, {"reg":29,"val":28}, {"reg":4,"val":48}, {"reg":25,"val":0}, {"reg":46,"val":33}, {"reg":47,"val":33} ]}
[{"gpio":32, "pull":true, "debounce":10, "normal":{"pressed":"ACTRLS_VOLDOWN"}}, {"gpio":19, "pull":true, "debounce":40, "normal":{"pressed":"ACTRLS_VOLUP"}}, {"gpio":12, "pull":true, "debounce":40, "long_press":1000, "normal":{"pressed":"ACTRLS_TOGGLE"},"longpress":{"pressed":"ACTRLS_POWER"}}]
与包含音频编解码器和耳机输出的 ESP32-A1S 模块配合使用。如果您想直接连接扬声器,您仍然需要使用这样的演示板或外部放大器。请注意,有一个版本带有 AC101 编解码器,另一个版本带有 ES8388,可能有两种变体 - 这些板一团糟(见下文)
上图所示的板卡具有以下 IO 设置
(注意有些GPIO需要上拉)
所以一个可能的配置是
21=amp,22=green:0,39=jack:0
[{ "gpio" : 5 , "normal" :{ "pressed" : " ACTRLS_TOGGLE " }},{ "gpio" : 18 , "pull" : true , "shifter_gpio" : 5 , "normal" :{ "pressed" : " ACTRLS_VOLUP " }, "shifted" :{ "pressed" : " ACTRLS_NEXT " }}, { "gpio" : 23 , "pull" : true , "shifter_gpio" : 5 , "normal" :{ "pressed" : " ACTRLS_VOLDOWN " }, "shifted" :{ "pressed" : " ACTRLS_PREV " }}]
适用于AC101
model=AC101,bck=27,ws=26,do=25,di=35,sda=33,scl=32
对于ES8388 (似乎有具有相同版本号的变体 - 完全混乱)
model=ES8388,bck=5,ws=25,do=26,sda=18,scl=23,i2c=16
或model=ES8388,bck=27,ws=25,do=26,sda=33,scl=32,i2c=16
这是一款基于 ESP32 的有趣智能手表。它具有 240x240 ST7789 屏幕和板载音频。听任何东西都不是很有用,但它确实有效。这是一个设备示例,其 DAC/APU 需要 I2C 命令集(见下文)。如果您决定自己重建所有内容,则有一个构建选项,否则 I2S 默认选项适用于以下参数
model=I2S,bck=26,ws=25,do=33,i2c=53,sda=21,scl=22
{ "init" : [ { "reg" : 41 , "val" : 128 }, { "reg" : 18 , "val" : 255 } ], "poweron" : [ { "reg" : 18 , "val" : 64 , "mode" : " or " } ], "poweroff" : [ { "reg" : 18 , "val" : 191 , "mode" : " and " } ] }
dc=27,data=19,clk=18
SPI,driver=ST7789,width=240,height=240,cs=5,back=12,speed=16000000,HFlip,VFlip
Squeezelite-esp32 需要 esp32 芯片组和 4MB PSRAM。 ESP32-WROVER 满足这些要求。要获得音频输出,可以使用 I2S DAC。廉价的 PCM5102 I2S DAC 可以工作,但许多其他 DAC 也可以。 PCM5012 DAC 可以通过以下方式连接:
I2S-WROVER
VCC-3.3V
3.3V - 3.3V
接地 - 接地
FLT-接地
DMP-接地
SCL-接地
BCK - (BCK - 见下文)
DIN -(DO - 见下文)
LCK - (WS - 见下文) FMT - GND
XMT-3.3V
使用squeezelite-esp32-I2S-4MFlash-sdkconfig.defaults
配置文件。
还有超级酷的项目 https://github.com/rochuck/squeeze-amp-too
要访问 NVS,请在 WebUI 中转到制作人员名单并选择“显示 nvs 编辑器”。进入 NVS 编辑器选项卡以更改 NFS 参数。在下面的语法描述中,<>表示一个值,而[]描述可选参数。
如上所述,今天提供了一些专用构建:SqueezeAMP 和 Muse,但如果您自己构建,您也可以为 T-WATCH2020 创建构建。默认版本是名为 I2S 的通用固件,可以通过 NVS 进行配置,以产生与专用版本完全相同的结果。不同之处在于参数必须输入并且可能会被意外删除。 GUI 还为加载“已知配置集”提供了很大的帮助。
根据设计选择,不存在仅针对给定版本嵌入的代码,所有代码始终存在。其理念是尽可能减少特定于平台的代码,并且无论如何都禁止使用特定的#ifdef
。因此,如果您想添加自己的平台,请仔细查看mainKConfig.projbuild
看看如何使用下面的参数使您的设备纯粹是基于配置的解决方案。当确实没有其他选择时,请查看targets<target>
以添加您自己的代码。我不会接受那些可以尽可能避免创建此类专用代码的代码的 PR。 NVS“目标”将用于调用特定于目标的代码,但这又是纯粹的运行时,而不是编译时。
NVS 参数“i2c_config”设置用于通用目的(例如显示)的 i2c GPIO。将其留空以禁用 I2C 使用。请注意,在 SqueezeAMP 上,端口必须为 1。默认速度为 400000,但某些显示器可以达到 800000 或更高。语法是
sda=<gpio>,scl=<gpio>[,port=0|1][,speed=<speed>]
请注意,您不能使用与 DAC 相同的 GPIO 或端口。
esp32 有 4 个 SPI 子系统,其中一个无法访问,因此编号为 0..2,SPI0 保留给 Flash/PSRAM。 NVS 参数“spi_config”设置用于通用目的(例如显示)的 spi 的 gpio。将其留空以禁用 SPI 使用。显示器需要 DC 参数。语法是
data|mosi=<gpio>,clk=<gpio>[,dc=<gpio>][,host=1|2][,miso=<gpio>]
默认且只有“host”为 1,因为其他值已被 flash 和 spiram 使用。可选的“miso”(MasterInSlaveOut)参数仅在 SPI 总线为双向且与其他外设(如以太网、gpio 扩展器)共享时使用。请注意,“data”也可以命名为“mosi”(MasterOutSlaveIn)。
NVS 参数“dac_config”设置用于与 DAC 进行 i2s 通信的 gpio。您可以在编译时定义默认值,但 nvs 参数优先,命名配置除外
bck=<gpio>,ws=<gpio>,do=<gpio>[,mck=0|1|2][,mute=<gpio>[:0|1][,model=TAS57xx|TAS5713|AC101|WM8978|ES8388|I2S][,sda=<gpio>,scl=<gpio>[,i2c=<addr>]]
如果“model”未设置或无法识别,则使用默认的“I2S”。选项“mck”用于某些需要主时钟的编解码器(尽管它们不应该)。默认情况下,GPIO0 用作 MCLK,只有最近的版本(2023 年中后)可以使用 1 或 2。另请注意,这不能与 RMII 以太网共存(请参阅下面的以太网部分)。 I2C 参数是可选的,仅当您的 DAC 需要 I2C 控制时才需要(请参阅下面的“dac_controlset”)。请注意,“i2c”参数是十进制的,不允许使用十六进制表示法。
到目前为止,TAS57xx、TAS5713、AC101、WM8978 和 ES8388 是公认的模型,其中发送了正确的初始化序列/音量/电源控制。对于可能需要 I2C 命令的其他编解码器,请使用参数“dac_controlset”,该参数允许使用 JSON 语法通过 i2c 发送用于初始化、电源、扬声器和耳机打开和关闭的简单命令的定义:
{ <command>: [ <item1>, <item2>, ... <item3> ],
<command>: [ <item1>, <item2>, ... <item3> ],
... }
其中<command>
是 init、poweron、poweroff、speakeron、speakeroff、headseton、headsetoff 之一(即使对于单个项目,它也必须是一个数组)。 Item 是以下任意元素
{"reg":<register>,"val":<value>,"mode":<nothing>|"or"|"and"}
{"gpio":<gpio>,"level":0|1}
{"delay":<ms>}
这是标准的 JSON 表示法,因此如果您不熟悉它,Google 是您最好的朋友。请注意,“...”意味着您可以拥有任意数量的条目,它不是语法的一部分。每个部分都是可选的,但在“dac_config”参数中设置 i2c 并且在此处不设置任何内容是没有意义的。
reg
键允许在 i2c 总线上写入寄存器。参数mode
允许 to或带有值的寄存器或 to和it。如果您只想写入,请不要设置mode
。 val
参数可以是一个数组 [v1, v2,...],用于在单个 i2c 突发中写入一系列字节(在这种情况下,“mode”将被忽略)。请注意,所有值都必须是十进制。您可以使用这样的验证器来验证您的语法。 gpio
键只是将 gpio 设置为 DAC 操作的一部分,并且delay
允许元素之间暂停。
在空闲期后打开/关闭 DAC 电源时使用“电源”命令(请参阅squeezelite 的 -C 选项),并且在扬声器和耳机之间切换时发送“扬声器/耳机”命令(请参阅耳机插孔检测)。
注意:对于命名配置((SqueezeAMP、Muse ...除 I2S 之外的所有配置),所有这些都将被忽略。对于已知的编解码器,可以使用 dac_controlset 覆盖内置序列
请注意,您不能使用与 I2C 相同的 GPIO 或端口。
NVS 参数“spdif_config”设置 SPDIF 所需的 i2s GPIO。
SPDIF 是通过以非标准方式复用 i2s 接口来实现的,因此虽然只需要一个引脚(DO),但控制器必须完全初始化,因此位时钟(bck)和字时钟(ws)必须设置为好。由于 i2s 和 SPDIF 是互斥的,因此如果您的硬件允许,您可以重复使用相同的 IO。
您可以在编译时定义默认值,但 nvs 参数优先,命名配置除外(SqueezeAMP、Muse ...)
将其留空以禁用 SPDIF 使用,您也可以使用“make menuconfig”在编译时定义它们。语法是
bck=<gpio>,ws=<gpio>,do=<gpio>
注意:对于命名配置,这将被忽略
即使在 32 位模式下,最大位深度也是 24 位(这是 SPDIF 限制 - 感谢 @UrbanLienert 从 20 位更新到 24 位)。现在,您还可以使用专门的芯片来获得 SPDIF,该芯片提供像 DAC 一样的 I2S 接口,但可以输出 SPDIF(光纤和同轴电缆)。请参阅 DAC 章节。
如果您想要同轴电缆,您还可以使用穷人的技巧从 3.3V GPIO 生成信号。所做的只是将 3.3V 分压以生成 0.6V 峰峰值,然后去除 DC
100nF
GPIO ----210ohm-----------||---- coax S/PDIF signal out
|
110ohm
|
Ground -------------------------- coax signal ground
NVS 参数“display_config”设置可选显示器的参数。它可以是 I2C(参见此处了解共享总线)或 SPI(参见此处了解共享总线)语法为
I2C,width=<pixels>,height=<pixels>[address=<i2c_address>][,reset=<gpio>][,HFlip][,VFlip][driver=SSD1306|SSD1326[:1|4]|SSD1327|SH1106]
SPI,width=<pixels>,height=<pixels>,cs=<gpio>[,back=<gpio>][,reset=<gpio>][,speed=<speed>][,HFlip][,VFlip][driver=SSD1306|SSD1322|SSD1326[:1|4]|SSD1327|SH1106|SSD1675|ST7735|ST7789[:x=<offset>][:y=<offset>]|ILI9341[:16|18][,rotate]]
您可以通过播放器设置中的专用菜单调整音量计和频谱分析仪的显示方式以及艺术品的大小(不要忘记添加插件)。
NVS 参数“metadata_config”设置如何为 AirPlay 和蓝牙显示元数据。语法是
[format=<display_content>][,speed=<speed>][,pause=<pause>][,artwork[:0|1]]
%artist%
、 %album%
、 %title%
中的任何一个。使用该格式字符串,关键字将被其值替换以构建要显示的字符串。请注意,在播放曲目期间恰好为空的关键字后面的纯文本将被删除。例如,如果您设置了 format= %artist% - %title%
并且元数据中没有艺术家,则仅显示<title>
而不是- <title>
。您可以使用任何兼容 NEC 协议 (38KHz) 或 RC5 的红外接收器。唯一需要连接的引脚是Vcc、GND和输出,没有上拉,没有滤波电容,是直连。
IR 代码“按原样”发送到 LMS,因此只有 Boom、Classic 或 Touch 的 Logitech SB 遥控器才可以工作。我认为LMS的“server”目录中的文件Slim_Devices_Remote.ir可以修改以适应其他代码,但我没有尝试过。
在 AirPlay 和蓝牙模式下,仅支持这些本机遥控器,我没有添加进行您自己的映射的选项
请参阅下面的“设置 GPIO”来设置与红外接收器(选项“ir”)关联的 GPIO。
参数“set_GPIO”用于将GPIO分配给各种功能。
GPIO 可在启动时设置为 GND 或 Vcc。这对于从侧面连接器消耗小于 40mA 的电流的设备供电非常方便。请小心,因为不会对您要更改的 GPIO 进行冲突检查,因此可能会损坏您的电路板或在此处产生冲突。
<amp>
参数可用于分配一个 GPIO,在播放开始时该 GPIO 将被设置为活动电平(默认为 1)。当squeezelite空闲时它将被重置。空闲超时在squeezelite命令行上通过-C <timeout>
设置
<power>
参数可用于分配一个 GPIO,当播放器开机时,该 GPIO 将被设置为活动级别(默认 1),并在关机时重置(在 LMS 中,不适用于 AirPlay、Spotify 或 BT)。
如果您有支持插入的音频插孔(插入时使用 :0 或 :1 设置电平),您可以指定它连接到哪个 GPIO。使用参数 jack_mutes_amp 可以在插入耳机(例如)时使放大器静音。
您可以设置绿色和红色状态 LED 以及它们各自的活动状态(:0 或 :1),或者如果您使用可寻址 RGB LED,则可以设置特定的芯片组。
<ir>
参数设置与 IR 接收器关联的 GPIO。无需添加上拉或电容
语法是:
<gpio>=Vcc|GND|amp[:1|0]|power[:1:0]|ir[:nec|rc5]|jack[:0|1]|green[:0|1|ws2812]|red[:0|1|ws2812]|spkfault[:0|1][,<repeated sequence for next GPIO>]
您可以在编译时定义 jack、spkfault LED 的默认值,但 nvs 参数优先,但命名配置((SqueezeAMP、Muse ...)除外,这些配置在运行时强制执行。请注意,gpio 36 和 39 仅供输入,不能使用当设置为插孔或扬声器故障时,100ms 轮询检查它们的值,但这很昂贵。
可以使用 I2C 或 SPI 总线添加 GPIO 扩展器。它们主要用于按钮,但也可以支持通用输出。这些额外的 GPIO 可以从任意值开始编号(40 及以上,因为 esp32 具有 GPIO 0..39)。然后,这些新的“虚拟”GPIO(例如)100 到 115 可用于按钮配置、set_GPIO 或其他配置设置。
每个扩展器最多可支持 32 个 GPIO。要使用按钮扩展器,必须提供中断,轮询模式不可接受。仍然可以配置不中断的扩展器,但只有输出可用。请注意,只要扩展器使用漏极开路或集电极开路(它们可能都这样做),就可以在扩展器之间共享相同的中断
参数“gpio_exp_config”是一个分号 (;) 分隔的列表,每个扩展器的语法如下
model=<model>,addr=<addr>,[,port=system|dac][,base=<n>][,count=<n>][,intr=<gpio>][,cs=<gpio>][,speed=<Hz>]
请注意,扩展 GPIO 不支持 PWM(下面的“led_brightness”),并且它们不能用于高速或精确定时信号,如 CS、D/C、Reset 和 Ready。支持按钮、旋转编码器、放大器控制和电源。根据实际芯片组的不同,可能支持上拉或下拉,因此您可能需要添加外部电阻(仅 MCP23x17 具有上拉功能)。 pca8575 不是一个很棒的芯片,它在用于 GPIO 输出时会产生相当多的虚假中断。使用 SPI 扩展器时,必须使用共享 SPI 总线配置总线
请参阅 set_GPIO 了解如何设置绿色和红色 LED(包括可寻址 RGB LED)。此外,它们的亮度可以使用“led_brigthness”参数进行控制。语法是
[green=0..100][,red=0..100]
注意:对于命名配置,无法更改受绿色和红色 LED 影响的 GPIO,但适用亮度选项
一根 LED 灯条可配置多达 255 个可寻址 LED,以提供增强的可视化效果。 VU 表可视化器包括一个电池状态指示器(请参阅电池)。目前仅支持 WS2812B LED。设置LED灯条硬件配置,或者NVS led_vu_config语法为
type=[WS2812],length=<n>,gpio=<dataPin>[,scale=<gain>]
其中<n>
是灯带中 LED 的数量 (1..255)。可以添加<scale>
增益值(百分比)来增强效果响应。
需要最新的 LMS 插件更新才能在播放器或可控显示器的 ESP32 设置页面中设置可视化模式和亮度(请参阅 Extra/SqueezeESP32 菜单)。该插件添加了额外的 LMS CLI 命令。
命令 | 笔记 |
---|---|
<playerid> led_visual [<模式>] [<亮度>] | 切换或选择可视化工具“模式”。 可视化器亮度(0..255)可以使用“亮度”标签进行控制。 |
<玩家ID> dmx <R,G,B,R,G,B,... R,G,B> [<偏移>] | 设置从“offset”位置开始的 LED 颜色 具有“R”(红色)、“G”(绿色)和“B”(蓝色)颜色序列。 将额外的 RGB 值添加到分隔字符串以设置多个 LED。 |
支持1个通用旋转编码器,带压力正交移位。此类编码器通常有 2 个用于编码器的引脚(A 和 B)、必须设置为接地的公共 C 和一个用于压机的可选 SW 引脚。 A、B 和 SW 必须上拉,因此 ESP32 提供自动上拉,但您可以添加自己的电阻。 A 和 B 上的一点滤波 (~470nF) 有助于去抖,这不是由软件实现的。
编码器通常被硬编码为分别向左、向右旋钮并在 LMS 上按下按钮,以及在 BT、AirPlay 和 Spotify 上进行音量调低/调高/播放切换。使用“音量”选项可以使其始终硬编码为音量调低/调高/播放切换(即使在 LMS 中)。选项“长按”允许在长按 SW 时使用替代模式。在该模式下,左为上一个,右为下一个,按下即可切换。每次长按 SW 都会在模式之间交替(主模式的实际行为取决于“音量”)。
还可以使用“knobonly”选项(不包括“音量”和“长按”)。此模式尝试提供单个旋钮完整导航,但由于 LMS UI 的原理,这有点扭曲。左、右和按遵循 LMS 的导航规则,特别是按始终转到较低的子菜单项,即使在音乐库中导航时也是如此。这会带来挑战,因为没有“播放”、“返回”或“暂停”按钮。解决方法如下:
双击(或左右)的速度可以使用可选参数“knobonly”进行设置。这不是一个完美的解决方案,欢迎其他想法。请注意,双击速度设置的时间越长,界面的响应速度就越慢。原因是我需要等待延迟才能决定是单击还是双击。它还可以使菜单导航的“犹豫”很容易被解释为“暂停”
使用具有以下语法的参数rotary_config:
A=<gpio>,B=<gpio>[,SW=gpio>[[,knobonly[=<ms>]]|[[,volume][,longpress]]]]
HW 注意:所有用于旋转的 GPIO 都有内部上拉,因此通常不需要向编码器提供 Vcc。不过,如果您使用的编码器板也有自己的上拉电阻,并且比 ESP32 的上拉电阻更强(很可能是这种情况),那么 GPIO 之间就会出现串扰,因此您必须带上 Vcc。看看你的电路板原理图,你就会明白,当任何其他引脚接地时,这些电路板上拉会创建一个“获胜”下拉。
SW gpio 是可选的,如果您愿意,您可以将其重新影响为纯按钮,但音量、长按和旋钮选项意义不大,因为缺少的开关在这些模式中起着重要作用。您仍然可以使用“音量”模式,但您将无法将其用于任何除了音量调高和调低之外的用途。因此请注意,上面语法 [] 的使用有点误导。
另请参阅“按钮”部分中的“重要提示”,并记住,当激活“lms_ctrls_raw”(见下文)时,这些旋钮、音量、长按选项均不适用,原始按钮代码(而不是操作)只会发送到 LMS
请注意,在 esp32 上,gpio 36 和 39 仅作为输入,不能使用中断,因此它们不能设置为 A 或 B。当将它们用于 SW 时,使用 100ms 轮询,这是昂贵的
支持一个专用的音量旋转编码器,通过按下进行正交移位。编码器被硬编码为 LMS、BT、AirPlay 和 Spotify 的音量增大、减小和播放切换(有关过滤和硬件注释以及 esp32 上的 GPIO 36 和 39,请参阅上面的注释)
使用参数volume_rotary,语法如下:
A=<gpio>,B=<gpio>[,SW=gpio>]
按钮使用 JSON 字符串进行描述,语法如下
[
{ "gpio" : <num>,
"type" : " BUTTON_LOW | BUTTON_HIGH " ,
"pull" :[ true|false ],
"long_press" : <ms>,
"debounce" : <ms>,
"shifter_gpio" : <-1|num>,
"normal" : { "pressed" : " <action> " , "released" : " <action> " },
"longpress" : { <same> },
"shifted" : { <same> },
"longshifted" : { <same> },
},
{ ... },
{ ... },
]
其中(除GPIO外所有参数都是可选的)
其中<action>
是要加载的另一种配置的名称(重新映射),或一种
ACTRLS_NONE, ACTRLS_POWER, ACTRLS_VOLUP, ACTRLS_VOLDOWN, ACTRLS_TOGGLE, ACTRLS_PLAY,
ACTRLS_PAUSE, ACTRLS_STOP, ACTRLS_REW, ACTRLS_FWD, ACTRLS_PREV, ACTRLS_NEXT,
BCTRLS_UP, BCTRLS_DOWN, BCTRLS_LEFT, BCTRLS_RIGHT,
BCTRLS_PS1, BCTRLS_PS2, BCTRLS_PS3, BCTRLS_PS4, BCTRLS_PS5, BCTRLS_PS6, BCTRLS_PS7, BCTRLS_PS8, BCTRLS_PS9, BCTRLS_PS10,
KNOB_LEFT, KNOB_RIGHT, KNOB_PUSH,
ACTRLS_SLEEP,
请注意,Actrls_sleep不是可以发送到LMS的实际按钮,而是激活深度睡眠模式的钩子(请参阅睡眠)。
您创建了这样的字符串,使用它填充新的NVS参数,其中任何名称以下16(?)字符。您可以尽可能多地拥有这样的配置。然后用默认配置的名称设置配置参数“ actrls_config”
例如,一个名为“按钮”的配置:
[{ "gpio" : 4 , "type" : " BUTTON_LOW " , "pull" : true , "long_press" : 1000 , "normal" :{ "pressed" : " ACTRLS_VOLDOWN " }, "longpress" :{ "pressed" : " buttons_remap " }},
{ "gpio" : 5 , "type" : " BUTTON_LOW " , "pull" : true , "shifter_gpio" : 4 , "normal" :{ "pressed" : " ACTRLS_VOLUP " }, "shifted" :{ "pressed" : " ACTRLS_TOGGLE " }}]
定义两个按钮
而配置命名为“ buttons_remap”
[{ "gpio" : 4 , "type" : " BUTTON_LOW " , "pull" : true , "long_press" : 1000 , "normal" :{ "pressed" : " BCTRLS_DOWN " }, "longpress" :{ "pressed" : " buttons " }},
{ "gpio" : 5 , "type" : " BUTTON_LOW " , "pull" : true , "shifter_gpio" : 4 , "normal" :{ "pressed" : " BCTRLS_UP " }}]
定义两个按钮
以下是您的解码乐趣的困难但功能性的2按钮界面:
actrls_config
:
buttons
buttons
:
[{ "gpio" : 4 , "type" : " BUTTON_LOW " , "pull" : true , "long_press" : 1000 ,
"normal" :{ "pressed" : " ACTRLS_VOLDOWN " },
"longpress" :{ "pressed" : " buttons_remap " }},
{ "gpio" : 5 , "type" : " BUTTON_LOW " , "pull" : true , "long_press" : 1000 , "shifter_gpio" : 4 ,
"normal" :{ "pressed" : " ACTRLS_VOLUP " },
"shifted" :{ "pressed" : " ACTRLS_TOGGLE " },
"longpress" :{ "pressed" : " ACTRLS_NEXT " }}
]
buttons_remap
:
[{ "gpio" : 4 , "type" : " BUTTON_LOW " , "pull" : true , "long_press" : 1000 ,
"normal" :{ "pressed" : " BCTRLS_DOWN " },
"longpress" :{ "pressed" : " buttons " }},
{ "gpio" : 5 , "type" : " BUTTON_LOW " , "pull" : true , "long_press" : 1000 , "shifter_gpio" : 4 ,
"normal" :{ "pressed" : " BCTRLS_UP " },
"shifted" :{ "pressed" : " BCTRLS_PUSH " },
"longpress" :{ "pressed" : " ACTRLS_PLAY " },
"longshifted" :{ "pressed" : " BCTRLS_LEFT " }}
]
重要说明:LMS还支持发送“原始”按钮代码的可能性。有点复杂,所以请忍受我。按钮可以通过SqueeSeSp32处理,并映射到“函数”之类的播放/暂停,也可以将其作为纯(RAW)代码和Press/Release/Release/Longpress的完整逻辑发送到LMS,由LMS处理,您不喜欢t对此有任何控制权。
“原始”模式的好处是,您可以构建一个与动臂尽可能近的播放器(例如),但是当您拥有一个时,您不能使用重新映射函数,longpress或shift locics进行自己的映射有限的按钮集。在“原始”模式下,您真正需要定义的只是GPIO和按钮之间的映射。就LMS而言,这些JSON有效载荷中的任何其他选择都无关紧要。现在,当您使用BT或AirPlay时,上述完整的JSON结构将完全适用,因此Shift,Longpress,重新映射选项仍然可行。
请注意,使用非“ RAW”模式时,使用LMS的CLI(命令行接口),并且必须在没有密码的情况下可用
没有好选择,这是您的选择。使用NVS参数“ LMS_CTRLS_RAW”来更改该选项
请注意,GPIO 36和39仅输入,不能使用中断。将它们用于按钮时,启动了100ms的轮询,这很昂贵。长新闻也可能不太好
ESP32的有线以太网都有各种选项的支持,但是SqueeSeSp32仅支持具有这样的RMII界面的微芯片LAN8720,或像Tavicom DM9051这样的RMII接口或Spi-Ethernet Bridges或这样的W5500。
注意:当前不支持Lyrat v4.3(例如Lyrat v4.3),可以在某些板上找到触摸按钮。
通用输入输出接口 | RMII信号 | 笔记 |
---|---|---|
GPIO21 | tx_en | emac_tx_en |
GPIO19 | TX0 | emac_txd0 |
GPIO22 | TX1 | emac_txd1 |
GPIO25 | RX0 | emac_rxd0 |
GPIO26 | 接收1 | emac_rxd1 |
GPIO27 | CRS_DV | emac_rx_drv |
GPIO0 | ref_clk | 50MHz时钟 |
model=lan8720,mdc=<gpio>,mdio=<gpio>[,rst=<gpio>]
连接LAN8720的重置PIN是可选的,但建议避免GPIO0(50MHz输入时钟)将ESP32锁定在启动时下载模式。
音频编解码器需要ESP32的APLL,因此我们需要一个提供一个LAN8720