手把手教你用ESP32和ST7735S屏显示图片(MicroPython版,附完整接线与代码)
手把手教你用ESP32和ST7735S屏显示图片MicroPython版附完整接线与代码第一次拿到ESP32开发板和ST7735S屏幕时那种既兴奋又忐忑的心情至今记忆犹新。兴奋的是终于可以动手实现硬件项目忐忑的是面对密密麻麻的引脚和陌生的SPI接口完全不知从何下手。如果你现在也处于这种状态别担心——本文将用最直白的语言带你一步步完成从硬件连接到图片显示的全过程。我们将重点解决三个核心问题如何正确连接ESP32与屏幕如何上传驱动库并避开版本陷阱如何用最简单的方式显示自定义图片不同于网络上零散的教程这里不仅提供可直接复用的代码还会标注每个环节可能遇到的坑比如引脚接反导致的屏幕闪烁、库文件缺失引发的报错等。跟着操作下来即使是零基础的新手也能在30分钟内看到自己的图片在屏幕上亮起。1. 硬件准备与接线指南1.1 认识你的设备ESP32开发板种类繁多但核心引脚布局基本一致。我使用的是ESP32 DevKitC V4版本它有30个GPIO引脚其中大部分支持多种功能复用。ST7735S屏幕通常以模块形式出售1.8英寸大小分辨率128x160采用4线SPI接口通信。这种屏幕性价比极高淘宝售价约15-20元非常适合入门级项目。必备材料清单ESP32开发板任何型号均可ST7735S TFT屏幕1.8寸 128x160杜邦线建议使用母对母7根Micro USB数据线电脑安装Thonny IDE1.2 精准接线方案接线错误是新手最常遇到的问题。根据实测以下接线方案兼容性最佳屏幕引脚ESP32引脚注意事项GNDGND必须首先连接VCC3.3V切勿接5VSCLGPIO14SPI时钟线SDAGPIO13SPI数据线RESGPIO17复位信号DCGPIO16数据/命令选择CSGPIO5片选信号非原文的GPIO18BLK可不接背光控制注意不同厂商的屏幕引脚标注可能略有差异务必对照屏幕背面丝印确认。我曾因CS引脚接错GPIO18导致屏幕无响应后来发现某些版本驱动库默认使用GPIO5。接线时建议先连接GND和VCC上电观察屏幕背光是否亮起部分屏幕需短接BLK到3.3V。如果屏幕发热或ESP32无法启动请立即断电检查。2. 软件环境搭建2.1 MicroPython固件刷写如果你的ESP32尚未安装MicroPython按以下步骤操作下载最新固件wget https://micropython.org/resources/firmware/esp32-20240222-v1.22.2.bin使用esptool刷写替换PORT为你的实际端口esptool.py --port /dev/ttyUSB0 erase_flash esptool.py --port /dev/ttyUSB0 --baud 460800 write_flash -z 0x1000 esp32-20240222-v1.22.2.bin2.2 驱动库获取与上传原教程提到的GitHub库已更新推荐使用这个优化版import upip upip.install(micropython-st7735)如果网络不畅可以手动下载访问 https://github.com/russhughes/st7735_mpy下载st7735.py和tftbmp.py通过Thonny上传到ESP32根目录实测发现直接pip安装的库可能缺少示例文件建议额外下载tftbmp.py备用。3. 图片显示实战代码3.1 基础显示程序删除原有复杂代码改用这个简化版import st7735 from machine import SPI, Pin spi SPI(1, baudrate20000000, polarity0, phase0, sckPin(14), mosiPin(13), misoNone) display st7735.ST7735(spi, width128, height160, dcPin(16), rstPin(17), csPin(5), rotation1) # 显示纯色背景 display.fill(st7735.RED)运行后屏幕应变为红色。如果出现花屏检查rotation参数0-3对应不同方向确认SPI速率不超过20MHz尝试降低baudrate到100000003.2 显示自定义图片准备一张128x160像素的BMP图片推荐用Photoshop或GIMP转换颜色模式必须为16位色RGB565保存时选择Windows BMP格式通过Thonny上传到ESP32使用优化后的显示代码def show_bmp(filename): with open(filename, rb) as f: if f.read(2) ! bBM: raise ValueError(Not a BMP file) f.seek(10) offset int.from_bytes(f.read(4), little) f.seek(18) width int.from_bytes(f.read(4), little) height int.from_bytes(f.read(4), little) if width ! 128 or height ! 160: raise ValueError(Image must be 128x160 pixels) f.seek(offset) for y in range(height): for x in range(width): pixel f.read(2) display.pixel(x, height-1-y, (pixel[0] 8) | pixel[1]) show_bmp(test.bmp)4. 高频问题解决方案4.1 屏幕无反应排查清单电源问题测量VCC-GND电压应为3.3V±0.2V尝试单独给屏幕供电信号问题# 快速测试SPI线路 from machine import Pin Pin(14, Pin.OUT).value(1) # SCL应变为3.3V Pin(13, Pin.OUT).value(1) # SDA应变为3.3V软件配置确认驱动库版本≥1.0检查MicroPython版本import os; os.uname()4.2 性能优化技巧当显示动态内容时这些技巧可提升流畅度启用双缓冲display st7735.ST7735(..., buffer_size4096)局部刷新替代全屏刷新display.fill_rect(x,y,w,h,color) # 只更新指定区域使用JPG解码器需额外库import jpegdec jpg jpegdec.JPEG(display) jpg.open(image.jpg) jpg.decode()5. 进阶应用打造迷你相册结合按钮控制实现多图切换from machine import Pin import time btn_next Pin(23, Pin.IN, Pin.PULL_UP) btn_prev Pin(22, Pin.IN, Pin.PULL_UP) images [pic1.bmp, pic2.bmp, pic3.bmp] current 0 def show_image(index): display.fill(0) show_bmp(images[index]) while True: if not btn_next.value(): current (current 1) % len(images) show_image(current) time.sleep(0.3) elif not btn_prev.value(): current (current - 1) % len(images) show_image(current) time.sleep(0.3)这个项目最让我惊喜的是ESP32的SPI速度——实测每秒可刷新15帧128x160的全彩图像完全能满足简单动画需求。记得第一次成功显示照片时那种成就感比写出复杂的软件代码还要强烈。硬件编程的魅力就在于此你能亲眼看到、亲手摸到自己的代码在现实世界中产生的变化。