WeMOS D1 MIni(Esp8266)、NodeMCU与ST7789 TFT液晶显示屏绘制图形

17 篇文章 6 订阅
2 篇文章 0 订阅

材料

  • Wemos D1 Mini/NodeMCU(ESP8266)开发板 一块 (约9元)
  • ST7789 TFT 240*240显示屏一块
  • 10cm杜邦线若干(约1元)
  • 安卓数据线一条(务必是数据线,便宜的安卓电源线不行)

硬件连接图

WemosD1Mini/NanoST7789
D0RES
D1DC
3V3VCC
GNDGND
D5SCL
D7SDA

Arduino IDE支持Wemos D1 Mini、

  1. 点击“文件”选则“首选项。
    在这里插入图片描述
  2. 添加Wemos D1 Mini开发板的josn文件
  • 弹出的首选项中点击下图所示的按钮打开开发板管理器页面
    在这里插入图片描述
  • 将”http://arduino.esp8266.com/stable/package_esp8266com_index.json“复制到弹出的页面中,(Arduino IDE自带的开发板并不多。如果想要扩展它支持其他的开发板只需要用这个方式再管理器中进行添加就好。粘贴好后,点击”好“
    经过上一步后,再返回的首选相页面点击再次点击”好“进行确认。
    在这里插入图片描述
  1. 在开发板管理器中添加开发板
    如下图所示一次点开:”工具”->“开发板xxxx”->"开发板管理器“在这里插入图片描述
    在弹出的页面搜索栏中输入”esp“后,稍等下,下面就会列出相关的开发板。按照下图所示的方法,点击”安装“进行该类开发板的安装。
    在这里插入图片描述

库安装

Arduino_ST7789.h库安装

  1. 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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值