如何关闭树莓派 5 上的 HDMI 显示器?这并不像你想象的那么简单。 如何关闭树莓派 5 上的 HDMI 显示器?这并不像你想象的那么简单。

如何关闭树莓派 5 上的 HDMI 显示器?这并不像你想象的那么简单。

树莓派让我们一起唱AC/DC的歌吧……

尝试了电视服务
尝试了 cec-client
尝试了 dtparam
尝试了 vcenvcmd
我跟你们说,伙计们,这比看起来要难得多。

大约六年前,我制作了一个家庭数码相框。它由一台树莓派3连接到电脑显示器组成,里面存储了数千张家庭照片,以及一些励志图片和语录。操作非常简单:

  • 每小时生成 120 张图片。这些图片是将随机顺序挑选的照片放置在抽象背景上(通过 ImageMagick)以及预先创建的励志图片、语录和其他全屏照片组合而成。
  • 将此列表提供给 fbi(帧缓冲接口),并指示其每显示一个项目,间隔 30 秒。每小时整点时,终止 fbi 进程,然后使用新列表重新启动。
  • 午夜时分,关掉显示屏(因为我们都在睡觉),然后早上6点再打开。

令人惊讶的是,这台配备同一张内存卡的树莓派3竟然连续工作了这么多年。虽然偶尔会出现一些小故障,需要重启电源,但考虑到它每小时都要进行大量的计算和I/O操作来生成所有这些图像,年复一年地如此,它的稳定性已经相当出色了。

版本 2.0

最近,我一直想扩展一下这个系统。去年我做了一个假期倒计时,每小时都会显示几张目的地照片,并附上“倒计时___天”的字样(ImageMagick 真的是太棒了)。我考虑过加入体育赛事比分/排名、天气预报、股市行情等等。

然而,之前的系统完全是用 Perl 编写的,现在已经开始显得过时了。我想重写它,使其更加模块化,并打算下次使用 Python。树莓派 3 是 32 位系统,仅支持 Raspbian(基于 Debian 的重新设计版)Jessie。要使用支持 Python 3 的最新操作系统,我需要升级系统。

于是我买了一台树莓派 5(4GB)……好戏才刚刚开始。图像生成和显示功能都运行良好,但晚上关掉显示器却成了一场冒险。

电视服务,我们想念你

我当时使用 tvservice 命令来开关显示器(更准确地说,是开关 HDMI 输出)。显示器关闭后,检测到没有输入信号,就进入了节能模式。

然而,Bookworm 中已不再存在此命令。经过一番搜索,我找到了 cec-client,但很快发现它并非我想要的。

接下来是 vcgencmd。它的手册页上写着:

 display_power 0|1|-1
       display_power 0|1|-1 display
              Show current display power state, or set the  display  power  state.   vc‐
              gencmd  display_power  0  will turn off power to the current display.  vc‐
              gencmd display_power 1 will turn on power to the display. If no  parameter
              is  set, this will display the current power state. The final parameter is
              an optional display ID, as returned by tvservice -l or from the table  be‐
              low, which allows a specific display to be turned on or off.

完美!除了:

 # vcgencmd commands
commands="commands, set_logging, bootloader_config, bootloader_version, cache_flush, codec_enabled, get_mem, get_rsts, measure_clock, measure_temp, measure_volts, get_hvs_asserts, get_config, get_throttled, pmicrd, pmicwr, read_ring_osc, version, readmr, otp_dump, pmic_read_adc, power_monitor"
# vcgencmd display_power 0
vc_gencmd_read_response returned -1
error=1 error_msg="Command not registered"

好吧,看来这条路走不通了。还有其他办法吗?

哦,还有 dtparam:

# dtparam -h hdmi
hdmi Set to "off" to disable the HDMI interface
(default "on")

Except:

# dtparam hdmi=off
* Unknown parameter 'hdmi'

好的,我们已经确定 R Pi 项目需要加强一些质量保证。

解决方案

在这个项目中,我完全没有使用 X Window 系统。我只是启动了自动登录到控制台并运行了 FBI。实际上,解决方案是自动登录到 X Window 桌面。你仍然可以运行 FBI(它会覆盖 X Window 的任何操作)。

然后,当需要关闭显示器时,先终止 FBI 进程,等待几秒钟,直到返回到 X 点(在脚本中,我使用 sleep 10)。然后:

 xrandr --display :0 --output HDMI-1 --off

我不认为有办法通过“向下按 X”来直接关闭 HDMI 端口。

我认为在 2.0 版本中,我会放弃 fbi,改用像feh这样的工具,完全在 X 中制作幻灯片。

所以,未来的谷歌用户们,当你们试图弄清楚如何在树莓派上关闭HDMI显示器时,这篇文章就是为你们准备的。至少在OS 13更新之前是这样。