LilyGo [H717] T-Display S3 AMOLEDのArduino　テンプレート

# はじめに
個人用のテンプレートです
LilyGo　[H717]T-DisplayをArduinoで使うためのテンプレートです。

AMO Displayなのできれいです。（視野角が広い）
あとは、タッチパネルがあるだけのシンプルなマイコンです。
Qwiic端子は1つとUART版が1つの計2つです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/682d72bf-93c1-044e-4799-cd317633a6ac.png)

# リンク等
https://lilygo.cc/products/t-display-s3-amoled

https://github.com/Xinyuan-LilyGO/LilyGo-AMOLED-Series

# ハード
|名称| Pin |備考|
|:-:|:-:|:-:|
|バッテリー電圧|IO04|VBATの半分の電圧が入力|
|~~Button~~|~~IO21~~|回路図的にはつながっていない。多分古いボード|
|QWIIC(CN1)|GP44?|RXD(QWIICなのにUART?)|
|QWIIC(CN1)|GP43?|TXD(QWIICなのにUART?)|
|QWIIC(CN2)|GP02|I2C(SCL)|
|QWIIC(CN2)|GP03|I2C(SDA)|

画面を前に左がBoot　右がリセット
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/9dd0ceb5-1876-e9cc-4e7c-7489e43c29b5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/c5c068eb-d7b5-7e6c-9b3f-7a1f5ef64053.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/df635601-ef6b-fd7a-091a-d8c42b9d9de3.png)

## I2C　アドレス
| 1 | 2 | 3 |
|:-:|:-:|:-:|
|LCD( RM67162)|QSPI|I2Cではない|
|Touch(CST816)|   |   |
|   |   |   |
|   |   |   |

LCD 240x536

# 準備
1. 環境変数のBoard urlsに
https://espressif.github.io/arduino-esp32/package_esp32_index.json
2. Boardの追加
Install Arduino ESP32 V2.0.5 or later or latest
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/4feda79d-29f5-6842-8e07-112f614294ab.png)
2. Sketch -> Include Library -> Manage Libraries
Library Search -> LilyGO AMOLED Series -> Install -> Install ALL
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/1037340d-44fa-eeb5-6b1f-19c0ebc55274.png)
3. (Library Search -> lvgl -> v8.4.0 -> Install)　<-- サンプルを動かすため？上記ライブラリで9.2.2が入った。

# テンプレート
## Arduino_GFX_HelloWorld.inoのコメントを除いたもの
```
#include <Arduino.h>
#include <Arduino_GFX_Library.h>
#include "TouchDrvCSTXXX.hpp"

#define GFX_DEV_DEVICE LILYGO_T_DISPLAY_S3_AMOLED

Arduino_DataBus *bus = new Arduino_ESP32QSPI(6, 47, 18, 7, 48, 5);
Arduino_GFX *gfx = new Arduino_RM67162(bus, 17, 0);
Arduino_GFX *gfx2;
TouchDrvCSTXXX touch;
bool _touchOnline = false;

void setBrightness(uint8_t value)
{
    bus->beginWrite();
    bus->writeC8D8(0x51, value);
    bus->endWrite();
}


void setup()
{
    Serial.begin(115200);

    delay(3000);//???

    Serial.println("Start!");

    // OLED Enable
    pinMode(38, OUTPUT);
    digitalWrite(38, OUTPUT);

    touch.setPins(-1, 21);
    bool res = touch.begin(Wire, CST816_SLAVE_ADDRESS, 3, 2);
    if (!res) {
        Serial.println("Failed to find CST816T - check your wiring!");
        _touchOnline = false;
    } else {
        _touchOnline = true;
        touch.setCenterButtonCoordinate(600, 120);  //AMOLED 1.91 inch
        Serial.println("CST816T init success!");

        touch.setHomeButtonCallback([](void *ptr) {
            Serial.println("Home key pressed!");
        }, NULL);
    }

    if (!gfx->begin()) {
        Serial.println("gfx->begin() failed!");
    }

    gfx2 = new Arduino_Canvas(240, 536, gfx, 0, 0); // for Sprites
    gfx2->begin(GFX_SKIP_OUTPUT_BEGIN); // Added the GFX_SKIP_OUTPUT_BEGIN so the Canvas class doesn’t try and initialise the display
    gfx2->fillScreen(BLACK);
    gfx2->setCursor(80, 268);
    gfx2->setTextColor(RED);
    gfx2->setTextSize(2 /* x scale */, 2 /* y scale */, 1 /* pixel_margin */);
    gfx2->println("Hello World!");
    gfx2->fillCircle(130, 130, 40, GREEN);
    gfx2->flush();

    //Test brightness
    for (int i = 0; i < 255; i++) {
        setBrightness(i);
        delay(20);
    }

}

void loop()
{
    if (_touchOnline) {
        if (touch.isPressed()) {
            int16_t x_array[1]; int16_t y_array[1];
            if (touch.getPoint(x_array, y_array)) {
                Serial.printf("X:%d Y:%d \n", x_array[0], y_array[0]);
            }
        }
    }
    delay(5);
}
```