DIY USB 电流表(6):点个屏,使用 I2C 驱动 0.96 寸 OLED

DIY USB 电流表(6):点个屏,使用 I2C 驱动 0.96 寸 OLED

💡 原文中文,约5900字,阅读约需15分钟。
📝

内容提要

本文介绍了在USB电流表固件项目中使用OLED屏幕和I2C协议的方法,包括复制驱动代码、解释I2C协议工作原理、计算屏幕刷新帧率、选择和使用点阵字体以及编写字符显示驱动并进行测试。文章提供了USB电流表的开源地址。

🔎

延伸解读

I2C 协议在 OLED 驱动中的角色

文章选用 SSD1306 驱动芯片的 0.96 寸 OLED,并采用 I2C 通信。I2C 仅需 SDA 和 SCL 两根线,支持主从架构,适合引脚资源有限的 CH32V003。作者从 CH32V003-GameConsole 项目复制了 OLED 和 I2C 驱动代码,放入 src/drivers 目录,减少了底层开发工作量。这种复用方式在嵌入式开发中常见,但需注意不同项目间的函数定义差异。

刷新帧率计算与实际影响

CH32V003 的 I2C 可工作在快速模式,速率 400kbit/s。屏幕分辨率 128x64,单色每像素 1 bit,全屏数据量 6912 bits,理论刷新率约 57.87 FPS。考虑其他代码执行时间,实际可达 30 FPS 以上。作者指出刷新率影响数据流畅度、CPU 占用和操作响应,对 USB 电流表而言 30 FPS 已足够及时。

点阵字体的存储与显示原理

文章选用 ModernDos 等宽字体,每个字符 8x16 像素,占 16 字节。字体文件包含 ASCII 32~126 共 128 个字符,总占用 1520 字节。显示时需将字体数据按 SSD1306 水平地址模式旋转,使每个字节对应垂直 8 像素。作者编写 display_write_line 函数查表并写入缓存,再通过 display_flush 发送到 OLED。

显示布局与后续开发方向

作者将屏幕分为 4 行,每行 16 个字符,用于显示电压、电流、功率和累计电量。测试时用模拟数据验证显示效果,如“Volt : 5000mV”。目前尚未接入 ADC,下一步将读取 INA219 数据,完成核心测量功能。项目已开源,包含固件、PCB、原理图和外壳文件,便于复现和二次开发。

❓

Q&A

如何在USB电流表项目中使用OLED屏幕?

在USB电流表项目中,可以通过复制CH32V003-GameConsole项目中的OLED驱动代码,并使用I2C协议进行通信来实现OLED屏幕的使用。

I2C协议的工作原理是什么?

I2C协议是一种串行通信协议,使用两根线进行数据传输和时钟信号同步,支持主从架构,适合短距离数据传输。

如何计算OLED屏幕的刷新帧率?

OLED屏幕的刷新帧率可以通过通信速率和屏幕分辨率计算,理想情况下可达57.87 FPS,实际可达30 FPS以上。

在USB电流表中如何选择合适的点阵字体?

可以选择ModernDos字体,适合在128x64分辨率的OLED屏幕上显示字符,确保字符清晰可读。

USB电流表项目的开源地址在哪里?

USB电流表项目的开源地址是https://github.com/ohdarling/CH32V003-USBMeter,包含固件代码和相关文件。

如何编写字符显示驱动?

需要定义内存区域作为显示数据缓存,并编写函数将字符串中的字符数据查找并写入缓存,然后发送到OLED驱动显示。

🏷️

标签

➡️

继续阅读