1. 准备工作:硬件与固件选择
玩转MicroPython和ESP32的硬件组合,最让人头疼的往往不是代码本身,而是前期准备工作。我刚开始接触ST7735屏幕时,光是选对固件就折腾了好几天。这里分享几个关键点,帮你少走弯路。
首先说说硬件选择。ESP32开发板市面上五花八门,但建议选择带有SPI接口的标准开发板,比如ESP32-DevKitC。我实测过合宙的1.8寸TFT屏幕(型号ST7735S),性价比很高,160x128的分辨率足够显示多行中文。屏幕引脚接线要特别注意:SCK接GPIO18,MOSI接GPIO23,DC接GPIO21,CS接GPIO16,RST接GPIO22。背光引脚BL可以不接,直接用3.3V供电就行。
固件选择是中文显示的关键。普通MicroPython固件不支持中文,必须使用带中文字库的定制版本。推荐使用开源的ssd1306-MicroPython-ESP32-Chinese项目提供的固件,这个固件内置了GB2312字符集,支持12x12和16x16两种点阵字体。烧录固件时要注意选择与开发板匹配的版本,比如ESP32-WROOM-32D和ESP32-WROVER的固件就不同。
2. ST7735驱动移植与配置
拿到屏幕第一件事就是移植驱动程序。ST7735的驱动代码看起来复杂,其实核心就是通过SPI发送控制命令和数据。我优化过的这个版本支持旋转显示和RGB565色彩模式,比原厂代码更易用。
驱动代码中最关键的是初始化序列。ST7735需要依次发送睡眠退出、颜色模式、内存访问控制等命令。这里有个坑:不同厂商的ST7735初始化参数可能不同。比如合宙的屏幕需要发送INVON命令开启颜色反转,而某些山寨屏则需要INVOFF。如果发现显示颜色异常,可以尝试调整这个参数。
旋转功能通过MADCTL寄存器控制。实测发现,当rot参数为0时是竖屏模式,1是90度横屏,2是180度竖屏,3是270度横屏。但要注意,旋转后显示坐标会变化,需要在show()方法中调整CASET和RASET的起始位置。我在代码里已经处理了这些细节,你直接传rot参数就行。
3. 中文字体加载与渲染
中文显示的核心是字体文件处理。MicroPython本身不支持TrueType字体,需要使用点阵字体。推荐使用GB2312-12.fon这种二进制字体文件,它包含了GB2312标准的所有汉字(约7000个),每个字符12x12像素。
字体加载使用font_load()方法,注意文件路径要正确。我遇到过字体加载失败的问题,后来发现是文件系统空间不足。ESP32的SPIFFS分区通常只有1MB左右,建议先用os.listdir()检查文件是否存在,再用os.stat()看文件大小是否正常。
文本渲染最麻烦的是多行处理。原始驱动只支持单行显示,我扩展了text()方法,自动处理换行和截断。当文本超出屏幕宽度时,会自动换到下一行。显示位置通过x,y参数指定,颜色用RGB565格式。比如0xf800是红色,0x07e0是绿色,0x001f是蓝色。可以用rgb()方法将RGB值转换为565格式。
4. 实战:多行彩色中文显示
现在我们来个完整示例。首先确保字体文件GB2312-12.fon已经上传到设备根目录。然后运行以下代码:
from st7735 import ST7735 from machine import Pin,SPI import time # 初始化SPI spi = SPI(2, baudrate=20000000, polarity=0, phase=0, sck=Pin(18), mosi=Pin(23)) # 初始化LCD,rot=2表示180度旋转 lcd = ST7735(128, 160, spi, dc=Pin(21), cs=Pin(16), rst=Pin(22), rot=2, bgr=0) # 加载字体 lcd.font_load('./GB2312-12.fon') # 显示多行彩色中文 lcd.text("MicroPython中文显示实战", 5, 5, 0xF800) # 红色 lcd.text("ESP32驱动ST7735屏幕", 5, 20, 0x07E0) # 绿色 lcd.text("支持多行文本自动换行", 5, 35, 0x001F) # 蓝色 lcd.text("字体大小12x12像素", 5, 50, 0xFFE0) # 黄色 lcd.text("作者:嵌入式开发老鸟", 5, 65, 0xF81F) # 粉色 lcd.show() # 刷新显示这个例子展示了如何用不同颜色显示多行中文。注意y坐标要留出足够间距,12像素的字体加上2像素行距,每行间隔14像素比较合适。如果显示乱码,很可能是字体文件不匹配,建议重新下载GB2312编码的字体文件。
5. 常见问题排查
调试时最常遇到的问题是白屏。首先检查接线是否正确,特别是RST引脚必须接。然后用逻辑分析仪或示波器看SPI是否有信号。如果SPI正常但还是白屏,可能是初始化序列不对,可以尝试调整SLPOUT后的延时(我代码里是120ms)。
中文显示乱码通常是编码问题。MicroPython默认使用UTF-8,而GB2312字体需要GBK编码。确保你的.py文件保存为UTF-8格式,但文本内容要符合GB2312字符集。比如"嵌入式"这三个字在GB2312中都有,但"哔哩哔哩"就可能显示为问号。
内存不足也是个常见坑。ESP32的堆内存有限,显示大尺寸图片时容易崩溃。建议将大资源存到文件系统,使用时分段加载。另外,频繁刷新屏幕会消耗大量内存,可以用framebuf局部刷新优化性能。