Last active
April 26, 2023 04:53
-
-
Save kawashimaken/1f705816ca32ffec713b0b5cdab4d0de to your computer and use it in GitHub Desktop.
esp32_with_two_st7735s_lovyanGFX
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <LovyanGFX.hpp> | |
// ESP32でLovyanGFXを独自設定で利用する場合の設定例 | |
/// 独自の設定を行うクラスを、LGFX_Deviceから派生して作成します。 | |
class LGFXsmall : public lgfx::LGFX_Device { | |
// 接続するパネルの型にあったインスタンスを用意します。 | |
lgfx::Panel_ST7735S _panel_instance; | |
// パネルを接続するバスの種類にあったインスタンスを用意します。 | |
lgfx::Bus_SPI _bus_instance; // SPIバスのインスタンス | |
public: | |
// コンストラクタを作成し、ここで各種設定を行います。 | |
// クラス名を変更した場合はコンストラクタも同じ名前を指定してください。 | |
LGFXsmall(void) { | |
{ // バス制御の設定を行います。 | |
auto cfg = _bus_instance.config(); // バス設定用の構造体を取得します。 | |
// SPIバスの設定 | |
cfg.spi_host = VSPI_HOST; // 使用するSPIを選択 ESP32-S2,C3 : SPI2_HOST or SPI3_HOST / ESP32 : VSPI_HOST or HSPI_HOST | |
// ※ ESP-IDFバージョンアップに伴い、VSPI_HOST , HSPI_HOSTの記述は非推奨になるため、エラーが出る場合は代わりにSPI2_HOST , SPI3_HOSTを使用してください。 | |
cfg.spi_mode = 0; // SPI通信モードを設定 (0 ~ 3) | |
cfg.freq_write = 40000000; // 送信時のSPIクロック (最大80MHz, 80MHzを整数で割った値に丸められます) | |
cfg.freq_read = 16000000; // 受信時のSPIクロック | |
cfg.spi_3wire = true; // 受信をMOSIピンで行う場合はtrueを設定 | |
cfg.use_lock = true; // トランザクションロックを使用する場合はtrueを設定 | |
cfg.dma_channel = SPI_DMA_CH_AUTO; // 使用するDMAチャンネルを設定 (0=DMA不使用 / 1=1ch / 2=ch / SPI_DMA_CH_AUTO=自動設定) | |
// ※ ESP-IDFバージョンアップに伴い、DMAチャンネルはSPI_DMA_CH_AUTO(自動設定)が推奨になりました。1ch,2chの指定は非推奨になります。 | |
cfg.pin_sclk = 18; // SPIのSCLKピン番号を設定 | |
cfg.pin_mosi = 23; // SPIのMOSIピン番号を設定 | |
cfg.pin_miso = -1; // SPIのMISOピン番号を設定 (-1 = disable) | |
cfg.pin_dc = 2; // SPIのD/Cピン番号を設定 (-1 = disable) | |
// SDカードと共通のSPIバスを使う場合、MISOは省略せず必ず設定してください。 | |
_bus_instance.config(cfg); // 設定値をバスに反映します。 | |
_panel_instance.setBus(&_bus_instance); // バスをパネルにセットします。 | |
} | |
{ // 表示パネル制御の設定を行います。 | |
auto cfg = _panel_instance.config(); // 表示パネル設定用の構造体を取得します。 | |
cfg.pin_cs = 12; // CSが接続されているピン番号 (-1 = disable) | |
cfg.pin_rst = 4; // RSTが接続されているピン番号 (-1 = disable) | |
cfg.pin_busy = -1; // BUSYが接続されているピン番号 (-1 = disable) | |
// ※ 以下の設定値はパネル毎に一般的な初期値が設定されていますので、不明な項目はコメントアウトして試してみてください。 | |
cfg.panel_width = 128; // 実際に表示可能な幅 | |
cfg.panel_height = 128; // 実際に表示可能な高さ | |
cfg.offset_x = 0; // パネルのX方向オフセット量 | |
cfg.offset_y = 0; // パネルのY方向オフセット量 | |
cfg.offset_rotation = 0; // 回転方向の値のオフセット 0~7 (4~7は上下反転) | |
cfg.dummy_read_pixel = 8; // ピクセル読出し前のダミーリードのビット数 | |
cfg.dummy_read_bits = 1; // ピクセル以外のデータ読出し前のダミーリードのビット数 | |
cfg.readable = true; // データ読出しが可能な場合 trueに設定 | |
cfg.invert = false; // パネルの明暗が反転してしまう場合 trueに設定 | |
cfg.rgb_order = false; // パネルの赤と青が入れ替わってしまう場合 trueに設定 | |
cfg.dlen_16bit = false; // 16bitパラレルやSPIでデータ長を16bit単位で送信するパネルの場合 trueに設定 | |
cfg.bus_shared = true; // SDカードとバスを共有している場合 trueに設定(drawJpgFile等でバス制御を行います) | |
_panel_instance.config(cfg); | |
} | |
setPanel(&_panel_instance); // 使用するパネルをセットします。 | |
} | |
}; | |
class LGFXbig : public lgfx::LGFX_Device { | |
// 接続するパネルの型にあったインスタンスを用意します。 | |
lgfx::Panel_ST7735S _big_panel_instance; | |
// パネルを接続するバスの種類にあったインスタンスを用意します。 | |
lgfx::Bus_SPI _big_bus_instance; // SPIバスのインスタンス | |
public: | |
// コンストラクタを作成し、ここで各種設定を行います。 | |
// クラス名を変更した場合はコンストラクタも同じ名前を指定してください。 | |
LGFXbig(void) { | |
{ // バス制御の設定を行います。 | |
auto cfg_big = _big_bus_instance.config(); // バス設定用の構造体を取得します。 | |
// SPIバスの設定 | |
cfg_big.spi_host = VSPI_HOST; // 使用するSPIを選択 ESP32-S2,C3 : SPI2_HOST or SPI3_HOST / ESP32 : VSPI_HOST or HSPI_HOST | |
// ※ ESP-IDFバージョンアップに伴い、VSPI_HOST , HSPI_HOSTの記述は非推奨になるため、エラーが出る場合は代わりにSPI2_HOST , SPI3_HOSTを使用してください。 | |
cfg_big.spi_mode = 0; // SPI通信モードを設定 (0 ~ 3) | |
cfg_big.freq_write = 40000000; // 送信時のSPIクロック (最大80MHz, 80MHzを整数で割った値に丸められます) | |
cfg_big.freq_read = 16000000; // 受信時のSPIクロック | |
cfg_big.spi_3wire = true; // 受信をMOSIピンで行う場合はtrueを設定 | |
cfg_big.use_lock = true; // トランザクションロックを使用する場合はtrueを設定 | |
cfg_big.dma_channel = SPI_DMA_CH_AUTO; // 使用するDMAチャンネルを設定 (0=DMA不使用 / 1=1ch / 2=ch / SPI_DMA_CH_AUTO=自動設定) | |
// ※ ESP-IDFバージョンアップに伴い、DMAチャンネルはSPI_DMA_CH_AUTO(自動設定)が推奨になりました。1ch,2chの指定は非推奨になります。 | |
cfg_big.pin_sclk = 18; // SPIのSCLKピン番号を設定 | |
cfg_big.pin_mosi = 23; // SPIのMOSIピン番号を設定 | |
cfg_big.pin_miso = -1; // SPIのMISOピン番号を設定 (-1 = disable) | |
cfg_big.pin_dc = 2; // SPIのD/Cピン番号を設定 (-1 = disable) | |
// SDカードと共通のSPIバスを使う場合、MISOは省略せず必ず設定してください。 | |
_big_bus_instance.config(cfg_big); // 設定値をバスに反映します。 | |
_big_panel_instance.setBus(&_big_bus_instance); // バスをパネルにセットします。 | |
} | |
{ // 表示パネル制御の設定を行います。 | |
auto cfg_big = _big_panel_instance.config(); // 表示パネル設定用の構造体を取得します。 | |
cfg_big.pin_cs = 5; // CSが接続されているピン番号 (-1 = disable) | |
cfg_big.pin_rst = -1; // RSTが接続されているピン番号 (-1 = disable) | |
cfg_big.pin_busy = -1; // BUSYが接続されているピン番号 (-1 = disable) | |
// ※ 以下の設定値はパネル毎に一般的な初期値が設定されていますので、不明な項目はコメントアウトして試してみてください。 | |
cfg_big.panel_width = 128; // 実際に表示可能な幅 | |
cfg_big.panel_height = 160; // 実際に表示可能な高さ | |
cfg_big.offset_x = 0; // パネルのX方向オフセット量 | |
cfg_big.offset_y = 0; // パネルのY方向オフセット量 | |
cfg_big.offset_rotation = 0; // 回転方向の値のオフセット 0~7 (4~7は上下反転) | |
cfg_big.dummy_read_pixel = 8; // ピクセル読出し前のダミーリードのビット数 | |
cfg_big.dummy_read_bits = 1; // ピクセル以外のデータ読出し前のダミーリードのビット数 | |
cfg_big.readable = true; // データ読出しが可能な場合 trueに設定 | |
cfg_big.invert = false; // パネルの明暗が反転してしまう場合 trueに設定 | |
cfg_big.rgb_order = false; // パネルの赤と青が入れ替わってしまう場合 trueに設定 | |
cfg_big.dlen_16bit = false; // 16bitパラレルやSPIでデータ長を16bit単位で送信するパネルの場合 trueに設定 | |
cfg_big.bus_shared = true; // SDカードとバスを共有している場合 trueに設定(drawJpgFile等でバス制御を行います) | |
_big_panel_instance.config(cfg_big); | |
} | |
setPanel(&_big_panel_instance); // 使用するパネルをセットします。 | |
} | |
}; | |
// 準備したクラスのインスタンスを作成します。 | |
LGFXsmall display128_128; | |
LGFXbig display128_160; | |
void setup(void) { | |
// SPIバスとパネルの初期化を実行すると使用可能になります。 | |
display128_128.init(); | |
display128_160.init(); | |
// | |
display128_128.setTextSize((std::max(display128_128.width(), display128_128.height()) + 255) >> 8); | |
display128_128.fillScreen(TFT_BLACK); | |
// SPIバスとパネルの初期化を実行すると使用可能になります。 | |
display128_160.setTextSize((std::max(display128_160.width(), display128_160.height()) + 255) >> 8); | |
display128_160.fillScreen(TFT_BLACK); | |
} | |
void showBigDisplay() { | |
display128_160.startWrite(); | |
display128_160.setTextColor(TFT_WHITE); | |
display128_160.setTextColor(0xFF0000U); | |
display128_160.drawString("R", 30, 16); | |
display128_160.setTextColor(0x00FF00U); | |
display128_160.drawString("G", 40, 16); | |
display128_160.setTextColor(0x0000FFU); | |
display128_160.drawString("B", 50, 16); | |
display128_160.drawString("Big Display", 10, 36); | |
display128_160.endWrite(); | |
} | |
void showSmallDisplay() { | |
display128_128.startWrite(); | |
display128_128.setTextColor(TFT_WHITE); | |
display128_128.setTextColor(0xFF0000U); | |
display128_128.drawString("R", 30, 16); | |
display128_128.setTextColor(0x00FF00U); | |
display128_128.drawString("G", 40, 16); | |
display128_128.setTextColor(0x0000FFU); | |
display128_128.drawString("B", 50, 16); | |
display128_128.drawString("Small Display", 10, 36); | |
display128_128.endWrite(); | |
} | |
void loop(void) { | |
showSmallDisplay(); | |
showBigDisplay(); | |
delay(100); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment