diff --git a/boards/seeed-sensecap-indicator.json b/boards/seeed-sensecap-indicator.json
new file mode 100644
index 0000000000..3fc57126f9
--- /dev/null
+++ b/boards/seeed-sensecap-indicator.json
@@ -0,0 +1,42 @@
+{
+ "build": {
+ "arduino": {
+ "ldscript": "esp32s3_out.ld",
+ "partitions": "default_8MB.csv",
+ "memory_type": "qio_opi"
+ },
+ "core": "esp32",
+ "extra_flags": [
+ "-DBOARD_HAS_PSRAM",
+ "-DARDUINO_USB_CDC_ON_BOOT=0",
+ "-DARDUINO_USB_MODE=1",
+ "-DARDUINO_RUNNING_CORE=1",
+ "-DARDUINO_EVENT_RUNNING_CORE=1"
+ ],
+ "f_cpu": "240000000L",
+ "f_flash": "80000000L",
+ "flash_mode": "qio",
+ "hwids": [["0x1A86", "0x7523"]],
+ "mcu": "esp32s3",
+ "variant": "esp32s3r8"
+ },
+ "connectivity": ["wifi", "bluetooth", "lora"],
+ "debug": {
+ "default_tool": "esp-builtin",
+ "onboard_tools": ["esp-builtin"],
+ "openocd_target": "esp32s3.cfg"
+ },
+ "frameworks": ["arduino"],
+ "name": "Seeed Studio SenseCAP Indicator",
+ "upload": {
+ "flash_size": "8MB",
+ "maximum_ram_size": 327680,
+ "maximum_size": 8388608,
+ "require_upload_port": true,
+ "use_1200bps_touch": true,
+ "wait_for_upload_port": true,
+ "speed": 921600
+ },
+ "url": "https://www.seeedstudio.com/Indicator-for-Meshtastic.html",
+ "vendor": "Seeed Studio"
+}
diff --git a/src/configuration.h b/src/configuration.h
index 4ab33ef2bd..72420cc59f 100644
--- a/src/configuration.h
+++ b/src/configuration.h
@@ -163,6 +163,7 @@ along with this program. If not, see .
// -----------------------------------------------------------------------------
// IO Expander
// -----------------------------------------------------------------------------
+#define TCA9535_ADDR 0x20
#define TCA9555_ADDR 0x26
// -----------------------------------------------------------------------------
@@ -172,6 +173,11 @@ along with this program. If not, see .
#define GPS_THREAD_INTERVAL 200
#endif
+// -----------------------------------------------------------------------------
+// Touchscreen
+// -----------------------------------------------------------------------------
+#define FT6336U_ADDR 0x48
+
// convert 24-bit color to 16-bit (56K)
#define COLOR565(r, g, b) (((r & 0xF8) << 8) | ((g & 0xFC) << 3) | ((b & 0xF8) >> 3))
diff --git a/src/detect/ScanI2C.h b/src/detect/ScanI2C.h
index 638e8cd23d..743de7a9a2 100644
--- a/src/detect/ScanI2C.h
+++ b/src/detect/ScanI2C.h
@@ -42,6 +42,7 @@ class ScanI2C
BMA423,
BQ24295,
LSM6DS3,
+ TCA9535,
TCA9555,
VEML7700,
RCWL9620,
@@ -53,6 +54,7 @@ class ScanI2C
BMX160,
DFROBOT_LARK,
NAU7802,
+ FT6336U,
STK8BAXX
} DeviceType;
diff --git a/src/detect/ScanI2CTwoWire.cpp b/src/detect/ScanI2CTwoWire.cpp
index ad5d9fe4ca..48341034b9 100644
--- a/src/detect/ScanI2CTwoWire.cpp
+++ b/src/detect/ScanI2CTwoWire.cpp
@@ -388,12 +388,14 @@ void ScanI2CTwoWire::scanPort(I2CPort port, uint8_t *address, uint8_t asize)
SCAN_SIMPLE_CASE(BMX160_ADDR, BMX160, "BMX160 accelerometer found\n");
SCAN_SIMPLE_CASE(BMA423_ADDR, BMA423, "BMA423 accelerometer found\n");
SCAN_SIMPLE_CASE(LSM6DS3_ADDR, LSM6DS3, "LSM6DS3 accelerometer found at address 0x%x\n", (uint8_t)addr.address);
+ SCAN_SIMPLE_CASE(TCA9535_ADDR, TCA9535, "TCA9535 I2C expander found\n");
SCAN_SIMPLE_CASE(TCA9555_ADDR, TCA9555, "TCA9555 I2C expander found\n");
SCAN_SIMPLE_CASE(VEML7700_ADDR, VEML7700, "VEML7700 light sensor found\n");
SCAN_SIMPLE_CASE(TSL25911_ADDR, TSL2591, "TSL2591 light sensor found\n");
SCAN_SIMPLE_CASE(OPT3001_ADDR, OPT3001, "OPT3001 light sensor found\n");
SCAN_SIMPLE_CASE(MLX90632_ADDR, MLX90632, "MLX90632 IR temp sensor found\n");
SCAN_SIMPLE_CASE(NAU7802_ADDR, NAU7802, "NAU7802 based scale found\n");
+ SCAN_SIMPLE_CASE(FT6336U_ADDR, FT6336U, "FT6336U touchscreen found\n");
default:
LOG_INFO("Device found at address 0x%x was not able to be enumerated\n", addr.address);
diff --git a/src/graphics/Screen.cpp b/src/graphics/Screen.cpp
index da573bade3..ff1254812a 100644
--- a/src/graphics/Screen.cpp
+++ b/src/graphics/Screen.cpp
@@ -19,8 +19,8 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
-#include "../userPrefs.h"
#include "Screen.h"
+#include "../userPrefs.h"
#include "PowerMon.h"
#include "configuration.h"
#if HAS_SCREEN
@@ -1093,8 +1093,8 @@ static void drawNodes(OLEDDisplay *display, int16_t x, int16_t y, const NodeStat
{
char usersString[20];
snprintf(usersString, sizeof(usersString), "%d/%d", nodeStatus->getNumOnline(), nodeStatus->getNumTotal());
-#if (defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ST7735_CS) || defined(ST7789_CS) || defined(USE_ST7789) || \
- defined(HX8357_CS)) && \
+#if (defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ST7701_CS) || defined(ST7735_CS) || defined(ST7789_CS) || \
+ defined(USE_ST7789) || defined(HX8357_CS)) && \
!defined(DISPLAY_FORCE_SMALL_FONTS)
display->drawFastImage(x, y + 3, 8, 8, imgUser);
#else
@@ -1515,7 +1515,8 @@ Screen::Screen(ScanI2C::DeviceAddress address, meshtastic_Config_DisplayConfig_O
#elif defined(USE_SSD1306)
dispdev = new SSD1306Wire(address.address, -1, -1, geometry,
(address.port == ScanI2C::I2CPort::WIRE1) ? HW_I2C::I2C_TWO : HW_I2C::I2C_ONE);
-#elif defined(ST7735_CS) || defined(ILI9341_DRIVER) || defined(ST7789_CS) || defined(RAK14014) || defined(HX8357_CS)
+#elif defined(ST7735_CS) || defined(ILI9341_DRIVER) || defined(ST7701_CS) || defined(ST7789_CS) || defined(RAK14014) || \
+ defined(HX8357_CS)
dispdev = new TFTDisplay(address.address, -1, -1, geometry,
(address.port == ScanI2C::I2CPort::WIRE1) ? HW_I2C::I2C_TWO : HW_I2C::I2C_ONE);
#elif defined(USE_EINK) && !defined(USE_EINK_DYNAMICDISPLAY)
@@ -1707,7 +1708,8 @@ void Screen::setup()
// Standard behaviour is to FLIP the screen (needed on T-Beam). If this config item is set, unflip it, and thereby logically
// flip it. If you have a headache now, you're welcome.
if (!config.display.flip_screen) {
-#if defined(ST7735_CS) || defined(ILI9341_DRIVER) || defined(ST7789_CS) || defined(RAK14014) || defined(HX8357_CS)
+#if defined(ST7701_CS) || defined(ST7735_CS) || defined(ILI9341_DRIVER) || defined(ST7701_CS) || defined(ST7789_CS) || \
+ defined(RAK14014) || defined(HX8357_CS)
static_cast(dispdev)->flipScreenVertically();
#else
dispdev->flipScreenVertically();
@@ -2420,8 +2422,8 @@ void DebugInfo::drawFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16
#ifdef ARCH_ESP32
if (millis() - storeForwardModule->lastHeartbeat >
(storeForwardModule->heartbeatInterval * 1200)) { // no heartbeat, overlap a bit
-#if (defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ST7735_CS) || defined(ST7789_CS) || defined(USE_ST7789) || \
- defined(HX8357_CS)) && \
+#if (defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ST7701_CS) || defined(ST7735_CS) || defined(ST7789_CS) || \
+ defined(USE_ST7789) || defined(HX8357_CS)) && \
!defined(DISPLAY_FORCE_SMALL_FONTS)
display->drawFastImage(x + SCREEN_WIDTH - 14 - display->getStringWidth(ourId), y + 3 + FONT_HEIGHT_SMALL, 12, 8,
imgQuestionL1);
@@ -2432,8 +2434,8 @@ void DebugInfo::drawFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16
imgQuestion);
#endif
} else {
-#if (defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ST7735_CS) || defined(ST7789_CS) || defined(USE_ST7789) || \
- defined(HX8357_CS)) && \
+#if (defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ST7701_CS) || defined(ST7735_CS) || defined(ST7789_CS) || \
+ defined(USE_ST7789) || defined(HX8357_CS)) && \
!defined(DISPLAY_FORCE_SMALL_FONTS)
display->drawFastImage(x + SCREEN_WIDTH - 18 - display->getStringWidth(ourId), y + 3 + FONT_HEIGHT_SMALL, 16, 8,
imgSFL1);
@@ -2447,8 +2449,8 @@ void DebugInfo::drawFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16
#endif
} else {
// TODO: Raspberry Pi supports more than just the one screen size
-#if (defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ST7735_CS) || defined(ST7789_CS) || defined(USE_ST7789) || \
- defined(HX8357_CS) || ARCH_PORTDUINO) && \
+#if (defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ST7701_CS) || defined(ST7735_CS) || defined(ST7789_CS) || \
+ defined(USE_ST7789) || defined(HX8357_CS) || ARCH_PORTDUINO) && \
!defined(DISPLAY_FORCE_SMALL_FONTS)
display->drawFastImage(x + SCREEN_WIDTH - 14 - display->getStringWidth(ourId), y + 3 + FONT_HEIGHT_SMALL, 12, 8,
imgInfoL1);
diff --git a/src/graphics/ScreenFonts.h b/src/graphics/ScreenFonts.h
index 267f6e0a80..34c832635c 100644
--- a/src/graphics/ScreenFonts.h
+++ b/src/graphics/ScreenFonts.h
@@ -12,8 +12,8 @@
#include "graphics/fonts/OLEDDisplayFontsUA.h"
#endif
-#if (defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ST7735_CS) || defined(ST7789_CS) || defined(USE_ST7789) || \
- defined(HX8357_CS)) && \
+#if (defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ST7701_CS) || defined(ST7735_CS) || defined(ST7789_CS) || \
+ defined(USE_ST7789) || defined(HX8357_CS)) && \
!defined(DISPLAY_FORCE_SMALL_FONTS)
// The screen is bigger so use bigger fonts
#define FONT_SMALL ArialMT_Plain_16 // Height: 19
diff --git a/src/graphics/TFTDisplay.cpp b/src/graphics/TFTDisplay.cpp
index 2849dd9a90..c0326abec5 100644
--- a/src/graphics/TFTDisplay.cpp
+++ b/src/graphics/TFTDisplay.cpp
@@ -500,10 +500,126 @@ class LGFX : public lgfx::LGFX_Device
static LGFX *tft = nullptr;
+#elif defined(ST7701_CS)
+#include // Graphics and font library for ST7701 driver chip
+#include
+#include
+
+class LGFX : public lgfx::LGFX_Device
+{
+ lgfx::Panel_ST7701 _panel_instance;
+ lgfx::Bus_RGB _bus_instance;
+ lgfx::Light_PWM _light_instance;
+ lgfx::Touch_FT5x06 _touch_instance;
+
+ public:
+ LGFX(void)
+ {
+ {
+ auto cfg = _panel_instance.config();
+ cfg.memory_width = 800;
+ cfg.memory_height = 480;
+ cfg.panel_width = TFT_WIDTH;
+ cfg.panel_height = TFT_HEIGHT;
+ cfg.offset_x = TFT_OFFSET_X;
+ cfg.offset_y = TFT_OFFSET_Y;
+ _panel_instance.config(cfg);
+ }
+
+ {
+ auto cfg = _panel_instance.config_detail();
+ cfg.pin_cs = ST7701_CS;
+ cfg.pin_sclk = ST7701_SCK;
+ cfg.pin_mosi = ST7701_SDA;
+ // cfg.use_psram = 1;
+ _panel_instance.config_detail(cfg);
+ }
+
+ {
+ auto cfg = _bus_instance.config();
+ cfg.panel = &_panel_instance;
+#ifdef SENSECAP_INDICATOR
+ cfg.pin_d0 = GPIO_NUM_15; // B0
+ cfg.pin_d1 = GPIO_NUM_14; // B1
+ cfg.pin_d2 = GPIO_NUM_13; // B2
+ cfg.pin_d3 = GPIO_NUM_12; // B3
+ cfg.pin_d4 = GPIO_NUM_11; // B4
+
+ cfg.pin_d5 = GPIO_NUM_10; // G0
+ cfg.pin_d6 = GPIO_NUM_9; // G1
+ cfg.pin_d7 = GPIO_NUM_8; // G2
+ cfg.pin_d8 = GPIO_NUM_7; // G3
+ cfg.pin_d9 = GPIO_NUM_6; // G4
+ cfg.pin_d10 = GPIO_NUM_5; // G5
+
+ cfg.pin_d11 = GPIO_NUM_4; // R0
+ cfg.pin_d12 = GPIO_NUM_3; // R1
+ cfg.pin_d13 = GPIO_NUM_2; // R2
+ cfg.pin_d14 = GPIO_NUM_1; // R3
+ cfg.pin_d15 = GPIO_NUM_0; // R4
+
+ cfg.pin_henable = GPIO_NUM_18;
+ cfg.pin_vsync = GPIO_NUM_17;
+ cfg.pin_hsync = GPIO_NUM_16;
+ cfg.pin_pclk = GPIO_NUM_21;
+ cfg.freq_write = 12000000;
+
+ cfg.hsync_polarity = 0;
+ cfg.hsync_front_porch = 10;
+ cfg.hsync_pulse_width = 8;
+ cfg.hsync_back_porch = 50;
+
+ cfg.vsync_polarity = 0;
+ cfg.vsync_front_porch = 10;
+ cfg.vsync_pulse_width = 8;
+ cfg.vsync_back_porch = 20;
+
+ cfg.pclk_active_neg = 0;
+ cfg.de_idle_high = 1;
+ cfg.pclk_idle_high = 0;
+#endif
+ _bus_instance.config(cfg);
+ }
+ _panel_instance.setBus(&_bus_instance);
+
+ {
+ auto cfg = _light_instance.config();
+ cfg.pin_bl = ST7701_BL;
+ _light_instance.config(cfg);
+ }
+ _panel_instance.light(&_light_instance);
+
+ {
+ auto cfg = _touch_instance.config();
+ cfg.pin_cs = -1;
+ cfg.x_min = 0;
+ cfg.x_max = 479;
+ cfg.y_min = 0;
+ cfg.y_max = 479;
+ cfg.pin_int = -1; // don't use SCREEN_TOUCH_INT;
+ cfg.pin_rst = SCREEN_TOUCH_RST;
+ cfg.bus_shared = true;
+ cfg.offset_rotation = TFT_OFFSET_ROTATION;
+
+ cfg.i2c_port = TOUCH_I2C_PORT;
+ cfg.i2c_addr = TOUCH_SLAVE_ADDRESS;
+ cfg.pin_sda = I2C_SDA;
+ cfg.pin_scl = I2C_SCL;
+ cfg.freq = 400000;
+ _touch_instance.config(cfg);
+ _panel_instance.setTouch(&_touch_instance);
+ }
+
+ setPanel(&_panel_instance);
+ }
+};
+
+static LGFX *tft = nullptr;
+
#endif
-#if defined(ST7735_CS) || defined(ST7789_CS) || defined(ILI9341_DRIVER) || defined(RAK14014) || defined(HX8357_CS) || \
- (ARCH_PORTDUINO && HAS_SCREEN != 0)
+#if defined(ST7701_CS) || defined(ST7735_CS) || defined(ST7789_CS) || defined(ILI9341_DRIVER) || defined(RAK14014) || \
+ defined(HX8357_CS) || (ARCH_PORTDUINO && HAS_SCREEN != 0)
#include "SPILock.h"
#include "TFTDisplay.h"
#include
@@ -709,7 +825,6 @@ bool TFTDisplay::connect()
#ifdef UNPHONE
unphone.backlight(true); // using unPhone library
- LOG_INFO("Power to TFT Backlight\n");
#endif
tft->init();
@@ -725,7 +840,7 @@ bool TFTDisplay::connect()
attachInterrupt(digitalPinToInterrupt(SCREEN_TOUCH_INT), rak14014_tpIntHandle, FALLING);
#elif defined(T_DECK) || defined(PICOMPUTER_S3) || defined(CHATTER_2)
tft->setRotation(1); // T-Deck has the TFT in landscape
-#elif defined(T_WATCH_S3)
+#elif defined(T_WATCH_S3) || defined(SENSECAP_INDICATOR)
tft->setRotation(2); // T-Watch S3 left-handed orientation
#else
tft->setRotation(3); // Orient horizontal and wide underneath the silkscreen name label
diff --git a/src/graphics/images.h b/src/graphics/images.h
index ab3767a897..7028f18e3a 100644
--- a/src/graphics/images.h
+++ b/src/graphics/images.h
@@ -20,8 +20,8 @@ const uint8_t bluetoothConnectedIcon[36] PROGMEM = {0xfe, 0x01, 0xff, 0x03, 0x03
0xfe, 0x31, 0x00, 0x30, 0x30, 0x30, 0x30, 0x30, 0xf0, 0x3f, 0xe0, 0x1f};
#endif
-#if (defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ST7735_CS) || defined(ST7789_CS) || defined(USE_ST7789) || \
- defined(HX8357_CS) || ARCH_PORTDUINO) && \
+#if (defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ST7701_CS) || defined(ST7735_CS) || defined(ST7789_CS) || \
+ defined(USE_ST7789) || defined(HX8357_CS) || ARCH_PORTDUINO) && \
!defined(DISPLAY_FORCE_SMALL_FONTS)
const uint8_t imgQuestionL1[] PROGMEM = {0xff, 0x01, 0x01, 0x32, 0x7b, 0x49, 0x49, 0x6f, 0x26, 0x01, 0x01, 0xff};
const uint8_t imgQuestionL2[] PROGMEM = {0x0f, 0x08, 0x08, 0x08, 0x06, 0x0f, 0x0f, 0x06, 0x08, 0x08, 0x08, 0x0f};
diff --git a/src/main.cpp b/src/main.cpp
index 83758d5ee9..1401f4f0b4 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -745,8 +745,8 @@ void setup()
#if !MESHTASTIC_EXCLUDE_I2C
// Don't call screen setup until after nodedb is setup (because we need
// the current region name)
-#if defined(ST7735_CS) || defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ST7789_CS) || defined(HX8357_CS) || \
- defined(USE_ST7789)
+#if defined(ST7701_CS) || defined(ST7735_CS) || defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ST7789_CS) || \
+ defined(HX8357_CS) || defined(USE_ST7789)
screen->setup();
#elif defined(ARCH_PORTDUINO)
if (screen_found.port != ScanI2C::I2CPort::NO_I2C || settingsMap[displayPanel]) {
diff --git a/src/platform/esp32/architecture.h b/src/platform/esp32/architecture.h
index f86b342ce8..93630aa8a6 100644
--- a/src/platform/esp32/architecture.h
+++ b/src/platform/esp32/architecture.h
@@ -166,6 +166,8 @@
#define HW_VENDOR meshtastic_HardwareModel_HELTEC_VISION_MASTER_E290
#elif defined(HELTEC_MESH_NODE_T114)
#define HW_VENDOR meshtastic_HardwareModel_HELTEC_MESH_NODE_T114
+#elif defined(SENSECAP_INDICATOR)
+#define HW_VENDOR meshtastic_HardwareModel_SENSECAP_INDICATOR
#endif
// -----------------------------------------------------------------------------
diff --git a/variants/seeed-sensecap-indicator/pins_arduino.h b/variants/seeed-sensecap-indicator/pins_arduino.h
new file mode 100644
index 0000000000..300f0e0f5d
--- /dev/null
+++ b/variants/seeed-sensecap-indicator/pins_arduino.h
@@ -0,0 +1,56 @@
+#ifndef Pins_Arduino_h
+#define Pins_Arduino_h
+
+#include
+
+// static const uint8_t LED_BUILTIN = -1;
+
+// static const uint8_t TX = 43;
+// static const uint8_t RX = 44;
+
+static const uint8_t SDA = 39;
+static const uint8_t SCL = 40;
+
+// Default SPI will be mapped to Radio
+static const uint8_t SS = -1;
+static const uint8_t MOSI = 48;
+static const uint8_t MISO = 47;
+static const uint8_t SCK = 41;
+
+static const uint8_t A0 = 1;
+static const uint8_t A1 = 2;
+static const uint8_t A2 = 3;
+static const uint8_t A3 = 4;
+static const uint8_t A4 = 5;
+static const uint8_t A5 = 6;
+static const uint8_t A6 = 7;
+static const uint8_t A7 = 8;
+static const uint8_t A8 = 9;
+static const uint8_t A9 = 10;
+static const uint8_t A10 = 11;
+static const uint8_t A11 = 12;
+static const uint8_t A12 = 13;
+static const uint8_t A13 = 14;
+static const uint8_t A14 = 15;
+static const uint8_t A15 = 16;
+static const uint8_t A16 = 17;
+static const uint8_t A17 = 18;
+static const uint8_t A18 = 19;
+static const uint8_t A19 = 20;
+
+static const uint8_t T1 = 1;
+static const uint8_t T2 = 2;
+static const uint8_t T3 = 3;
+static const uint8_t T4 = 4;
+static const uint8_t T5 = 5;
+static const uint8_t T6 = 6;
+static const uint8_t T7 = 7;
+static const uint8_t T8 = 8;
+static const uint8_t T9 = 9;
+static const uint8_t T10 = 10;
+static const uint8_t T11 = 11;
+static const uint8_t T12 = 12;
+static const uint8_t T13 = 13;
+static const uint8_t T14 = 14;
+
+#endif /* Pins_Arduino_h */
\ No newline at end of file
diff --git a/variants/seeed-sensecap-indicator/platformio.ini b/variants/seeed-sensecap-indicator/platformio.ini
new file mode 100644
index 0000000000..e6bb2145ef
--- /dev/null
+++ b/variants/seeed-sensecap-indicator/platformio.ini
@@ -0,0 +1,28 @@
+; Seeed Studio SenseCAP Indicator
+[env:seeed-sensecap-indicator]
+extends = esp32s3_base
+platform_packages =
+ platformio/framework-arduinoespressif32 @ https://github.com/mverch67/arduino-esp32.git#add_tca9535 ; based on 2.0.16
+
+board = seeed-sensecap-indicator
+board_check = true
+upload_protocol = esptool
+
+build_flags = ${esp32_base.build_flags}
+ -Ivariants/seeed-sensecap-indicator
+ -DSENSECAP_INDICATOR
+ -DCONFIG_ARDUHAL_LOG_COLORS
+ -DRADIOLIB_DEBUG_SPI=0
+ -DRADIOLIB_DEBUG_PROTOCOL=0
+ -DRADIOLIB_DEBUG_BASIC=0
+ -DRADIOLIB_VERBOSE_ASSERT=0
+ -DRADIOLIB_SPI_PARANOID=0
+ -DIO_EXPANDER=0x40
+ -DIO_EXPANDER_IRQ=42
+ ;-DIO_EXPANDER_DEBUG
+ -DUSE_ARDUINO_HAL_GPIO
+
+lib_deps = ${esp32s3_base.lib_deps}
+ https://github.com/mverch67/LovyanGFX#develop
+ earlephilhower/ESP8266Audio@^1.9.7
+ earlephilhower/ESP8266SAM@^1.0.1
\ No newline at end of file
diff --git a/variants/seeed-sensecap-indicator/variant.h b/variants/seeed-sensecap-indicator/variant.h
new file mode 100644
index 0000000000..d7ed329eb9
--- /dev/null
+++ b/variants/seeed-sensecap-indicator/variant.h
@@ -0,0 +1,64 @@
+#define I2C_SDA 39
+#define I2C_SCL 40
+
+#define BUTTON_PIN 38
+// #define BUTTON_NEED_PULLUP
+
+// #define BATTERY_PIN 27 // A battery voltage measurement pin, voltage divider connected here to measure battery voltage
+// #define ADC_CHANNEL ADC1_GPIO27_CHANNEL
+// #define ADC_MULTIPLIER 2
+
+// ST7701 TFT LCD
+#define ST7701_CS (4 | IO_EXPANDER)
+#define ST7701_RS -1 // DC
+#define ST7701_SDA 48 // MOSI
+#define ST7701_SCK 41
+#define ST7701_RESET (5 | IO_EXPANDER)
+#define ST7701_MISO 47
+#define ST7701_BUSY -1
+#define ST7701_BL 45
+#define ST7701_SPI_HOST SPI2_HOST
+#define ST7701_BACKLIGHT_EN 45
+#define SPI_FREQUENCY 20000000
+#define SPI_READ_FREQUENCY 16000000
+#define TFT_HEIGHT 480
+#define TFT_WIDTH 480
+#define TFT_OFFSET_X 0
+#define TFT_OFFSET_Y 0
+#define TFT_OFFSET_ROTATION 0
+#define TFT_BL 45
+#define SCREEN_ROTATE
+#define SCREEN_TRANSITION_FRAMERATE 5 // fps
+
+#define HAS_TOUCHSCREEN 1
+#define SCREEN_TOUCH_INT (6 | IO_EXPANDER)
+#define SCREEN_TOUCH_RST (7 | IO_EXPANDER)
+#define TOUCH_I2C_PORT 0
+#define TOUCH_SLAVE_ADDRESS 0x48
+
+// Buzzer
+#define PIN_BUZZER 19
+
+#define HAS_GPS 0
+#undef GPS_RX_PIN
+#undef GPS_TX_PIN
+
+#define USE_SX1262
+#define USE_SX1268
+
+#define LORA_SCK 41
+#define LORA_MISO 47
+#define LORA_MOSI 48
+#define LORA_CS (0 | IO_EXPANDER)
+
+#define LORA_DIO0 -1 // a no connect on the SX1262 module
+#define LORA_RESET (1 | IO_EXPANDER)
+#define LORA_DIO1 (3 | IO_EXPANDER) // SX1262 IRQ
+#define LORA_DIO2 (2 | IO_EXPANDER) // SX1262 BUSY
+#define LORA_DIO3
+
+#define SX126X_CS LORA_CS
+#define SX126X_DIO1 LORA_DIO1
+#define SX126X_BUSY LORA_DIO2
+#define SX126X_RESET LORA_RESET
+#define SX126X_DIO2_AS_RF_SWITCH