Arduino驱动ST7735实战指南:从接线到图形显示的完整路径
你有没有试过在Arduino项目里加一块彩色小屏,结果却遭遇白屏、花屏、倒置?别急——这几乎是每个初学者都会踩的坑。今天我们就来彻底解决这个问题。
本文不堆术语,不抄手册,只讲你真正需要知道的东西:如何用最简单的方式点亮一块常见的1.8英寸TFT屏(基于ST7735控制器),并让它稳定工作。全程基于Arduino平台,配合Adafruit库实现,适合所有刚入门嵌入式图形显示的朋友。
为什么选ST7735?
市面上能买到的小尺寸TFT屏五花八门,但为什么很多人推荐ST7735?
因为它够“小”也够“省”。
它专为128×160分辨率设计,常见于1.8英寸模块,非常适合塞进你的智能手表原型、迷你数据记录仪或者学生实验板上。
更重要的是:
-引脚少:SPI四线制(SCLK、MOSI、CS、DC) + RST即可;
-自带显存:无需外挂RAM,芯片内部有GRAM缓存图像;
-生态成熟:Adafruit提供了几乎开箱即用的驱动库;
-价格低:十几块钱就能拿下带背光的完整模块。
相比之下,像ILI9341这类支持更大屏幕的芯片虽然功能更强,但对资源要求高,初始化复杂,不适合快速验证想法。
所以如果你是做教育项目、DIY小工具或想练手GUI编程,ST7735是个极佳起点。
硬件怎么接?一图看清所有连接
先上最关心的部分:到底怎么把这块屏接到Arduino Uno/Nano上?
| ST7735引脚 | 推荐连接 | 说明 |
|---|---|---|
| VCC | 5V(模块内置稳压) | 注意有些模块只能接3.3V! |
| GND | GND | 必接 |
| SCL / SCLK | 数字13 或SCK | SPI时钟线 |
| SDA / MOSI | 数字11 或MOSI | 主出从入数据线 |
| RES / RST | 数字9 | 复位脚,可自定义 |
| DC / A0 | 数字8 | 命令/数据切换脚 |
| CS | 数字10 | 片选脚(通常固定) |
| BLK / LED | 3.3V 或 PWM口 | 背光控制,接PWM可调亮度 |
✅重点提示:大多数模块标的是“SDA”、“SCL”,但这不是I²C!这是厂商为了方便记忆乱标的,实际对应的是MOSI和SCLK!
Arduino Uno上的硬件SPI接口是固定的:
- SCK → 13
- MOSI → 11
- MISO → 12(不用)
- SS (CS) → 10(可用作片选)
只要把这些线一一连好,你就完成了80%的工作。
软件准备:两个库搞定一切
打开Arduino IDE,安装以下两个库:
Adafruit GFX Library
→ 提供基础绘图能力:画线、矩形、文字、颜色等。Adafruit ST7735 and ST7789 Library
→ 专门驱动ST7735/ST7789系列屏幕。
可以通过库管理器搜索安装,也可以手动下载导入。
然后写入这段代码试试看:
#include <Adafruit_GFX.h> #include <Adafruit_ST7735.h> #include <SPI.h> #define TFT_CS 10 #define TFT_DC 8 #define TFT_RST 9 // 创建对象(使用硬件SPI) Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST); void setup() { tft.initR(INITR_BLACKTAB); // 根据屏幕类型选择初始化模式 tft.setRotation(1); // 旋转方向,试试0~3看看哪个正 tft.fillScreen(ST77XX_BLACK); // 清屏 tft.setCursor(0, 0); tft.setTextColor(ST77XX_WHITE); tft.setTextSize(2); tft.println("Hello!"); } void loop() { }烧录进去,如果一切正常,你会看到屏幕上出现白色大字:“Hello!”。
初始化为何总失败?关键在这三个细节
很多人的屏幕点不亮,并不是接错了线,而是栽在了这三个地方:
1.initR()参数选错了
最常见的错误就是用了错误的初始化模板。
ST7735有不同的版本,主要区别在于出厂时烧录的初始化参数不同。Adafruit库为此提供了几个预设宏:
INITR_BLACKTAB:黑底板,背面标签是黑色的(最常见)INITR_GREENTAB:绿底板,早期版本INITR_REDTAB:红底板,某些克隆模块
如果你用了黑板却调用INITR_GREENTAB,很可能导致白屏或雪花屏。
📌建议做法:都试一遍!把initR()改成不同参数跑一次,看哪个能正常显示。
2. SPI速度太快
默认情况下,Adafruit库会以8MHz运行SPI。但对于质量一般的杜邦线或长导线来说,这个速度太高了,容易出错。
可以在构造函数后手动降频:
tft.setSPISpeed(4000000); // 设为4MHz或者修改库源码中的默认值,确保通信稳定。
3. 供电不足
别小看这块小屏,背光一亮起来电流可能超过100mA。如果你用USB供电的Nano,加上传感器一堆外设,电压一跌,屏幕就罢工。
✅ 解决方案:
- 使用外部电源给VCC单独供电;
- 或者将BLK脚通过三极管/P-MOSFET由外部电源控制;
- 实在不行,先把BLK直接接3.3V测试。
屏幕方向不对?坐标系旋转全解析
你会发现调用setRotation(0)到3后,显示内容会顺时针旋转90度。
这是因为在底层,ST7735允许我们重新映射GRAM的扫描方向。比如你想让屏幕竖着放还是横着放,就靠这个设置。
| 参数 | 显示方向 | 实际宽高 |
|---|---|---|
| 0 | 默认 | 128x160 |
| 1 | 顺时针转90° | 160x128 |
| 2 | 180°翻转 | 128x160 |
| 3 | 逆时针90° | 160x128 |
举个例子:你想做一个横向仪表盘,那就用setRotation(1),此时宽度变成160像素,更适合布局。
同时记得用tft.width()和tft.height()动态获取当前有效尺寸,不要硬编码128和160!
颜色怎么表示?RGB565才是真标准
你可能会看到这样的代码:
tft.drawPixel(x, y, tft.color565(255, 0, 0)); // 红色这里的关键是color565(r, g, b)函数。它把8位RGB转换成16位RGB565格式。
什么意思?
- R占5位 → 0~31
- G占6位 → 0~63(人眼更敏感,多一位)
- B占5位 → 0~31
所以真正的红色是(31, 0, 0),但在API中你仍然传入0~255范围的值,库会自动缩放。
常见颜色可以直接用宏:
-ST77XX_RED
-ST77XX_GREEN
-ST77XX_BLUE
-ST77XX_WHITE
-ST77XX_BLACK
但自定义渐变、HSV动画时,一定要用color565()才能获得精确控制。
刷屏太慢?学会局部刷新技巧
全屏重绘一次要多久?按128×160×2字节 ≈ 40KB数据量算,在8MHz SPI下大约需要50ms以上。也就是说,帧率很难超过20fps。
怎么办?别每次都刷全屏!
👉 正确做法:
- 只更新变化区域;
- 比如一个数字计数器,只擦除旧数字位置再重绘;
- 使用fillRect()先填黑,再写新文本;
- 对动态图标使用双缓冲思想(虽然内存有限,但可分块处理)。
示例:只刷新中间一个小区域
// 清除旧值区域 tft.fillRect(50, 60, 80, 20, ST77XX_BLACK); // 写入新值 tft.setCursor(50, 60); tft.print(millis() / 1000);这样比fillScreen()快得多。
背光可以调吗?当然!PWM轻松搞定
多数模块都有一个叫BLK或LED的引脚,其实就是背光的阳极控制端。
怎么调节亮度?
把它接到Arduino的一个PWM引脚(比如D3、D5、D6),然后这样控制:
analogWrite(BLK_PIN, brightness); // brightness: 0~255注意:
- BLK通常是高电平有效,所以接PWM时要用N-MOSFET或NPN三极管驱动;
- 或者直接买带背光控制电路的模块;
- 如果模块已集成限流电阻,可尝试直接接PWM(但小心电流过大)。
夜间自动调暗?完全可以结合光敏电阻实现!
进阶玩法:不只是“打印文字”
一旦你能稳定驱动这块屏,接下来就可以玩些有意思的了:
✅ 实时波形图
读取ADC数据,用drawLine()连续绘制,模拟示波器效果。
✅ 图标菜单系统
用二维数组存储图标位图,配合按键实现上下选择菜单。
✅ 加载SD卡图片
配合microSD插槽,加载.bmp文件显示静态图像(Adafruit库支持BMP解码)。
✅ 触摸屏扩展
虽然原生ST7735不带触摸,但市面上很多模块集成了XPT2046电阻屏控制器,可通过SPI读取触控坐标。
这些都不是遥不可及的功能,只要你掌握了基础通信机制。
最后提醒:那些没人告诉你但很重要的事
别用面包板太久
杜邦线接触不良是最大杀手。调试阶段可以用,定型后务必焊接或使用排针加固。检查模块是否真的ST7735
有些廉价模块其实是SSD1351或其他兼容芯片,冒充ST7735。如果死活不通,可能是芯片型号不符。关注GRAM地址窗口设置
所有绘图操作本质都是向GRAM写数据。CASET(列地址)和RASET(行地址)决定了你在哪块区域写。库已经封装好了,但了解原理有助于排查偏移问题。内存紧张别贪大字体
Arduino Uno只有2KB SRAM。加载大字体(如Font 4+)可能导致程序崩溃。优先使用精简字体或自定义小字号。善用逻辑分析仪
如果通信异常,拿个几块钱的CH554开发板当逻辑分析仪,抓一下SCLK和MOSI波形,立刻看出是否有数据发出。
结语:点亮第一屏的意义
当你第一次看到那句“Hello ST7735!”出现在彩色小屏上时,那种成就感是难以言喻的。这不仅是技术的突破,更是创造力的释放起点。
从这一刻起,你不再只是控制LED闪烁的初学者,而是开始构建真正的人机交互界面。
而这一切,只需要一块十几元的屏幕、几根导线、一个开源库,以及一点点耐心。
如果你正在尝试接入ST7735却卡住了,不妨回头看看:
- 引脚接对了吗?
- 初始化参数匹配吗?
- 供电稳定吗?
往往答案就在其中。
如果你觉得这篇文章帮到了你,欢迎点赞分享;如果有具体问题,也欢迎在评论区留言,我们一起解决每一个“白屏”的夜晚。