ILI9341 显示 — ESP32-S3 simulation

在 ESP32-S3 和 ILI9341 显示屏上绘制文字 mnrois

An interactive ESP32-S3 circuit simulation you can run free in your browser on Velxio, by janvelxio.

Components

Sketch code

#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
#include <Preferences.h>          // ESP32 掉电保存

//================ 屏幕 SPI 引脚 ================
#define TFT_CS   10
#define TFT_DC    9
#define TFT_RST   8
#define TFT_SCK  12
#define TFT_MOSI 11
#define TFT_MISO 13

//================ 触摸引脚 ================
#define TOUCH_CS  7
#define TOUCH_IRQ 6

//================ 继电器控制引脚 ================
const int RELAY_PIN[6] = {14, 18, 19, 21, 22, 23};

//================ 触摸校准参数 ================
#define TX_MIN 100
#define TX_MAX 1959
#define TY_MIN 1950   // 顶部
#define TY_MAX 100    // 底部

#define TOUCH_Z_THRESHOLD 100
#define TOUCH_DEBOUNCE_MS 200

//================ 【1. 这里可以修改按键文字和字体大小】================
const char* buttonLabels[6] = {"CD", "PHONO", "FM", "Balance", "AUX", "Decoder"}; // 按键文字
#define BUTTON_TEXT_SIZE 1                                    // 按键字体大小 (可改 2, 3, 4)

//================ 【2. 音量进度条参数配置】================
#define BAR_X 30      // 进度条左上角X
#define BAR_Y 180     // 进度条左上角Y
#define BAR_W 280     // 进度条宽度
#define BAR_H 50      // 进度条高度
#define BAR_TEXT_SIZE 2 // 进度条字体大小

SPIClass hspi(HSPI);
Adafruit_ILI9341 tft(&hspi, TFT_DC, TFT_CS, TFT_RST);
Preferences prefs;

// 按键结构体
struct Button {
  int x;
  int y;
  int w;
  int h;
  uint16_t Color_on;
  uint16_t Color_off;
  uint16_t text_Color_on;
  uint16_t text_Color_off;
};

Button buttons[6] = {
  {10,  100, 45, 25, ILI9341_CYAN,   ILI9341_DARKCYAN, ILI9341_ORANGE, ILI9341_WHITE}, // a 按键
  {60, 100, 45, 25, ILI9341_CYAN,    ILI9341_DARKCYAN, ILI9341_ORANGE, ILI9341_WHITE}, // b
  {110, 100, 45, 25, ILI9341_CYAN,    ILI9341_DARKCYAN, ILI9341_BLACK, ILI9341_WHITE}, // c
  {160,  100, 45, 25, ILI9341_CYAN,  ILI9341_DARKCYAN, ILI9341_ORANGE, ILI9341_WHITE}, // d
  {210, 100, 45, 25, ILI9341_CYAN, ILI9341_DARKCYAN, ILI9341_WHITE, ILI9341_WHITE}, // e
  {260, 100, 45, 25, ILI9341_CYAN,  ILI9341_DARKCYAN, ILI9341_BLACK, ILI9341_WHITE}  // f
};

bool ch[6] = {false};
int  currentCh = -1;
int  volume = 50;                 // 默认音量 50 (范围 1~100)
unsigned long lastTouchMs = 0;

//================ 触摸读取 ================
uint16_t readTouch(uint8_t cmd)
{
  hspi.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE0));
  digitalWrite(TOUCH_CS, LOW);
  hspi.transfer(cmd);
  uint16_t data  = hspi.transfer(0x00) << 8;
  data |= hspi.transfer(0x00);
  digitalWrite(TOUCH_CS, HIGH);
  hspi.endTransaction();
  return data >> 4;
}

void getTouchXY(uint16_t &x, uint16_t &y, uint16_t &z)
{
  x = readTouch(0x90);
  y = readTouch(0xD0);
  z = readTouch(0xB0);
}

//================ 硬件通道切换 ================
void setChannelHardware(int idx)
{
  for (int i = 0; i < 6; i++)
    digitalWrite(RELAY_PIN[i], (i == idx) ? HIGH : LOW);
}

//================ 【3. 绘制按键 (自动居中)】================
void drawButton(int i)
{
  // ================= 第三步:从数组读取颜色 =================
  // 1. 根据选中状态,从结构体中提取背景色
  uint16_t bgColor = ch[i] ? buttons[i].Color_on : buttons[i].Color_off;
  
  // 2. 提取文字颜色 (选中时用数组里的,未选中时暂用白色,保证看得清)