1. 项目概述4英寸电子墨水屏的独特魅力如果你玩过树莓派、Arduino或者STM32大概率会接触到各种显示屏从炫彩的OLED到反应迅速的TFT。但有一种屏幕它一上电就让你感觉“这很极客”——那就是电子墨水屏也就是我们常说的e-Paper。今天要聊的这块“4inch e-Paper HAT (E)”就是这类屏幕中一个非常经典且实用的型号。它不仅仅是一个配件更是一个能让你项目瞬间提升格调和实用性的关键模块。简单来说这是一块专为树莓派等单板计算机设计的4英寸电子墨水屏扩展板HAT。它的核心价值在于“超低功耗”和“类纸显示”。与需要持续刷新、功耗较高的LCD屏不同电子墨水屏只在更新画面时才消耗电能一旦画面显示完成即使完全断电图像也能保持数周甚至数月不消失。这个特性让它天生就适合那些需要长时间显示固定信息、且对功耗极其敏感的应用场景比如智能家居的温湿度仪表盘、办公室的日程看板、零售店的电子价签或者户外环境监测站的读数显示。我最初接触它是想做一个放在桌面的天气预报站。受够了手机屏幕的频繁亮灭和刺眼背光我希望有一块像便签纸一样安静显示信息的屏幕只有数据更新时才会“动一下”。这块4英寸的屏幕尺寸恰到好处足够显示多行文字和一些简单的图标又不会占用过多桌面空间。通过树莓派驱动我可以让它定时从网络获取天气信息并刷新整个过程静默无声功耗极低甚至可以用一块小容量充电宝供电运行好几天。这种“存在但不打扰”的体验是其他任何显示屏都无法给予的。2. 硬件深度解析与接口选择2.1 屏幕核心参数与驱动原理这块4inch e-Paper HAT (E)采用的是一种三色黑、白、红电子墨水技术。分辨率是640x400像素对于显示文字和简单图形来说清晰度完全足够。理解其驱动原理是后续顺利编程的关键。电子墨水屏内部有数百万个微胶囊每个胶囊里包含带正电的白色粒子和带负电的黑色粒子对于三色屏还有红色粒子。通过给屏幕上下基板施加不同的电压可以控制这些带电粒子移动到胶囊的顶部或底部从而在表面形成黑色或白色的像素点。最关键的一点是当电场撤销后粒子会由于范德华力和界面张力保持在原位。这就是它“静态显示不耗电”的物理基础。驱动这样的屏幕核心是一个“波形文件”Waveform。这个文件定义了为了显示某个灰阶比如全黑、全白、或者红黑叠加需要向屏幕施加怎样的电压序列包括电压大小、方向和持续时间。制造商比如元太科技会为每一款屏幕型号提供对应的波形文件。我们开发者要做的就是按照正确的时序通过SPI或并行接口将这个波形数据“播放”给屏幕的驱动芯片。注意不同型号、甚至不同批次的e-Paper屏幕其驱动波形可能略有不同。直接使用错误的波形文件可能导致刷新异常、残影严重甚至损坏屏幕。因此务必从可靠的渠道获取与你手中屏幕型号完全匹配的驱动库和波形文件。2.2 丰富的接口与适配器设计这块HAT设计最贴心的地方在于其接口的兼容性。它板载了几乎你能想到的所有主流接口树莓派 40-Pin GPIO接口这是主要接口。板子可以直接插在树莓派Zero/2/3/4/5的GPIO排针上通过SPI和几个GPIO控制脚进行通信。供电也直接从树莓派的5V和3.3V引脚获取。8-Pin FPC接口这是一个扁平排线接口用于连接屏幕本体。HAT板作为中间驱动板负责将来自主控的信号转换成屏幕能理解的时序。Arduino兼容接口板子边缘有一组排针标明了VCC, GND, DIN, CLK, CS, DC, RST, BUSY。这让你可以轻松地用杜邦线将其连接到Arduino Uno、ESP32等开发板。STM32/Jetson Nano兼容设计虽然引脚定义可能不完全一致但通过其引出的标准SPIDIN, CLK, CS和控制引脚DC, RST, BUSY你可以很方便地适配STM32使用HAL库或标准库或NVIDIA Jetson Nano使用其GPIO库等平台。这种设计意味着你买一块屏幕就可以在树莓派上快速原型验证然后无缝迁移到功耗更低的STM32项目上进行量产部署或者用性能更强的Jetson Nano运行复杂的图像处理后再显示。学习成本被降到了最低。3. 树莓派环境搭建与基础驱动3.1 系统准备与依赖安装在树莓派上使用这块屏幕是最快捷的方式。假设你已安装好Raspberry Pi OS推荐使用Lite版本以减少资源占用并通过SSH或直接连接了终端。首先确保SPI接口已启用。树莓派的SPI默认是关闭的。sudo raspi-config在菜单中依次选择Interface Options-SPI-Yes来启用SPI然后重启。接下来我们需要安装必要的Python库和系统工具。Python是操作这块屏幕最常用的语言因为有丰富成熟的库支持。# 更新系统包列表 sudo apt update sudo apt upgrade -y # 安装Python3开发环境和pip以及图像处理库 sudo apt install python3-pip python3-pil python3-numpy -y # 安装用于操作GPIO和SPI的库这里使用RPi.GPIO和spidev sudo apt install python3-rpi.gpio python3-spidev -y3.2 获取与配置驱动库官方或社区维护的驱动库是成功的关键。以广泛使用的waveshare_e-Paper库为例# 克隆驱动库仓库到本地 git clone https://github.com/waveshare/e-Paper.git cd e-Paper/RaspberryPi_JetsonNano/python这个目录下包含了 Waveshare 多种尺寸e-Paper屏幕的驱动。我们需要找到对应4inch e-Paper HAT (E)的驱动文件。通常它会有一个类似epd4in01f.py或根据分辨率命名的文件640x400。你需要仔细阅读readme或根据文件名判断。例如epd4in2.py是4.2英寸的显然不对。对于三色4英寸型号驱动文件可能是epd4in01f.py。进入lib目录确保waveshare_epd这个Python包被正确安装或链接。一个稳妥的方法是使用pip从当前目录安装sudo pip3 install .或者你也可以将整个python目录下的文件复制到你的项目目录中直接引用。3.3 编写第一个显示程序让我们创建一个最简单的测试脚本来显示一些文字和图形确认硬件连接和驱动正常。#!/usr/bin/python3 # -*- coding:utf-8 -*- import sys import os import time # 添加库路径假设驱动库放在同级目录的‘lib’文件夹下 sys.path.append(os.path.join(os.path.dirname(os.path.realpath(__file__)), ‘lib’)) from waveshare_epd import epd4in01f # 请根据实际文件名修改导入 from PIL import Image, ImageDraw, ImageFont try: # 1. 初始化屏幕对象 epd epd4in01f.EPD() # 初始化类 epd.init() # 初始化屏幕硬件 epd.Clear() # 清屏全白显示 print(“屏幕初始化并清屏完成”) # 2. 创建一个在内存中的图像缓冲区模式为‘1’1位黑白大小与屏幕一致 # 注意对于三色屏通常使用‘1’模式红色通过特定的像素值或另一个图层控制 # 具体需参考驱动库说明有些库可能用‘L’(8位灰度)或‘RGB’模式 image Image.new(‘1’, (epd.width, epd.height), 255) # 255为白色 draw ImageDraw.Draw(image) # 3. 加载字体树莓派自带一些字体 font ImageFont.truetype(‘/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf’, 24) # 4. 绘制文字 draw.text((10, 10), ‘Hello, e-Paper!’, fontfont, fill0) # fill0 代表黑色 draw.text((10, 50), ‘Raspberry Pi’, fontfont, fill0) draw.text((10, 90), ‘4inch HAT (E)’, fontfont, fill0) # 5. 绘制一个矩形框 draw.rectangle((5, 5, 635, 395), outline0, width2) # 6. 将图像缓冲区的内容发送到屏幕并刷新显示 # 注意e-Paper刷新较慢此过程需要几秒钟期间屏幕会闪烁数次正常现象 epd.display(epd.getbuffer(image)) print(“图像显示完成”) # 7. 进入休眠模式以节省功耗 epd.sleep() print(“屏幕已进入休眠模式”) except IOError as e: print(e) except KeyboardInterrupt: print(“程序被中断”) # 确保退出前清屏并休眠 epd4in01f.epdconfig.module_exit() exit()将屏幕HAT插到树莓派上注意方向USB口朝外运行这个脚本python3 test_epaper.py你会看到屏幕先全白然后快速闪烁几次这是电子墨水屏在清除旧图像和写入新图像的正常过程最终显示出你绘制的文字和边框。整个过程大约需要4-6秒。显示完成后即使你拔掉树莓派电源图像依然会保留在那里。实操心得第一次刷新时间最长因为屏幕需要完全清除之前的残留状态。后续如果只是局部更新比如只改几个数字可以使用驱动库提供的局部刷新函数如epd.display_Partial速度会快很多1-2秒但局部刷新多次后可能产生残影需要定期进行一次全刷新来清除。4. 高级应用与图像处理技巧4.1 显示动态数据与自动刷新静态显示只是开始我们的目标是让信息动起来。下面以创建一个自动刷新的系统状态监控页为例。import psutil import datetime from time import sleep def draw_system_info(draw, font): 在draw对象上绘制系统信息 # 获取CPU使用率 cpu_percent psutil.cpu_percent(interval1) # 获取内存信息 memory psutil.virtual_memory() mem_percent memory.percent mem_used memory.used / (1024**3) # 转换为GB mem_total memory.total / (1024**3) # 获取磁盘使用率根目录 disk psutil.disk_usage(‘/’) disk_percent disk.percent # 获取系统启动时间 boot_time datetime.datetime.fromtimestamp(psutil.boot_time()).strftime(“%Y-%m-%d %H:%M:%S”) # 获取当前时间 current_time datetime.datetime.now().strftime(“%H:%M:%S”) y_offset 10 line_height 30 draw.text((10, y_offset), f“Time: {current_time}”, fontfont, fill0) draw.text((10, y_offset line_height), f“CPU: {cpu_percent:5.1f}%”, fontfont, fill0) draw.text((10, y_offset line_height*2), f“Mem: {mem_percent:5.1f}% ({mem_used:.1f}/{mem_total:.1f} GB)”, fontfont, fill0) draw.text((10, y_offset line_height*3), f“Disk: {disk_percent:5.1f}%”, fontfont, fill0) draw.text((10, y_offset line_height*4), f“Boot: {boot_time}”, fontfont, fill0) # 简单绘制一个CPU使用率的条形图 bar_width 200 bar_height 20 bar_x 400 bar_y y_offset line_height # 外框 draw.rectangle((bar_x, bar_y, bar_x bar_width, bar_y bar_height), outline0) # 填充部分 fill_width int(bar_width * cpu_percent / 100) draw.rectangle((bar_x, bar_y, bar_x fill_width, bar_y bar_height), fill0) # 主循环 epd epd4in01f.EPD() epd.init() # 使用大一点和小一点的字体 font_large ImageFont.truetype(‘/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf’, 28) font_small ImageFont.truetype(‘/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf’, 20) try: while True: # 创建新图像 image Image.new(‘1’, (epd.width, epd.height), 255) draw ImageDraw.Draw(image) # 绘制标题 draw.text((10, 5), “RPi System Monitor”, fontfont_large, fill0) draw.line((10, 40, 630, 40), fill0, width2) # 绘制动态信息 draw_system_info(draw, font_small) # 显示到屏幕 epd.display(epd.getbuffer(image)) print(f“[{datetime.datetime.now()}] 屏幕已刷新”) # 等待60秒后刷新 sleep(60) except KeyboardInterrupt: print(“\n监控程序停止”) epd.Clear() epd.sleep()这个脚本会每分钟刷新一次显示树莓派的实时状态。你可以将其设置为开机自启的守护进程这样一块低功耗的系统监控屏就做好了。4.2 图像转换与优化显示直接显示彩色图片到黑白/三色墨水屏需要经过一个称为“抖动”Dithering的图像处理过程将灰度或彩色信息转换为黑白像素点图案以模拟出灰度效果。使用Python PIL库可以轻松完成。from PIL import Image def prepare_image_for_epaper(image_path, target_width, target_height): 将任意图片转换为适合e-Paper显示的1位黑白模式图像 # 打开图片 img Image.open(image_path) # 1. 转换为灰度图 img_gray img.convert(‘L’) # 2. 调整尺寸保持宽高比 img_ratio img_gray.width / img_gray.height target_ratio target_width / target_height if img_ratio target_ratio: # 原图更宽以宽度为基准缩放 new_width target_width new_height int(target_width / img_ratio) else: # 原图更高以高度为基准缩放 new_height target_height new_width int(target_height * img_ratio) img_resized img_gray.resize((new_width, new_height), Image.Resampling.LANCZOS) # 3. 创建目标画布白色背景 canvas Image.new(‘L’, (target_width, target_height), 255) # 将缩放后的图片粘贴到画布中央 paste_x (target_width - new_width) // 2 paste_y (target_height - new_height) // 2 canvas.paste(img_resized, (paste_x, paste_y)) # 4. 应用Floyd-Steinberg抖动算法转换为1位黑白图像 # 阈值可以调整128是中间值。调低阈值图片整体更黑调高则更白。 img_1bit canvas.convert(‘1’, ditherImage.Dither.FLOYDSTEINBERG) return img_1bit # 使用示例 epd epd4in01f.EPD() epd.init() processed_image prepare_image_for_epaper(‘your_photo.jpg’, epd.width, epd.height) epd.display(epd.getbuffer(processed_image)) epd.sleep()对于三色屏黑、白、红处理逻辑更复杂一些。通常需要将原图分离出“红色通道”并分别生成黑色图层和红色图层。很多驱动库提供了display_black_red之类的方法需要传入两个图像缓冲区一个代表黑色部分一个代表红色部分。# 假设原图是RGB模式 img_color Image.open(‘color_image.png’).convert(‘RGB’) width, height img_color.size # 创建黑色图层初始全白 layer_black Image.new(‘1’, (width, height), 255) # 创建红色图层初始全白 layer_red Image.new(‘1’, (width, height), 255) for x in range(width): for y in range(height): r, g, b img_color.getpixel((x, y)) # 简单的颜色判断逻辑如果红色分量很强且非纯白/灰则归为红色 # 这是一个非常简化的算法实际效果取决于图片 if r 150 and g 100 and b 100: # 在红色图层上设置该点为黑色即显示红色 layer_red.putpixel((x, y), 0) elif (r g b) 450: # 非白色区域归为黑色 # 在黑色图层上设置该点为黑色 layer_black.putpixel((x, y), 0) # 使用驱动库的双图层显示函数 epd.display_black_red(epd.getbuffer(layer_black), epd.getbuffer(layer_red))注意事项图像处理尤其是彩色转双色的算法直接决定了显示效果。简单的阈值法可能效果生硬。对于高质量显示可以研究更复杂的误差扩散抖动算法或者使用预定义的调色板进行颜色量化。网上有一些开源的专为电子墨水屏优化的图像转换工具如pbm工具链效果往往比简单的PIL处理更好。5. 移植到其他平台Arduino与STM325.1 Arduino环境下的驱动在Arduino上使用这块屏幕你需要利用其SPI硬件或软件模拟SPI。由于Arduino Uno的RAM和Flash有限处理640x400的全屏缓冲区32000字节比较吃力通常需要分块刷新或使用更精简的图形库。安装库在Arduino IDE中通过“库管理器”搜索“GxEPD2”或“e-Paper”。GxEPD2是一个功能强大、支持众多型号的库。安装它。连接硬件将HAT板的Arduino接口与Uno连接VCC-5VGND-GNDDIN-D11(MOSI)CLK-D13(SCK)CS-D10(SS)DC-D9RST-D8BUSY-D7编写代码#include GxEPD2_BW.h // 对于黑白屏如果是三色屏可能是GxEPD2_3C #include Fonts/FreeMonoBold9pt7b.h // 根据你的屏幕型号定义驱动类4inch e-Paper HAT (E) 可能对应 GxEPD2_4IN01F // 请查阅GxEPD2库的示例和头文件确认确切型号 #define MAX_DISPLAY_BUFFER_SIZE 65536ul #define MAX_HEIGHT(EPD) (EPD::HEIGHT MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8) ? EPD::HEIGHT : MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8)) // 实例化对象参数CS, DC, RST, BUSY GxEPD2_BWGxEPD2_4IN01F, MAX_HEIGHT(GxEPD2_4IN01F) display(GxEPD2_4IN01F(/*CS*/10, /*DC*/9, /*RST*/8, /*BUSY*/7)); void setup() { Serial.begin(115200); display.init(115200); // 初始化屏幕可以传入串口波特率用于调试 display.setRotation(1); // 根据需要设置旋转0-3 display.setFont(FreeMonoBold9pt7b); display.setTextColor(GxEPD_BLACK); // 清屏 display.fillScreen(GxEPD_WHITE); // 绘制文本 display.setCursor(10, 30); display.println(“Hello, Arduino!”); display.setCursor(10, 60); display.println(“e-Paper Test”); // 更新显示 display.display(); // 进入休眠 display.hibernate(); } void loop() { // 空循环 }在Arduino上由于内存限制GxEPD2库通常会使用屏幕自身的帧缓冲区或分块传输而不是在MCU内存储整张图片。因此绘制复杂图形或图片的流程与树莓派略有不同需要遵循库提供的drawPixel,drawLine,print等函数或者使用drawBitmap函数分块传输位图数据。5.2 STM32上的嵌入式集成在STM32项目上使用这块屏幕意味着你要将其集成到一个可能没有操作系统的嵌入式环境中。核心工作是实现SPI和控制引脚的底层驱动。硬件连接连接STM32的SPI引脚如SPI1: PA5-SCK, PA6-MISO, PA7-MOSI到屏幕的CLK和DINMOSI。CS、DC、RST、BUSY连接到任意GPIO口。使用HAL库如果你使用STM32CubeMX和HAL库配置步骤如下在CubeMX中启用SPI全双工主模式。将CS、DC、RST、BUSY对应的GPIO配置为输出模式推挽输出BUSY配置为输入模式上拉或浮空输入。生成代码。移植驱动逻辑你需要将屏幕驱动主要是发送命令、发送数据、等待忙信号、初始化序列等函数用HAL库的函数重写。通常厂商会提供C语言的示例代码。关键函数SPI_WriteByte(uint8_t data): 使用HAL_SPI_Transmit发送一个字节。EPD_WriteCommand(uint8_t command): 拉低DC引脚表示命令然后发送命令字节。EPD_WriteData(uint8_t data): 拉高DC引脚表示数据然后发送数据字节。EPD_WaitUntilIdle(void): 循环读取BUSY引脚状态直到其为低电平表示屏幕就绪。初始化序列严格按照数据手册或参考代码中的顺序和延时发送一系列命令和数据来配置屏幕的驱动IC。刷新显示将整个帧缓冲区一个大小为(width * height / 8)的字节数组通过SPI发送出去。由于数据量大建议使用DMA传输以提高效率并释放CPU。图形库集成你可以使用轻量级的嵌入式图形库如u8g2、LVGL并为它们编写针对这块e-Paper屏幕的“驱动程序”即实现u8g2的硬件抽象层回调函数。这样你就可以使用丰富的图形库API来绘制界面而无需直接操作像素。踩坑记录在STM32上SPI的时钟极性CPOL和时钟相位CPHA必须设置正确通常e-Paper屏幕的SPI模式是0CPOL0 CPHA0或3CPOL1 CPHA1。务必查阅屏幕规格书确认。错误的SPI模式会导致通信完全失败。6. 功耗管理与电源方案设计电子墨水屏的功耗优势只有在合理的电源管理下才能最大化。屏幕本身的功耗集中在刷新瞬间驱动电路和主控的待机功耗同样重要。屏幕刷新功耗分析全刷新一次完整的全屏刷新约4-6秒是功耗峰值。以某型号为例刷新时工作电流可能在30-50mA3.3V下。局部刷新局部刷新时间短1-2秒平均电流较低。静态显示显示静态图像时电流几乎为0微安级仅驱动芯片有极低的待机电流。系统级省电策略主控深度睡眠对于电池供电项目让树莓派、Arduino或STM32在两次刷新间隔进入深度睡眠模式。例如使用树莓派的raspi-gpio设置唤醒定时器或使用Arduino的LowPower库、STM32的Stop/Standby模式。屏幕休眠命令每次刷新完成后务必发送sleep命令给屏幕驱动芯片。如果不发送此命令驱动芯片可能保持在工作状态消耗数百微安到几毫安的电流。断开非必要外设在MCU睡眠前通过MOSFET或负载开关切断屏幕、传感器等外围模块的电源。优化刷新频率根据信息变化速度设定合理的刷新间隔。天气预报可以每小时刷新一次传感器数据可以每5分钟刷新一次。电源方案示例太阳能电池板锂电池 对于户外长期部署的项目可以考虑以下方案太阳能电池板 (5V/2W) - 太阳能充电管理模块 (如TP4056) - 3.7V锂电池 (2000mAh) | V 低压差稳压器 (LDO, 如AMS1117-3.3) - 3.3V - 屏幕及主控配合STM32等低功耗MCU精心设计软件唤醒周期这样一套系统在光照充足地区可以做到理论上的永久运行。7. 常见问题排查与实战技巧在实际项目中你肯定会遇到各种问题。下面是一些典型问题及其解决方法问题现象可能原因排查步骤与解决方案屏幕全白或全黑无任何变化1. 电源未接通或电压不足。2. SPI通信失败。3. 初始化序列未正确执行。1. 用万用表测量HAT板VCC和GND之间电压确保在3.3V左右或5V取决于板子设计。2. 使用逻辑分析仪或示波器检查SPI的CLK和DIN引脚是否有波形。检查CS、DC引脚是否在通信时有电平变化。3. 确认代码中的初始化函数被调用且顺序与官方示例一致。检查RST引脚是否有正确的复位脉冲先拉低至少10ms再拉高。刷新过程中屏幕乱码或花屏1. SPI时钟速度过快。2. 帧缓冲区数据错误或传输不完整。3. 电源在刷新期间不稳定。1. 降低SPI时钟频率。树莓派SPI默认速度可能很高尝试在初始化时设置一个较低的速度如spi.max_speed_hz 2000000即2MHz。2. 检查生成图像缓冲区的代码逻辑确保图像模式‘1’ ‘L’与驱动库要求一致。对于STM32检查DMA传输是否完成或SPI发送缓冲区是否溢出。3. 在屏幕的VCC和GND之间并联一个100-470uF的电解电容以提供刷新瞬间所需的大电流。残影严重旧图像无法完全清除1. 未使用正确的全刷新波形。2. 局部刷新使用过于频繁。3. 环境温度过低。1. 确保在显示重要内容前先执行一次完整的清屏操作epd.Clear()。2. 制定刷新策略每进行5-10次局部刷新后强制进行一次全刷新。3. 电子墨水屏在低温下响应变慢残影会更明显。这是物理特性尽量避免在0°C以下环境使用或延长每次刷新的等待时间。树莓派SPI无法打开1. SPI未在系统中启用。2. SPI设备节点权限问题。1. 运行ls /dev/spi*如果没有任何输出说明SPI未启用用raspi-config启用。2. 如果输出/dev/spidev0.0等但程序报权限错误可以将用户加入spi组sudo usermod -a -G spi $USER然后注销重新登录生效。Arduino程序上传后屏幕无反应1. 引脚连接错误。2. 库不支持具体型号。3. 内存不足。1. 仔细核对每一根连接线。BUSY引脚必须连接并且代码中要正确实现等待忙信号的功能。2. 检查GxEPD2库中是否包含你屏幕型号的定义。可能需要手动添加或修改库文件。3. 尝试使用F()宏将字符串常量存到Flash中如display.println(F(“Hello”));以节省RAM。STM32显示内容错位或偏移1. 屏幕旋转设置错误。2. 帧缓冲区数据排列格式位序错误。1. 检查驱动代码中关于屏幕旋转setRotation或扫描方向setScanDirection的设置。2. 屏幕驱动IC可能要求数据是“高位在前”(MSB First)或“低位在前”(LSB First)而你的SPI配置或图像数据处理顺序可能与之相反。仔细查阅数据手册中关于数据格式的说明。独家避坑技巧首次测试务必从清屏开始在编写任何复杂显示逻辑前先写一个只做epd.init()和epd.Clear()的程序。这能最直接地验证硬件连接和基础驱动是否正常。善用BUSY引脚一定要实现并调用等待忙信号函数。在发送任何命令或数据后如果手册要求等待就必须等待。盲目加延时delay()是不可靠的因为刷新时间会随温度变化。图像预处理在PC端进行对于复杂的图片或字体不要在资源有限的嵌入式端进行缩放、抖动等耗时的图像处理。可以在电脑上用Python脚本预先处理好图片转换为纯黑的位图数组然后以C语言数组的形式嵌入到嵌入式代码中直接发送显示。准备一份“急救”固件当你调试显示代码导致屏幕显示混乱甚至无法正常初始化时可以烧录一个已知能正常全清屏的简单程序比如Arduino的Blink改成的ClearScreen用于恢复屏幕状态。