立创Core Insight:基于STC32与ST7789屏的电脑硬件监控副屏DIY全解析
立创Core Insight:基于STC32与ST7789屏的电脑硬件监控副屏DIY全解析
最近看到不少朋友想给自己的电脑桌面加一个酷炫的硬件监控副屏,能实时显示CPU温度、内存占用,还能看网速。市面上的成品要么太贵,要么功能不灵活。今天我就来分享一个自己动手做的方案——立创Core Insight。这个项目用STC32单片机、一块ST7789液晶屏,再加上一个Python写的上位机,就能打造一个完全属于你自己的个性化副屏。我会从硬件选型、电路连接、软件驱动到系统集成,一步步带你走完整个DIY过程,就算你是嵌入式新手,跟着做也能搞定。
1. 项目整体思路:为什么这么设计?
在动手之前,咱们先理清这个项目的核心思路。一个电脑监控副屏,本质上就是让一块小屏幕能实时显示电脑内部的各种状态数据。要实现它,需要解决三个关键问题:数据从哪里来?、图像怎么画?、数据怎么送到屏幕上?
数据源的选择:很多类似项目会用AIDA64这个软件来获取硬件数据,但它不是免费的。我们这个项目选择了HWInfo,它功能强大,并且对个人用户有免费版本。虽然免费版连续使用12小时后需要手动重启一下数据共享功能,但对于日常使用来说完全够用了。
图像渲染的位置:传统做法是在单片机(比如STC32)里生成要显示的图像。但单片机内存小、算力有限,想显示好看的字体和背景图就比较吃力。我们这个项目换了个思路:在电脑上用Python来画图。Python有强大的PIL(Pillow)图像库,画图、加字体、做特效都非常方便。画好一整张图后,再把图像数据通过串口发给单片机,单片机只管“刷屏”显示。这样,屏幕显示效果的上限就大大提高了。
通信链路:电脑和单片机之间通过USB连接,我们把STC32的USB配置成CDC虚拟串口。这样在电脑上,这个副屏就被识别为一个普通的串口设备,Python程序可以很方便地向它发送数据。
简单来说,数据流是这样的:HWInfo软件读取电脑硬件状态 → Python上位机程序获取这些数据并绘制成图像 → 图像数据通过USB虚拟串口发送给STC32单片机 → 单片机驱动ST7789屏幕将图像显示出来。
2. 硬件准备与电路连接
这个项目的硬件部分非常简洁,核心就三样:主控单片机、屏幕和连接它们的电路。
2.1 核心元器件介绍
主控芯片:STC32G12K128
- 为什么选它?STC32是国产的增强型51单片机,内核性能比传统的STC89/STC12强不少,最关键的是它内置了USB控制器。我们可以直接把它配置成一个USB CDC设备(虚拟串口),省去了额外CH340这类USB转串口芯片,让电路更简单,通信也更稳定。
- 它的任务:接收来自电脑的图像数据,并通过SPI接口控制屏幕显示。
显示屏:ST7789驱动的IPS液晶屏
- 这是一块1.3寸或1.54寸的屏幕,分辨率通常是240x240或240x135。ST7789是一个很常用的屏幕驱动芯片,协议简单,资料多。
- 注意:我们选择不带触摸功能的版本,只用来显示,价格更便宜,驱动也更简单。
其他材料:
- PCB:你可以根据提供的开源电路图自己打板。
- 外壳:项目提供了3D打印模型文件,可以自己打印或找商家代打。
- 螺丝:用于固定屏幕和外壳,规格是M1.2*6。
- 一些基本的电阻、电容、MOS管,用于电源管理和屏幕背光调节。
2.2 电路设计要点
整个电路的核心连接就是单片机如何驱动屏幕。因为STC32没有硬件SPI外设(或者为了引脚分配更灵活),我们采用了软件模拟SPI的方式来驱动ST7789。
- SPI引脚连接:你需要将STC32的任意几个GPIO引脚,分别连接到屏幕的
SCL(时钟)、SDA(数据)、RES(复位)、DC(数据/命令选择)和CS(片选)引脚。在代码里用软件控制这些GPIO的高低电平变化来模拟SPI时序。 - 背光控制:屏幕的背光(
BLK引脚)通常通过一个MOS管来控制。STC32的一个GPIO引脚连接到MOS管的栅极,通过输出PWM(脉冲宽度调制)信号,就能无级调节屏幕的亮度。这样你就能根据环境光设置一个舒适的亮度了。 - USB接口:STC32的USB
D+和D-引脚直接连接到Type-C接口的对应引脚,用于供电和通信。
注意:电路原理图和PCB布局文件可以在项目的GitHub仓库找到。对于初学者,我建议直接使用作者设计好的PCB文件去打板,能避免很多硬件连接上的坑。
3. 下位机编程:让STC32“听懂”指令
下位机指的是跑在STC32单片机里的程序。它的工作很简单,但必须可靠:建立USB通信和驱动屏幕显示。
3.1 工程搭建与USB-CDC配置
首先,你需要安装STC32的开发环境(比如Keil C51),并创建一个新工程。
最关键的一步是配置USB。STC官方提供了USB的库函数。我们需要将其初始化为CDC(Communication Device Class)模式。这个模式会让电脑把单片机识别为一个虚拟串口(比如COM3、COM4)。
// 示例代码片段:USB初始化 void USB_Init(void) { USBCLK = 0x00; // 设置USB时钟源 USBCON = 0x90; // 使能USB功能 // ... 其他CDC相关的端点配置 IE2 |= 0x80; // 使能USB中断 EA = 1; // 开启全局中断 }配置成功后,给单片机插上USB线,电脑应该会自动安装驱动(或提示发现新设备),并在设备管理器的“端口”里看到一个新的串行设备。记下它的端口号,后面上位机会用到。
3.2 驱动ST7789屏幕(软件SPI)
接下来是驱动屏幕。我们使用GPIO模拟SPI,好处是引脚可以任意分配,非常灵活。
// 定义模拟SPI所用的GPIO引脚 sbit LCD_SCL = P1^0; // 时钟线 sbit LCD_SDA = P1^1; // 数据线 sbit LCD_RES = P1^2; // 复位 sbit LCD_DC = P1^3; // 数据/命令选择 sbit LCD_CS = P1^4; // 片选 // 向屏幕发送一个字节(8位数据) void LCD_WriteByte(unsigned char dat) { unsigned char i; LCD_CS = 0; // 选中屏幕 for(i=0; i<8; i++) { LCD_SCL = 0; // 时钟拉低 LCD_SDA = (dat & 0x80)?1:0; // 取出最高位发送 dat <<= 1; // 数据左移一位 LCD_SCL = 1; // 时钟拉高,屏幕在此时采样数据 } LCD_CS = 1; // 取消选中 } // 发送命令 void LCD_WriteCmd(unsigned char cmd) { LCD_DC = 0; // DC引脚拉低,表示接下来发送的是命令 LCD_WriteByte(cmd); } // 发送数据 void LCD_WriteData(unsigned char dat) { LCD_DC = 1; // DC引脚拉高,表示接下来发送的是数据 LCD_WriteByte(dat); }初始化屏幕时,需要按照ST7789芯片的数据手册,发送一系列初始化命令序列,来设置屏幕的扫描方式、颜色格式、亮起背光等。
3.3 核心任务:接收数据并刷屏
单片机的主循环逻辑非常清晰:
- 不断检查USB串口是否有数据到来。
- 一旦收到数据(这数据就是上位机发来的一整帧图像),就按照约定好的格式(比如先发命令告诉单片机开始刷图,然后发送实际的RGB像素数据),将数据写入屏幕的显存。
- ST7789芯片会自动将显存中的内容显示到屏幕上。
void main() { System_Init(); // 初始化系统时钟、GPIO等 USB_Init(); // 初始化USB-CDC LCD_Init(); // 初始化屏幕 PWM_Init(); // 初始化PWM用于背光调节 while(1) { if(USB_RxFlag) { // 如果收到USB数据 USB_RxFlag = 0; Process_Image_Data(USB_RxBuffer); // 处理接收到的图像数据 } // 其他任务,如检测按键调节亮度等 } }4. 上位机程序:数据采集与图像生成
上位机是在你电脑上运行的Python程序,它是整个系统的“大脑”,负责所有复杂的逻辑。
4.1 环境准备与HWInfo设置
安装HWInfo:从官网(https://www.hwinfo.com/download/)下载并安装HWInfo。安装后运行,在启动的弹窗中,务必勾选“仅限传感器”(Sensors-only),这样界面更简洁,只显示我们需要的监控数据。
开启数据共享:在HWInfo主界面,点击右下角的齿轮进入设置(Configuration)。在“安全”或“共享”选项卡中,找到并勾选“共享内存支持”(Shared Memory Support)。这样HWInfo才会把传感器数据放到一块特定的内存区域,供其他程序读取。
4.2 Python上位机核心逻辑
上位机的代码结构主要包含以下几个部分:
- 读取HWInfo数据:通过一个C++编写的DLL(动态链接库)来访问HWInfo的共享内存,获取CPU温度、GPU温度、内存使用率、网络速度等原始数据。这个DLL作者已经准备好了,Python直接调用即可。
- 绘制监控界面:这是最有意思的部分。我们使用
Pillow(PIL)这个强大的图像库来画图。from PIL import Image, ImageDraw, ImageFont # 创建一张和屏幕分辨率一样大的图片(例如240x240) image = Image.new('RGB', (240, 240), color='black') draw = ImageDraw.Draw(image) # 加载一个好看的字体 font = ImageFont.truetype('arial.ttf', 24) # 在指定位置绘制文本,例如CPU温度 cpu_temp = get_cpu_temperature() # 从HWInfo获取的数据 draw.text((20, 20), f'CPU: {cpu_temp}°C', font=font, fill='white') # 还可以画进度条、图标等等,完全自由发挥 - 图像数据发送:将Pillow生成的图像对象转换成单片机屏幕能接受的RGB565格式的字节流,然后通过PySerial库,找到STC32对应的串口号,将数据发送出去。
import serial # 自动查找STC32的串口号(通过USB的VID/PID识别) port = find_stc32_port() ser = serial.Serial(port, baudrate=115200, timeout=1) # 将图像转换为字节数组 img_bytes = convert_image_to_rgb565(image) # 发送数据 ser.write(img_bytes) - 高级功能:
- 自动重连:程序会检测串口连接状态,如果副屏被拔掉再插上,会自动重新连接。
- 随系统锁屏/息屏:上位机会监听Windows系统的锁屏和息屏事件,当电脑锁屏或息屏时,自动给副屏发送一个清屏或进入低功耗模式的指令,非常省电和智能。
4.3 打包与运行
为了方便使用,我们可以用PyInstaller把Python脚本打包成一个独立的CoreInsight.exe可执行文件。这样,其他用户不需要安装Python环境,直接双击就能运行。
项目作者甚至利用了GitHub Actions,实现了代码一更新就自动打包,非常方便。
5. 组装、调试与使用心得
- 焊接与组装:将所有元器件焊接到PCB上,检查有无虚焊、短路。然后将屏幕用螺丝固定到外壳上,再扣上后盖。
- 烧录程序:使用STC-ISP工具,将编译好的单片机程序(.hex文件)烧录到STC32芯片中。切记,第一次烧录可能需要冷启动(先点下载再给板子上电)。
- 联调:
- 将组装好的副屏通过USB线连接到电脑。
- 打开HWInfo并设置好共享内存。
- 运行
CoreInsight.exe上位机程序。 - 如果一切正常,你就能在副屏上看到实时刷新的硬件监控信息了!
踩坑与提示:
- 屏幕不亮:首先检查背光引脚(BLK)的电路和PWM配置是否正确。可以用万用表量一下背光电压。
- 花屏或乱码:大概率是SPI时序不对。检查软件SPI的时钟频率是否在ST7789支持的范围内,以及数据发送的位顺序(MSB/LSB)是否与屏幕要求一致。
- 上位机找不到串口:检查设备管理器里STC32的CDC串口驱动是否安装成功。有时需要手动指定一下端口号。
- 数据刷新慢:因为是通过串口传输整张图片,刷新率不会太高,大概1-2秒一帧。这对于显示硬件监控数据来说完全足够了。如果想更快,可以尝试只更新变化的部分区域,而不是整屏刷新。
这个项目的所有源代码、电路图、外壳3D文件都已经开源在GitHub上(https://github.com/liux-pro/CoreInsight)。你可以直接使用,也可以在此基础上修改,比如更换显示布局、增加监控项(如硬盘温度)、或者改成你喜欢的任何样式。DIY的乐趣就在于此,希望这个项目能成为你嵌入式学习之路上一个有趣的实践。
