本项目实现了一个可以实时监控电脑状态的硬件设备。它拥有一块4.3寸的LCD彩色显示屏,可以实时监视CPU、内存、硬盘、显卡的实时状态,方便掌握电脑主要硬件的负载。既适合游戏玩家了解系统的瓶颈所在,也适合用来观察是否有非法的后台程序在长期占用电脑的资源(比如挖矿类木马程序)。
同时,本项目也适合作为机箱美化的副屏使用。本项目使用的是上位机配合串口通讯的解决方案,仅需一根TYPE-C连接线就能工作,对比市场上现有的HDMI接口的小型显示屏+AID64之类的系统监控软件的解决方案,本项目拥有成本低廉,系统资源占用小,方便灵活的优点。市场上的HDMI方案虽然通用性强,但是作为副屏时一方面会浪费一个HDMI接口加一个用于供电的USB接口,另一方面还会加大显卡的压力,浪费系统性能。
最后,因为整个系统的性能冗余比较充足,所以在开发者手中,本项目也可以作为一款开源的嵌入式GUI开发平台来使用。
本项目硬件部分100%使用立创EDA进行设计。
因为本项目软件、硬件完全开源,可以随意浏览、下载本项目资源,或在此基础上进行二次开发。但是禁止商用
本项目为首次公开,为本人原创项目。项目未曾在别的比赛中获奖。
本项目完全开源,包括PC端的上位机代码和MCU端的代码。使用GPL3.0协议分发。禁止商用。
首先是面子问题。出于实用性,我们需要尽量在一个屏幕上显示更多的内容,所有我们不能使用过于小型的屏幕。但是屏幕太大也不好,太大的屏幕一方面会增加DIY的难度,提高整个系统的制作成本(屏幕的费用,PCB打样的费用,控制系统的费用等等),另一方面,也会造成桌面空间的浪费,做为机箱副屏使用时也会降低对机箱的兼容性。经过综合考虑,我选择了通用的4.3寸分辨率为480x272的LCD显示屏,面板材质为TN,硬件接口为RGB:
此类显示屏是事实上的商业显示屏标准,在市场上很容易买到,价格也十分低廉。甚至可以从各种报废的设备中拆解得到(如各种媒体播放器设备)。
480x272的分辨率虽然不高,但是在本系统中已经够用。4.3寸的大小,使得驱动板打样的费用非常便宜,同时在保证显示足够内容的基础上不会显得太大或者太小。
由于此类显示屏使用的是恒流背光系统,所以我们需要一个恒流的背光驱动电路。在此,我选择了PT4103这款LED恒流驱动IC。PT4103是一款升压型的LED恒流驱动IC,拥有开路保护的功能,同时支持PWM调光,而且在3.3V的系统中即可正常工作,可以完全满足本项目的需求。
关于驱动电流的选择,我并没有按照屏幕数据表上的设定使其工作在20mA,而是设定为10mA,这可以保护背光,同时减小整个系统的功耗。经过测试,10mA和20mA的背光亮度区别并不大。但是如果你在自己制作时使用了IPS屏幕,则应该使用标准的20mA驱动电流。
由于屏幕使用的是RGB接口,而且对于嵌入式系统而言,这个屏幕的分辨率已经不低了。所以为了驱动这块儿屏幕的同时保证整个UI系统的流畅性,我们需要一款性能较高的MCU。由于本项目立项时,全世界的范围内正处于“缺芯”状态,各种型号的MCU不是没货就是价格大涨。经过综合的权衡后,这里选择了STM32F746ZG这款MCU作为整个控制系统的核心。此MCU带有LTDC控制器,可以非常方便的驱动RGB接口的显示屏。同时该MCU还带有DMA2D加速器,可以对UI系统的绘制提供加速,保证界面的流畅性。另外,由于该MCU相对比较冷门,所以价格还算可以接受。
由于F746ZG的定位是经济型MCU,所以内部的SRAM无法满足屏幕的显存需求,所以这里还添加了一颗型号为W9825G6KH的SDRAM作为系统显存使用。实际制作时,任何容量在8M以上,速度在108MHz以上的SDRAM都可以满足需求。
本项目使用MCU的内置Flash即可满足所以代码+资源文件的存储,但是为了后期的功能扩展,额外预留了NOR Flash的扩展电路。如果不需要进行高级功能的开发,此部分可以省略:
为了与上位机通讯,我们需要一款USB<->UART桥接芯片,在这里,使用经典的CH340E接口芯片即可,便宜稳定性能好。电路中额外设计了一颗RGB灯,可以用来指示通讯状态
相关电路(为了防止意外的短路或者过载情况,还设计了有一颗自恢复保险丝)
整个系统的功耗并不大,所以使用经典的LDO:AMS1117即可满足需求:
本系统设计了4个轻触按键用来提供对整个系统的控制,四个按键均为通用,功能由所在的UI界面决定:
RTC晶振和后备电池的设计,保证了电脑在关机的情况下,本设备也可以作为一款桌面时钟使用:
在早期的设想中,考虑到了高温和高系统占用率下的蜂鸣器报警功能,实际使用中发现,此功能过于鸡肋(且烦人),所以在最终代码中去掉了该功能。但是考虑到未来可能的功能开发,所以相关电路在硬件设计上依然保留:
为了节省成本,本项目为双层PCB设计,如果你在实际制作时有更多的预算,推荐使用4层板,并且对SDRAM部分走线进行等长处理。
顶层(背面)
底层(正面)
3D模拟图
各部分说明
本项目使用ST官方推出的免费IDE:STM32CubeIDE配合STM32 HAL库来开发。开发语言为C语言。编译器为IDE自带的GCC编译器。
相较于Keil,CubeIDE的代码编辑器更为友好,与STM32的配合也更加流畅。
因为本项目牵扯到了与上位机的通讯,所以为了方便开发,使用了开源的FreeRTOS系统框架。系统中设计了UI主线程、通讯线程、按键扫描线程和蜂鸣器控制线程(已废弃,仅为兼容性保留)共四个线程协同完成功能,线程具体信息如下
UI系统作为下位机开发终点,使用的是开源的LVGL库来实现:
LVGL是一个强大的嵌入式UI框架,可以在内存不超过1M的嵌入式系统中提供可以媲美手机等高性能移动设备的UI显示体验。
在本项目中,UI系统的结构如下:
其中待机界面为系统上电,但未与PC上位机连接时显示的界面,此时显示内容为时钟。因为大部分的PC主板都可以设计为关机时继续为USB提供电力,所以此功能使得关机后,本设备依然可以作为一个时钟来使用。第一次上电并建立通讯后,会自动从待机界面跳转至概览界面。但是在任何其他界面断开连接进入待机界面后,再次恢复连接时,会自动回到断开连接之前显示的界面。
此界面的壁纸可以在代码中替换。
在与上位机成功建立通讯后,系统会自动跳转至概览界面,在此界面下,可以用图标的形式同时查看CPU、内存、硬盘和GPU的主要状态,如CPU/内存占用率,硬盘的活动时间比例等。除了待机界面外的所有界面顶端都有一个状态栏。状态栏除了显示对应四个按钮在当前界面下的功能外,还提供了系统时间显示功能(这在运行全屏程序比如游戏时是很有用的)。
在此界面下,可以选择对应的图表进入详情查看界面,显示关于此硬件更多,更加详细的数据。此处显示了CPU的名称,300秒内的使用率,速度和温度:
在概览界面下,也可以进入设置界面,设置屏幕的亮度:
PC端上位机部分是整个系统的开发最大的难点,因为需要获取硬件的状态并传输至设备端,而读取硬件的信息已经属于比较底层的部分了,操作系统的库中并未显式提供各项操作的API。我并没有类似的开发经验,所以刚开始的时候一筹莫展。在尝试了驱动法、WMI查询法之后,偶然发现了开源的OpenHardwareMonitor项目,这个项目提供了一套方便的,可以访问底层硬件驱动信息的API框架,并且提供了一个示例WinForm程序,这使得开发的难度大幅度下降。
最终,本项目上位机部分使用C#开发,使用OpenHardwareMonitor项目作为底层驱动框架。因为上位机不需要太多的功能,所以在UI框架的选择上放弃了WPF而是使用了经典WinForm框架以最大成都减小系统消耗,加快启动速度,并防止出现监控软件自己占用了太多系统资源的情况。
开发环境使用的是经典的Visual Studio 2019社区版,开发Win上的程序没有比这个更合适的了。
上位机的界面很简单,通过选择设备所在的串口,点击开始服务/停止服务即可。这个界面可以完全隐藏到系统后台中,仅在系统栏中展示。
由任务管理器可以看到,最终的软件运行消耗是非常小的:
需要注意的是,因为需要访问底层驱动,所以PC端服务的运行需要管理员权限。
FreeRTOS - Market leading RTOS (Real Time Operating System) for embedded systems with Internet of Things extensions
LVGL - Light and Versatile Embedded Graphics Library
Open Hardware Monitor (github.com)
!注意:请使用浏览器自带下载,迅雷等下载软件可能无法下载到有效资源。
欢迎加入EEWorld参考设计群,也许能碰到搞同一个设计的小伙伴,群聊设计经验和难点。 入群方式:微信搜索“helloeeworld”或者扫描二维码,备注:参考设计,即可被拉入群。 另外,如您在下载此设计遇到问题,也可以微信添加“helloeeworld”及时沟通。
EEWorld Datasheet 技术支持