ESP32MicroPython玩转ST7735小屏幕从接线到显示中文的保姆级避坑指南1. 硬件准备与接线图解析当你第一次拿到ESP32开发板和ST7735屏幕时面对密密麻麻的引脚可能会感到无从下手。别担心我们先从最基础的物理连接开始。ESP32的3.3V逻辑电平与ST7735完美匹配这是选择这对组合的重要原因之一。核心接线清单电源部分ESP32的GND → ST7735的GNDESP32的3.3V → ST7735的VDD和BLK背光控制数据通信IO23 → SDAMOSIIO18 → SCLSCK控制引脚IO22 → RST复位IO21 → DC数据/命令选择IO16 → CS片选注意不同厂商的ST7735模块引脚标注可能略有差异建议先确认你的屏幕版本。我曾遇到过标注为SDA实际对应MOSI的情况用万用表测量确认后才避免烧板风险。2. MicroPython环境搭建2.1 固件刷写实战推荐使用最新的MicroPython稳定版固件以下是刷机步骤精要# 使用esptool刷写固件示例 esptool.py --chip esp32 --port /dev/ttyUSB0 erase_flash esptool.py --chip esp32 --port /dev/ttyUSB0 write_flash -z 0x1000 esp32-20220618-v1.19.1.bin刷机完成后通过串口工具连接会看到MicroPython的REPL提示符。如果遇到连接问题检查驱动安装和端口权限是首要步骤。2.2 必备库文件部署需要准备两个关键文件st7735.py- 屏幕驱动库GB2312-12.fon- 中文字库使用Thonny IDE的文件上传功能最为便捷。我习惯先创建一个/lib目录存放第三方库保持项目结构清晰。上传后记得测试导入是否成功import st77353. 屏幕初始化与基础显示3.1 SPI配置详解ST7735通过SPI接口通信ESP32有多个SPI总线可供选择from machine import Pin, SPI spi SPI( 2, # 使用SPI2主机 baudrate20000000, # 20MHz时钟 polarity0, # CPOL配置 phase0, # CPHA配置 sckPin(18), # 时钟引脚 mosiPin(23) # 数据输出 )3.2 屏幕对象初始化创建ST7735实例时的参数需要特别注意lcd ST7735( 128, 160, # 屏幕分辨率 spi, # SPI实例 dcPin(21), # 数据/命令选择 csPin(16), # 片选 rstPin(22), # 复位 rot0, # 显示方向 bgr0 # 颜色顺序 )常见问题排查屏幕白屏检查背光(BLK)是否接3.3V花屏现象降低SPI波特率尝试无反应确认复位引脚是否正常触发4. 中文显示进阶技巧4.1 字库加载与使用中文字体需要特殊处理GB2312编码的点阵字库是常用方案lcd.font_load(./GB2312-12.fon) # 加载12像素字库 lcd.text(你好世界, 10, 30, 0xFFFF) # 白色文字 lcd.show() # 必须调用才能刷新显示颜色编码参考表颜色名称RGB565编码示例代码红色0xF8000xF800绿色0x07E00x07E0蓝色0x001F0x001F黄色0xFFE00xFFE04.2 图形绘制实战除了文字ST7735还支持基本图形绘制# 绘制矩形边框 lcd.rect(10, 50, 50, 30, 0xFFFF) # 白色边框 # 填充矩形 lcd.fill_rect(70, 50, 50, 30, 0xF800) # 红色填充 # 绘制直线 lcd.line(0, 0, 127, 159, 0x07E0) # 绿色对角线5. 网络时间同步与显示5.1 WiFi连接配置通过network模块实现联网import network wifi network.WLAN(network.STA_IF) wifi.active(True) wifi.connect(你的SSID, 密码) while not wifi.isconnected(): pass print(IP:, wifi.ifconfig()[0])5.2 NTP时间同步国内推荐使用阿里云NTP服务器import ntptime ntptime.NTP_DELTA 3155644800 # 北京时间偏移量 ntptime.host ntp.aliyun.com ntptime.settime() # 同步网络时间5.3 实时时钟显示结合RTC模块实现低功耗时间显示from machine import RTC, Timer rtc RTC() def update_time(t): datetime rtc.datetime() lcd.fill(0) lcd.text(f{datetime[0]}-{datetime[1]:02d}-{datetime[2]:02d}, 10, 10) lcd.text(f{datetime[4]:02d}:{datetime[5]:02d}:{datetime[6]:02d}, 30, 30) lcd.show() timer Timer(-1) timer.init(period1000, callbackupdate_time) # 每秒刷新6. 第三方库管理技巧MicroPython的包管理通过upip实现import upip upip.install(pycopy-urequests) # 安装网络请求库urequests的使用示例import urequests r urequests.get(http://api.seniverse.com/v3/weather/now.json) weather_data r.json() lcd.text(weather_data[results][0][now][text], 10, 50)遇到内存不足时可以考虑使用micropython.mem_info()检查内存状态优化JSON处理只解析必要字段考虑使用更轻量的ujson替代7. 性能优化与高级功能7.1 双缓冲技术通过创建离屏缓冲区减少闪烁import framebuf buf bytearray(128*160*2) # 16位色深缓冲区 fbuf framebuf.FrameBuffer(buf, 128, 160, framebuf.RGB565) # 在缓冲区绘制 fbuf.fill(0) fbuf.text(缓冲测试, 10, 10, 0xFFFF) # 一次性显示 lcd.blit_buffer(buf, 0, 0, 128, 160)7.2 低功耗优化ESP32的深度睡眠模式可大幅降低功耗from machine import deepsleep # 每小时唤醒一次同步时间 deepsleep(3600*1000) # 毫秒单位实际项目中我发现将屏幕亮度通过PWM调节能节省约40%功耗from machine import PWM blk PWM(Pin(4), freq1000, duty512) # 50%亮度