WeMOS D1 MIni(Esp8266)、NodeMCU与ST7789 TFT液晶显示屏绘制图形
材料
- Wemos D1 Mini/NodeMCU(ESP8266)开发板 一块 (约9元)
- ST7789 TFT 240*240显示屏一块
- 10cm杜邦线若干(约1元)
- 安卓数据线一条(务必是数据线,便宜的安卓电源线不行)
硬件连接图
WemosD1Mini/Nano | ST7789 |
---|---|
D0 | RES |
D1 | DC |
3V3 | VCC |
GND | GND |
D5 | SCL |
D7 | SDA |
Arduino IDE支持Wemos D1 Mini、
- 点击“文件”选则“首选项。
- 添加Wemos D1 Mini开发板的josn文件
- 弹出的首选项中点击下图所示的按钮打开开发板管理器页面
- 将”http://arduino.esp8266.com/stable/package_esp8266com_index.json“复制到弹出的页面中,(Arduino IDE自带的开发板并不多。如果想要扩展它支持其他的开发板只需要用这个方式再管理器中进行添加就好。粘贴好后,点击”好“
经过上一步后,再返回的首选相页面点击再次点击”好“进行确认。
- 在开发板管理器中添加开发板
如下图所示一次点开:”工具”->“开发板xxxx”->"开发板管理器“
在弹出的页面搜索栏中输入”esp“后,稍等下,下面就会列出相关的开发板。按照下图所示的方法,点击”安装“进行该类开发板的安装。
库安装
Arduino_ST7789.h库安装
- github下载地址
打开上面的地址按照下图方式下载库的zip包文件。
将刚刚的zip文件解压到放到ArduinoIDE安装文件所在目录下的libraries文件夹。重启ArduinoIDE没有报错就表示安装成功了。
Adafruit-GFX-Library库安装
这是一个图形库,提供方法让你绘制更丰富的显示内容。安装地址如下:https://github.com/adafruit/Adafruit-GFX-Library方法同上
Adafruit_BusIO库安装
Adafruit-GFX-Library库文件依赖另外一个叫Adafruit_BusIO的库,所以需要安装下,安装地址如下:
https://github.com/adafruit/Adafruit_BusIO
安装方法同上。
效果测试
测试代码
Arduino_ST7789库自带的例程进行的修建,改成了单一支持240*240像素,无cs线的版本。方便入门者测试。
/***************************************************
This is a library for the ST7789 IPS SPI display.
Originally written by Limor Fried/Ladyada for
Adafruit Industries.
Modified by Ananev Ilia
happyjoey217 Modified special for Esp8266 vs 1.3’’TFT 2020.1.21
****************************************************/
#include <Adafruit_GFX.h> // 图形库
#include <Arduino_ST7789.h> // Hardware-specific library for ST7789 (with or without CS pin)
#include <SPI.h>
#define TFT_DC D1 // 用户自定义
#define TFT_RST D0 // 用户自定义
#define TFT_MOSI D7 // WemosD1Mini的Mosi引脚
#define TFT_SCLK D5 // WemosD1Mini的Sclk引脚
Arduino_ST7789 tft = Arduino_ST7789(TFT_DC, TFT_RST);
float p = 3.1415926;
void setup(void) {
Serial.begin(9600);
Serial.print("Hello! ST7789 TFT Test");
tft.init(240, 240); // initialize a ST7789 chip, 240x240 pixels
Serial.println("Initialized");
uint16_t time = millis();
tft.fillScreen(BLACK);
time = millis() - time;
Serial.println(time, DEC);
delay(500);
// large block of text
tft.fillScreen(BLACK);
//屏幕中添加文字并设置演示
testdrawtext("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur adipiscing ante sed nibh tincidunt feugiat. Maecenas enim massa, fringilla sed malesuada et, malesuada sit amet turpis. Sed porttitor neque ut ante pretium vitae malesuada nunc bibendum. Nullam aliquet ultrices massa eu hendrerit. Ut sed nisi lorem. In vestibulum purus a tortor imperdiet posuere. ", WHITE);
delay(1000);
// tft print function
tftPrintTest();
delay(4000);
// a single pixel
tft.drawPixel(tft.width()/2, tft.height()/2, GREEN);
delay(500);
// line draw test
testlines(YELLOW);
delay(500);
// optimized lines
testfastlines(RED, BLUE);
delay(500);
testdrawrects(GREEN);
delay(500);
testfillrects(YELLOW, MAGENTA);
delay(500);
tft.fillScreen(BLACK);
testfillcircles(10, BLUE);
testdrawcircles(10, WHITE);
delay(500);
testroundrects();
delay(500);
testtriangles();
delay(500);
mediabuttons();
delay(500);
Serial.println("done");
delay(1000);
}
void loop() {
tft.invertDisplay(true);
delay(500);
tft.invertDisplay(false);
delay(500);
}
void testlines(uint16_t color) {
tft.fillScreen(BLACK);
for (int16_t x=0; x < tft.width(); x+=6) {
tft.drawLine(0, 0, x, tft.height()-1, color);
}
for (int16_t y=0; y < tft.height(); y+=6) {
tft.drawLine(0, 0, tft.width()-1, y, color);
}
tft.fillScreen(BLACK);
for (int16_t x=0; x < tft.width(); x+=6) {
tft.drawLine(tft.width()-1, 0, x, tft.height()-1, color);
}
for (int16_t y=0; y < tft.height(); y+=6) {
tft.drawLine(tft.width()-1, 0, 0, y, color);
}
tft.fillScreen(BLACK);
for (int16_t x=0; x < tft.width(); x+=6) {
tft.drawLine(0, tft.height()-1, x, 0, color);
}
for (int16_t y=0; y < tft.height(); y+=6) {
tft.drawLine(0, tft.height()-1, tft.width()-1, y, color);
}
tft.fillScreen(BLACK);
for (int16_t x=0; x < tft.width(); x+=6) {
tft.drawLine(tft.width()-1, tft.height()-1, x, 0, color);
}
for (int16_t y=0; y < tft.height(); y+=6) {
tft.drawLine(tft.width()-1, tft.height()-1, 0, y, color);
}
}
void testdrawtext(char *text, uint16_t color) {
tft.setCursor(0, 0);
tft.setTextColor(color);
tft.setTextWrap(true);
tft.print(text);
}
void testfastlines(uint16_t color1, uint16_t color2) {
tft.fillScreen(BLACK);
for (int16_t y=0; y < tft.height(); y+=5) {
tft.drawFastHLine(0, y, tft.width(), color1);
}
for (int16_t x=0; x < tft.width(); x+=5) {
tft.drawFastVLine(x, 0, tft.height(), color2);
}
}
void testdrawrects(uint16_t color) {
tft.fillScreen(BLACK);
for (int16_t x=0; x < tft.width(); x+=6) {
tft.drawRect(tft.width()/2 -x/2, tft.height()/2 -x/2 , x, x, color);
}
}
void testfillrects(uint16_t color1, uint16_t color2) {
tft.fillScreen(BLACK);
for (int16_t x=tft.width()-1; x > 6; x-=6) {
tft.fillRect(tft.width()/2 -x/2, tft.height()/2 -x/2 , x, x, color1);
tft.drawRect(tft.width()/2 -x/2, tft.height()/2 -x/2 , x, x, color2);
}
}
void testfillcircles(uint8_t radius, uint16_t color) {
for (int16_t x=radius; x < tft.width(); x+=radius*2) {
for (int16_t y=radius; y < tft.height(); y+=radius*2) {
tft.fillCircle(x, y, radius, color);
}
}
}
void testdrawcircles(uint8_t radius, uint16_t color) {
for (int16_t x=0; x < tft.width()+radius; x+=radius*2) {
for (int16_t y=0; y < tft.height()+radius; y+=radius*2) {
tft.drawCircle(x, y, radius, color);
}
}
}
void testtriangles() {
tft.fillScreen(BLACK);
int color = 0xF800;
int t;
int w = tft.width()/2;
int x = tft.height()-1;
int y = 0;
int z = tft.width();
for(t = 0 ; t <= 15; t++) {
tft.drawTriangle(w, y, y, x, z, x, color);
x-=4;
y+=4;
z-=4;
color+=100;
}
}
void testroundrects() {
tft.fillScreen(BLACK);
int color = 100;
int i;
int t;
for(t = 0 ; t <= 4; t+=1) {
int x = 0;
int y = 0;
int w = tft.width()-2;
int h = tft.height()-2;
for(i = 0 ; i <= 16; i+=1) {
tft.drawRoundRect(x, y, w, h, 5, color);
x+=2;
y+=3;
w-=4;
h-=6;
color+=1100;
}
color+=100;
}
}
void tftPrintTest() {
tft.setTextWrap(false);
tft.fillScreen(BLACK);
tft.setCursor(0, 30);
tft.setTextColor(RED);
tft.setTextSize(1);
tft.println("Hello World!");
tft.setTextColor(YELLOW);
tft.setTextSize(2);
tft.println("Hello World!");
tft.setTextColor(GREEN);
tft.setTextSize(3);
tft.println("Hello World!");
tft.setTextColor(BLUE);
tft.setTextSize(4);
tft.print(1234.567);
delay(1500);
tft.setCursor(0, 0);
tft.fillScreen(BLACK);
tft.setTextColor(WHITE);
tft.setTextSize(0);
tft.println("Hello World!");
tft.setTextSize(1);
tft.setTextColor(GREEN);
tft.print(p, 6);
tft.println(" Want pi?");
tft.println(" ");
tft.print(8675309, HEX); // print 8,675,309 out in HEX!
tft.println(" Print HEX!");
tft.println(" ");
tft.setTextColor(WHITE);
tft.println("Sketch has been");
tft.println("running for: ");
tft.setTextColor(MAGENTA);
tft.print(millis() / 1000);
tft.setTextColor(WHITE);
tft.print(" seconds.");
}
void mediabuttons() {
// play
tft.fillScreen(BLACK);
tft.fillRoundRect(25, 10, 78, 60, 8, WHITE);
tft.fillTriangle(42, 20, 42, 60, 90, 40, RED);
delay(500);
// pause
tft.fillRoundRect(25, 90, 78, 60, 8, WHITE);
tft.fillRoundRect(39, 98, 20, 45, 5, GREEN);
tft.fillRoundRect(69, 98, 20, 45, 5, GREEN);
delay(500);
// play color
tft.fillTriangle(42, 20, 42, 60, 90, 40, BLUE);
delay(50);
// pause color
tft.fillRoundRect(39, 98, 20, 45, 5, RED);
tft.fillRoundRect(69, 98, 20, 45, 5, RED);
// play color
tft.fillTriangle(42, 20, 42, 60, 90, 40, GREEN);
}
效果图
彩蛋
全都完成后才发现另外一个库叫TFT_eSPI,据说比Arduino_ST7789速度快易用。。哈哈哈 下一篇写这个吧,另外想做一个模仿人脸表情的动画和百度语音接口配合使用。应该挺有趣吧。
参考文献
【1】arduinoUno和屏的调试,提供了st7789库和图形库 https://simple-circuit.com/arduino-st7789-ips-tft-display-example/
【2】Github的库 https://github.com/adafruit/Adafruit-ST7735-Library、
【3】Github的图形库 https://github.com/adafruit/Adafruit-GFX-Library
【4】nodeMCU or Arduino Nano和ST7789控制芯片的TFT液晶
https://thesolaruniverse.wordpress.com/2019/12/24/connecting-a-240x240-tft-display-with-st7789-controller-with-a-nodemcu-esp8266-or-an-arduino-nano/
【5】T-Watch. Getting started with the TFT_eSPI library. Display text, shapes, touch detection
https://diyprojects.io/ttgo-t-watch-get-started-esp32-tft_espi-library/#.YAmHiegzZPY
【6】tft_espi库的讲解视频
https://www.youtube.com/watch?v=HoZhgNcJjNA
【7】tft_espi库的github地址: https://github.com/Bodmer/TFT_eSPI
【8】16M AVR版的极速版 st7789库 https://github.com/cbm80amiga/Arduino_ST7789_Fast
【9】硬件监视代码 https://github.com/cbm80amiga/ST7789_HWMonitor
【10】Pi zero + 1.3inch LCD movie Player https://www.youtube.com/watch?v=gyvl_FI8kAg