ILI9431液晶を LovyanGFX で使ってみる


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/4b701727-d78b-7af3-4c9e-ebbf6c9a3876.png)

「ESP32で ILI9341 TFT液晶を動かす」
https://qiita.com/nanbuwks/items/72503cf93c5f2ed0deeb

で紹介した ILI9341 LCD を最近話題の LovyanGFX ライブラリで動かしてみました。
接続したボードは ESP32 の自作ボードです。


# 環境

- ESP32 Arduino
- Ubuntu Linux 20.04
- Arduino 1.8.13 (Portable環境)
- LovyanGFX ライブラリ
- ESP32 (自作ボード)
- ILI9341 LCD 3.2in タッチパネル無

自作ボードとILI9341液晶の配線は「ESP32で ILI9341 TFT液晶を動かす」記事の通りです。

# インストール

Arduino ライブラリマネージャから LovyanGFX ライブラリを読み込みます。
「ファイル」-「スケッチ例」-「カスタムライブラリのスケッチ例」-「LovyanGFX 」-「HowToUse」-「2_spi_setting」
を書き直します。

基本的には以下の項目を変更します。

変更前

```

//:  lgfx::Panel_ILI9341 panel;
  lgfx::Panel_ILI9342 panel;
...
    panel.spi_cs = 14;
    panel.spi_dc = 27;
    panel.gpio_rst = 33;
    panel.gpio_bl  = 32;
...
  panel.memory_width  = 320;
  panel.memory_height = 240;
  panel.panel_width  = 320;
  panel.panel_height = 240;
```

変更後

```

  lgfx::Panel_ILI9341 panel;
//  lgfx::Panel_ILI9342 panel;
...
    panel.spi_cs = 5;
    panel.spi_dc = 17;
    panel.gpio_rst = 16;
    panel.gpio_bl  = 4;
...
  panel.memory_width  = 240;
  panel.memory_height = 320;
  panel.panel_width  = 240;
  panel.panel_height = 320;
````



コメントなどを削除してコンパクトにし、デモ画面を日本語表示になるように直してみたのが以下のコードです。


````

  panel.memory_width  = 240;
  panel.memory_height = 320;
  panel.panel_width  = 240;
  panel.panel_height = 320;

#include <LovyanGFX.hpp>
struct LGFX_Config
{
  static constexpr spi_host_device_t spi_host = VSPI_HOST;
  static constexpr int dma_channel = 1;
  static constexpr int spi_sclk = 18;
  static constexpr int spi_mosi = 23;
  static constexpr int spi_miso = 19;
  static constexpr int spi_dlen = 8;
};
static lgfx::LGFX_SPI<LGFX_Config> lcd;
static lgfx::Panel_ILI9341 panel;

void setup(void)
{
  panel.freq_write = 20000000;
  panel.freq_fill  = 27000000;
  panel.freq_read  = 16000000;
  panel.spi_mode = 0;
  panel.spi_mode_read = 0;
  panel.len_dummy_read_pixel = 8;
  panel.spi_read = true;
  panel.spi_3wire = false;
  panel.spi_cs = 5;
  panel.spi_dc = 17;
  panel.gpio_rst = 16;
  panel.gpio_bl  = 4;
  panel.pwm_ch_bl = 7;
  panel.backlight_level = true;
  panel.reverse_invert = false;
  panel.rgb_order = false;
  panel.memory_width  = 240;
  panel.memory_height = 320;
  panel.panel_width  = 240;
  panel.panel_height = 320;
  panel.offset_x = 0;
  panel.offset_y = 0;
  panel.rotation = 0;
  panel.offset_rotation = 0;
  lcd.setPanel(&panel);
  lcd.init();
}

uint32_t count = ~0;
void loop(void)
{
  for ( int i=0; i<4;i++){
    lcd.setRotation(i);
    lcd.startWrite();
    lcd.fillScreen(random(65535));
    lcd.setCursor(0,0);
    lcd.setFont(&lgfxJapanGothicP_8); lcd.setTextColor(random(65535),random(65535)); lcd.print("縦 8日本語\n");
    lcd.setFont(&lgfxJapanGothicP_12);lcd.setTextColor(random(65535),random(65535)); lcd.print("縦12日本語\n");
    lcd.setFont(&lgfxJapanGothicP_16); lcd.setTextColor(random(65535),random(65535));lcd.print("縦16日本語\n");
//    lcd.setFont(&lgfxJapanGothicP_20); lcd.setTextColor(random(65535),random(65535));lcd.print("縦20日本語\n");
//    lcd.setFont(&lgfxJapanGothicP_24); lcd.setTextColor(random(65535),random(65535));lcd.print("縦24日本語\n");
//    lcd.setFont(&lgfxJapanGothicP_28); lcd.setTextColor(random(65535),random(65535));lcd.print("縦28日本語\n");
//    lcd.setFont(&lgfxJapanGothicP_32); lcd.setTextColor(random(65535),random(65535));lcd.print("縦32日本語\n");
//    lcd.setFont(&lgfxJapanGothicP_36); lcd.setTextColor(random(65535),random(65535));lcd.print("縦36日本語\n");
    lcd.setFont(&lgfxJapanGothicP_40);lcd.setTextColor(random(65535),random(65535)); lcd.print("縦40日本語\n");
    lcd.endWrite();
    delay(3000);
  }
}
```

日本語関係のコードは以下を参考にさせていただきました。
「ovyanGFX入門 その3 日本語フォント描画系 | Lang-ship」
https://lang-ship.com/blog/work/lovyangfx-3-ja-font/

フォントサイズ9種類全部出そうとすると、標準設定ではメモリが足りなくなったので適当にコメントアウトして収めました。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/bb5a3d05-7543-3dd6-f907-a649e8a8e845.png)

# Tips

- 液晶は16ビットカラーで動いているみたいです。
- 今回設定した同じ内容で、 LGFX_Config_Custom.hpp を書き換えて使おうとしたのですが何故かうまく行きませんでした。はて？