合宙ESP32C3点亮ST7735s屏幕-Arduino中文社区 - Powered by Discuz! Archiver

topdog 发表于 2022-4-3 23:32

合宙ESP32C3点亮ST7735s屏幕

本帖最后由 topdog 于 2022-7-31 13:56 编辑

1,合宙ESP32C3开发板管脚定义图:



2,合宙ST7735s屏幕管脚定义图:





3,Arduino IDE 工具-->开发板-->flash配置DIO模式



4,
安装Adafruit-GFX-Library库

安装Adafruit-ST7735-Library库

5.程序如下:

ESP32C3的GPIO11(VDD_SPI)默认功能是给flash供电,我们完全可以使用外部3.3v给flash供电,将此IO用作通用io,以下是操作流程,注意以下的操作只能执行一次,更改后不能复原。

#include <Adafruit_GFX.h>    // https://github.com/adafruit/Adafruit-GFX-Library
#include <Adafruit_ST7735.h> // https://github.com/adafruit/Adafruit-ST7735-Library
#include <SPI.h>

const int TFT_CS = 7;
const int TFT_DC = 6;
const int TFT_MOSI = 3;
const int TFT_SCLK = 2;
const int TFT_RST = 10;
const int TFT_BACKLIGHT = 11;

Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);

float p = 3.1415926;

void setup(void) {
Serial.begin(9600);
Serial.print(F("Hello! ST77xx TFT Test"));
// 点亮背光灯
// pinMode(TFT_BACKLIGHT, OUTPUT);
// digitalWrite(TFT_BACKLIGHT, LOW);

//初始化方法之一
//tft.initR(INITR_BLACKTAB);      // Init ST7735S chip, black tab

// 初始化 0.96" 160x80 TFT 的方法
tft.initR(INITR_MINI160x80);// Init ST7735S mini display

//设置SPI的频率
tft.setSPISpeed(40000000);


tft.setRotation(1);

Serial.println(F("Initialized"));

uint16_t time = millis();
tft.fillScreen(ST77XX_BLACK);
time = millis() - time;

Serial.println(time, DEC);
delay(500);

}

void loop() {
// large block of text
tft.fillScreen(ST77XX_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. ", ST77XX_WHITE);
delay(1000);

// tft print function!
tftPrintTest();
delay(4000);

// a single pixel
tft.drawPixel(tft.width() / 2, tft.height() / 2, ST77XX_GREEN);
delay(500);

// line draw test
testlines(ST77XX_YELLOW);
delay(500);

// optimized lines
testfastlines(ST77XX_RED, ST77XX_BLUE);
delay(500);

testdrawrects(ST77XX_GREEN);
delay(500);

testfillrects(ST77XX_YELLOW, ST77XX_MAGENTA);
delay(500);

tft.fillScreen(ST77XX_BLACK);
testfillcircles(10, ST77XX_BLUE);
testdrawcircles(10, ST77XX_WHITE);
delay(500);

testroundrects();
delay(500);

testtriangles();
delay(500);

mediabuttons();
delay(500);

Serial.println("done");
delay(1000);

tft.invertDisplay(true);
delay(500);
tft.invertDisplay(false);
delay(500);
}

void testlines(uint16_t color) {
tft.fillScreen(ST77XX_BLACK);
for (int16_t x = 0; x < tft.width(); x += 6) {
    tft.drawLine(0, 0, x, tft.height() - 1, color);
    delay(0);
}
for (int16_t y = 0; y < tft.height(); y += 6) {
    tft.drawLine(0, 0, tft.width() - 1, y, color);
    delay(0);
}

tft.fillScreen(ST77XX_BLACK);
for (int16_t x = 0; x < tft.width(); x += 6) {
    tft.drawLine(tft.width() - 1, 0, x, tft.height() - 1, color);
    delay(0);
}
for (int16_t y = 0; y < tft.height(); y += 6) {
    tft.drawLine(tft.width() - 1, 0, 0, y, color);
    delay(0);
}

tft.fillScreen(ST77XX_BLACK);
for (int16_t x = 0; x < tft.width(); x += 6) {
    tft.drawLine(0, tft.height() - 1, x, 0, color);
    delay(0);
}
for (int16_t y = 0; y < tft.height(); y += 6) {
    tft.drawLine(0, tft.height() - 1, tft.width() - 1, y, color);
    delay(0);
}

tft.fillScreen(ST77XX_BLACK);
for (int16_t x = 0; x < tft.width(); x += 6) {
    tft.drawLine(tft.width() - 1, tft.height() - 1, x, 0, color);
    delay(0);
}
for (int16_t y = 0; y < tft.height(); y += 6) {
    tft.drawLine(tft.width() - 1, tft.height() - 1, 0, y, color);
    delay(0);
}
}

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(ST77XX_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(ST77XX_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(ST77XX_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(ST77XX_BLACK);
uint16_t 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(ST77XX_BLACK);
uint16_t 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(ST77XX_BLACK);
tft.setCursor(0, 0);
tft.setTextColor(ST77XX_RED);
tft.setTextSize(1);
tft.println("Hello World!");
tft.setTextColor(ST77XX_YELLOW);
tft.setTextSize(2);
tft.println("Hello World!");
tft.setTextColor(ST77XX_GREEN);
tft.setTextSize(3);
tft.println("Hello World!");
tft.setTextColor(ST77XX_BLUE);
tft.setTextSize(4);
tft.print(1234.567);
delay(1500);
tft.setCursor(0, 0);
tft.fillScreen(ST77XX_BLACK);
tft.setTextColor(ST77XX_WHITE);
tft.setTextSize(0);
tft.println("Hello World!");
tft.setTextSize(1);
tft.setTextColor(ST77XX_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(ST77XX_WHITE);
tft.println("Sketch has been");
tft.println("running for: ");
tft.setTextColor(ST77XX_MAGENTA);
tft.print(millis() / 1000);
tft.setTextColor(ST77XX_WHITE);
tft.print(" seconds.");
}

void mediabuttons() {
// play
tft.fillScreen(ST77XX_BLACK);
tft.fillRoundRect(25, 10, 78, 60, 8, ST77XX_WHITE);
tft.fillTriangle(42, 20, 42, 60, 90, 40, ST77XX_RED);
delay(500);
// pause
tft.fillRoundRect(25, 90, 78, 60, 8, ST77XX_WHITE);
tft.fillRoundRect(39, 98, 20, 45, 5, ST77XX_GREEN);
tft.fillRoundRect(69, 98, 20, 45, 5, ST77XX_GREEN);
delay(500);
// play color
tft.fillTriangle(42, 20, 42, 60, 90, 40, ST77XX_BLUE);
delay(50);
// pause color
tft.fillRoundRect(39, 98, 20, 45, 5, ST77XX_RED);
tft.fillRoundRect(69, 98, 20, 45, 5, ST77XX_RED);
// play color
tft.fillTriangle(42, 20, 42, 60, 90, 40, ST77XX_GREEN);
}

6,实测合宙esp32 c3 IIC 管脚:SDA = 8SCL = 9




7,实测合宙esp32 c3 板载两个LED D4和D5 管脚:D4 = GPIO12D5 = GPIO13

imhm 发表于 2022-4-4 09:07

大好,刚买了这个套餐 。。。

liangfengxiao 发表于 2022-4-7 10:50

新手刚学习 按楼主操作后 报错 是Adafruit_I2CDevice.h找不到 安装库Adafruit_BusIO即可成功编译

topdog 发表于 2022-4-7 20:14

本帖最后由 topdog 于 2022-4-7 20:20 编辑

liangfengxiao 发表于 2022-4-7 10:50
新手刚学习 按楼主操作后 报错 是Adafruit_I2CDevice.h找不到 安装库Adafruit_BusIO即可成功编译 ...
You will also need to install the latest Adafruit BusIO library. Search for "Adafruit BusIO" in the library manager, or install by hand from https://github.com/adafruit/Adafruit_BusIO

祝贺你成功了!

liangfengxiao 发表于 2022-4-8 09:53

topdog 发表于 2022-4-7 20:14
You will also need to install the latest Adafruit BusIO library. Search for "Adafruit BusIO" in the ...

大佬,我使用TFT_eSPI 驱动不起来是什么问题 下面是我 user_setup的定义
#define ST7735_DRIVER      // Define additional parameters below for this display
#define TFT_RGB_ORDER TFT_BGR// Colour order Blue-Green-Red
#define TFT_MOSI 3
#define TFT_SCLK 2
#define TFT_CS7// Chip select control pin
#define TFT_DC 6// Data Command control pin
#define TFT_RST 10// Reset pin (could connect to RST pin)
#define TFT_BL11
#define LOAD_GLCD   // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH
#define LOAD_FONT2// Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters
#define LOAD_FONT4// Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters
#define LOAD_FONT6// Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm
#define LOAD_FONT7// Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:-.
#define LOAD_FONT8// Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-.
//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT
#define LOAD_GFXFF// FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts

// Comment out the #define below to stop the SPIFFS filing system and smooth font code being loaded
// this will save ~20kbytes of FLASH
#define SMOOTH_FONT
#define SPI_FREQUENCY40000000
#define SPI_READ_FREQUENCY20000000
#define SPI_TOUCH_FREQUENCY2500000

topdog 发表于 2022-4-11 13:10

liangfengxiao 发表于 2022-4-8 09:53
大佬,我使用TFT_eSPI 驱动不起来是什么问题 下面是我 user_setup的定义
#define ST7735_DRIVER      //...

https://github.com/Bodmer/TFT_eSPI

#ESP32和ESP32- s2 (ESP32C3未测试)
ESP32 and ESP32-S2 (ESP32C3 untested)

#支持“四线制”SPI和8位并行接口。由于缺乏GPIO引脚,8位并行接口不支持在ESP8266。
"Four wire" SPI and 8 bit parallel interfaces are supported. Due to lack of GPIO pins the 8 bit parallel interface is NOT supported on the ESP8266.

imhm 发表于 2022-4-17 12:56

tft.setRotation(1);          //设置屏幕横向显示

:loveliness:

topdog 发表于 2022-4-17 15:12

imhm 发表于 2022-4-17 12:56
tft.setRotation(1);          //设置屏幕横向显示

谢谢你,修改好了。

eagler8 发表于 2022-7-4 06:51

:handshake谢谢斑竹,学习了

Do_Tonight 发表于 2022-7-7 12:06

楼主感谢,终于能用了
页: [1] 2
查看完整版本: 合宙ESP32C3点亮ST7735s屏幕