使用DOIT ESP32 DEVKIT V1驱动屏幕ST7789的踩坑之旅

参考资料:
pass
目标:
使用DOIT ESP32 DEVKIT V1,通过驱动TFT_eSPI,点亮屏幕ST7789
关键词:
Arduino,ESP32,DOIT ESP32 DEVKIT V1,ST7789,240*240,TFT_eSPI,ILI9341

前言

最近开始研究单片机,从最简单的Arduino开始
最终目标是自己整一块码表,想着就先点亮屏幕
但实际发现ESP32系列非常混乱,除了芯片大家都叫ESP32以外,底板种类非常多
常见的有30针脚(Pin)和36pin,还有ESP32CAM这种异形规格的
这使得与屏幕连接(SPI协议)产生不少坑,本文将会分析一下自己过程中踩过的坑
本文主要使用DOIT ESP32 DEVKIT V1(后文略称doit),通过TFT_eSPI(后文略称TFT)来驱动屏幕ST7789
Adafruit ST7789/ST7735也使用过,只用于和ESP8266连接(doit失败了)
并且TFT是兼容了Adafruit的,因此略过Adafruit的驱动

码表测试中...

目录

  1. 弄清自己的ESP32是什么底板,知道引脚有哪些
  2. 配置TFT的配置文件User_Setup.h
  3. 使用TFT提供的示例来点亮屏幕

1. ESP32底板的区别

ESP32只是指中间的芯片是ESP32
而下图则是doit的底板,只是其中一种底板和芯片连接的方式(30pin)

本文主要介绍的也是该底板

另外还有这种36Pin的(不在本文讨论范围)

或者ESP32CAM(不在讨论范围)


引脚的不同就会导致其所包含的功能也不同
比如这张图,包含了doit底板各个引脚的所带的功能,所以连接引脚前务必要找到此类引脚说明(可以问卖家要)


注意其中的GPIO 23 22 21 19 18 5 也就是青色的这块

略微普及一下,两台微型机(mcu和屏幕)连接,必须要走协议,就像人和人说话要选择语言
I2C和SPI都是协议之一(本文主要介绍SPI)
而使用协议之前必须要选择正确的引脚,这到现在为止一直让你关注引脚的原因
上图的MOSI SCL等都是每个引脚负责的功能
MOSI即主出从进(mast out slave in),SCL串行时钟,SDA串行数据线,如果一点点都不知道该知识的建议搜索此类的文章

常见的SPI的连接方式

再来看GMT130 ST7789屏幕上的引脚


GMT130 240*240P的屏幕

把屏幕上的针脚按名称接上esp32上所对应的针脚

百分百是可以点亮屏幕的

而且只需要关注其中2个引脚的连接方式

ESP32 屏幕
23或21 MOSI/SDA(SPI协议可以随便选1个,I2C可能需要选择SDA引脚)
22或18 SCL/SCK


剩下的RES DC BLK 引脚理论上可以随便插
但在doit的底板上需要避开GPIO2(2针脚同时控制了蓝灯,会有bug)和RX TX引脚
分享下我的doit与GMT130(ST7789驱动)的引脚连接组合

// TFT的官方配置
#define TFT_MOSI 15 // In some display driver board, it might be written as "SDA" and so on.
#define TFT_SCLK 14
#define TFT_CS   5  // Chip select control pin
#define TFT_DC   27  // Data Command control pin
#define TFT_RST  33  // Reset pin (could connect to Arduino RESET pin)
#define TFT_BL   22  // LED back-light

//我的配置1,完全按照引脚图来配置
#define TFT_MOSI 21 
#define TFT_SCLK 22
#define TFT_DC   4  
#define TFT_RST  23  
//#define TFT_CS   34  // GMT130没有CS引脚
//#define TFT_BL   35  // 背光不需要设置

//我的配置2,根据官方使用修改而来
#define TFT_MOSI 5   //官方使用15,对应HSPI CS0引脚,我使用VSPI CS0,其中V指virtual
#define TFT_SCLK 18  //官方使用14,对应HSPI CLK,我是用VSPI CLK
#define TFT_DC   4  
#define TFT_RST  22  
//#define TFT_CS   34  // GMT130没有CS引脚
//#define TFT_BL   35  // 背光不需要设置

最后再来看个反面案例: Arduino_GFX驱动2.4'SPI串口240x320TFT彩屏(ST7789)

引用原文:
TFT屏型号GMT024-8p10p-SPI VER1.1
金逸晨的,2.4寸,分辨率240x320,参数还不错,淘宝价23.5元
试了TFT_eSPI.h,发现无法正常使用,所以又找了一个库
...

其实TFT是可以驱动的,此人可能没有熟读TFT的配置文件


image.png

点不亮的主要原因可能是GMT024有点奇葩

  1. 是它的BL必须接高电平
  2. CS(chip select)片选引脚必须接,而且可能只能接GPIO5和15.因为doit的引脚规定了


2. 配置TFT_eSPI

2.1 先下载TFT_eSPI的库

2.2 配置文件

只有1个文件需要配置,即User_Setup.h,强烈建议先复制一份备份

image.png

眼尖的可以发现,我按照屏幕的不同,使用不同的配置文件,这是可以在User_Setup_Select.h中进行配置的
只启用需要的配置文件

然后开始配置,作者分了4个Section

2.2.1 选择屏幕的驱动和屏幕尺寸

TFT基本涵盖了大部分的屏幕驱动,如果你不知道自己的屏幕驱动是什么

问卖家!

这里我们启用ST7789,如果点不亮就换个_2

再选择屏幕尺寸


2.2.2 定义针脚

第一段费这么大力气就是为了让读者理解定义针脚的重要性


2.2.3 定义启用的字体

没特别的需求就别动配置,关掉某些字体可以节省存储空间
另外自定义字体还没研究,以后可能会研究下(我觉得中文输出又麻烦又碍事,英文又不是看不懂没必要把时间花这上面)


2.2.4 其他选项

主要是控制SPI协议的频率,没事别动


3. 点亮屏幕

在Arduino编辑器里面随便找个案例就行了
方便起见可以选择一个偏小的160x128的案例, 因为显示的内容都在240x240的范围内


image.png

这里我选择了乒乓球的案例,并且屏幕正常点亮
如果你的屏幕没点亮,请检查接线,大概率是接错了
其他TFT的方法函数不再赘述,官方的案例非常多,想画图形,显示图片都有相应的函数方法提供
实在不知道怎么办请提issue,我也是通过issue解决问题的


假装这是GMT130的好了,我不想重接线了...

4. 其他注意事项

4.1 显示方向

如果你屏幕显示方向不对需要在setup函数中修改tft.setRotation(1); //参数0 1 2 3 四个方向

4.2 红绿显示色相反

如果你明明选择红色却打印了绿色,比如

tft.setTextColor(TFT_RED);    //设置了字体是红色
tft.drawString("hello world",0,0);  //实际打印了绿色

需要修改"User_Setup.h"中的此处

image.png

4.3 黑白相反

打印了白色却显示黑色,则修改此处(去掉其中一个注释)


image.png

4.4 所谓2.4寸 ST7789 240*320屏幕的坑

即刚才演示的那块屏幕
淘宝把它的驱动标记为ST7789V或ST7789,你用ST7789是驱动不了它的


image.png

实际上它的驱动是ILI9341


image.png

同时你可以在"User_Setup.h"中找到
如果你还购买的是金逸晨的屏幕,则大概率要选择_2驱动,不然会花屏

如果有问题可以留言,关于TFT使用的问题请去github提issue,官方回复非常快

--全文完--

你可能感兴趣的:(使用DOIT ESP32 DEVKIT V1驱动屏幕ST7789的踩坑之旅)