因为家里墙上没有钟,现在智能手机普及大家似乎也很少需要单独的钟表来看时间。但是有时不能一抬头就看到时间还是很难受的事情。于是就开始动手制作这个基于树莓派的投影时钟。硬件其实很简单,5V电源,树莓派1个,激光投影一台。软件界面使用Qt5编写。
首先按组件清单准备好树莓派,把需要的存储卡系统什么的都弄好,然后把树莓派的IIC功能打开,串口打开,当然如果选择USB转TTL的话直接用USB也行。另外如果想通过DS18B20获取温度的话记得把w1也打开。设置方法已经烂大街了,官方最新镜像也支持GUI界面设置,这里就不展开了。
使用IIC目的是获取各种传感器数据显示,串口是控制投影用的,如果你购买的投影不支持串口控制也可以不需要。
首先是准备一个激光投影,当然一般的激光投影都非常贵,动辄4位数甚至6位数,但是我们做个钟不可能花这么大价钱……所以首先要考虑合理的价格,然后是合适的设备。这里我使用的是一款拆机的微投,供电电压是5V,和树莓派的一致,有一个微型HDMI接口,和树莓派zero的接口一致。开关机和梯形校正是用的串口控制的,也很方便。价格也不贵,300以内。分辨率是1920x720p的,用来做时钟完全足够了。但是这个投影的缺陷也比较多,比如因为没有EDID所以直接插电脑或树莓派的HDMI口是不会被系统识别到的,需要手动指定或者如果动手能力强的话自己找个EEPROM写个EDID挂上去。
接下来根据投影的分辨率调整树莓派的HDMI输出,因为树莓派不一定能很好的识别投影设备,所以最好手动固定一下HDMI输出。编辑/boot/config.txt文件,在里面把hdmi_group=
和hdmi_mode=
改成你投影支持的分辨率输出。具体的配置参数可以在这找到:https://www.raspberrypi.org/documentation/configuration/config-txt/video.md
当然如果你和我一样树莓派经常换地方用的话,可以通过规则来设置,比如在全局状态下的参数可以在config.txt里添加[all]
来设置,然后指定显示器设置指定参数。树莓派可以使用EDID参数来区分显示器设备的配置。首先获取到当前显示器的EDID信息,通过tvservice -n
得到屏幕的EDID信息,比如我的显示器信息是DWE-HDMI
然后在config.txt里添加
`[EDID=DWE-HDMI]
hdmi_group=2
hdmi_mode=14
framebuffer_width=1696
framebuffer_height=960`
通过设置这个显示器的输出模式和显示分辨率来达到最佳的显示效果。至于为什么是1696x960,因为这个参数感觉显示效果最好。
然后搭建好Qt的编译环境,可以直接使用apt进行安装,也可以使用源代码自行编译。
这里简单介绍一下仅编译项目需要的东西:
首先安装qmake和相关编译套件,使用apt-get install qt5-qmake gcc g++ qt5-default git
把qt的基础编译环境安装好,并安装好git,然后从我的仓库clone或直接软件代码到树莓派上。如果是下载的包则用解压工具把代码解压出来,直接clone的话cd到项目目录led_proj里,使用下面的命令完成编译:qmake && make
。
数据来源可以是传感器,也可以是其他的智能设备,比如小米米家温湿度传感器。数据可以使用nodejs创建一个socket连接,然后Qt程序在启动后会自动连上并从这个socket获取推送的数据。
用HDMI线连接树莓派和投影仪,把串口线也接上,接上5V电源,然后给投影发开机指令测试显示效果。
这个项目从2019年5月开始着手制作到现在,陆陆续续添加了很多功能,可能一时半会还写不完……
加上最近工作较忙,教程只能抽空写写,可能会漏掉很多细节,后续会慢慢补上。