From fce458220bcb84ac34f9389848454492cd0ec402 Mon Sep 17 00:00:00 2001 From: Fritz Heiden Date: Tue, 20 May 2025 20:16:08 +0200 Subject: [PATCH] feat: add basic screen support --- include/TFT_eSPI_Setup_ILI9341_ESP32.h | 37 ++++++++++++++++++++++ platformio.ini | 9 +++++- src/main.cpp | 43 +++++++++++++++++++++++--- 3 files changed, 84 insertions(+), 5 deletions(-) create mode 100644 include/TFT_eSPI_Setup_ILI9341_ESP32.h diff --git a/include/TFT_eSPI_Setup_ILI9341_ESP32.h b/include/TFT_eSPI_Setup_ILI9341_ESP32.h new file mode 100644 index 0000000..5bcacdd --- /dev/null +++ b/include/TFT_eSPI_Setup_ILI9341_ESP32.h @@ -0,0 +1,37 @@ +// See SetupX_Template.h for all options available +#define USER_SETUP_ID 42 + +#define ILI9341_DRIVER + +#define TFT_MISO 19 // (leave TFT SDO disconnected if other SPI devices share MISO) +#define TFT_MOSI 23 +#define TFT_SCLK 18 +#define TFT_CS 5 // Chip select control pin +#define TFT_DC 2 // Data Command control pin +#define TFT_RST 4 // Reset pin (could connect to RST pin) + +// Optional touch screen chip select +//#define TOUCH_CS 5 // Chip select pin (T_CS) of touch screen + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT + +// TFT SPI clock frequency +// #define SPI_FREQUENCY 20000000 +// #define SPI_FREQUENCY 27000000 +// #define SPI_FREQUENCY 40000000 +#define SPI_FREQUENCY 55000000 // STM32 SPI1 only (SPI2 maximum is 27MHz) +// #define SPI_FREQUENCY 80000000 + +// Optional reduced SPI frequency for reading TFT +#define SPI_READ_FREQUENCY 16000000 + +// SPI clock frequency for touch controller +#define SPI_TOUCH_FREQUENCY 2500000 diff --git a/platformio.ini b/platformio.ini index de2cdfb..37b8853 100644 --- a/platformio.ini +++ b/platformio.ini @@ -13,4 +13,11 @@ platform = espressif32 board = esp32doit-devkit-v1 framework = arduino monitor_speed = 115200 -lib_deps = ruiseixasm/Versatile_RotaryEncoder@^1.3.1 +lib_deps = + ruiseixasm/Versatile_RotaryEncoder@^1.3.1 + bodmer/TFT_eSPI@^2.5.43 +build_flags = + -Os + -D CORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_DEBUG + -D USER_SETUP_LOADED=1 + -include $PROJECT_INCLUDE_DIR/TFT_eSPI_Setup_ILI9341_ESP32.h diff --git a/src/main.cpp b/src/main.cpp index d5ae9a4..426eacb 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,9 +1,15 @@ #include #include +#include +#include + +#define SCREEN_WIDTH 320 +#define SCREEN_HEIGHT 240 +#define FONT_SIZE 2 const int ONBOARD_LED_PIN = 2; const int ANALOG_INPUT_PIN = 34; -const int ANALOG_OUTPUT_PIN = 32; +const int ANALOG_OUTPUT_PIN = 25; const int ENTER_BUTTON_PIN = 14; const int ENCODER_A_PIN = 12; @@ -20,6 +26,8 @@ void handlePress(); void handleRelease(); void handleRotate(int8_t rotation); +TFT_eSPI tft = TFT_eSPI(); + void setup() { Serial.begin(115200); @@ -38,6 +46,17 @@ void setup() xTaskCreate(handleToneGeneration, "handleToneGeneration", 2048, NULL, 1, NULL); xTaskCreate(handleInputControls, "handleInputContols", 2048, NULL, 1, NULL); + + tft.init(); + tft.setRotation(1); + delay(100); + tft.fillScreen(TFT_BLACK); + tft.setTextColor(TFT_WHITE, TFT_BLACK); + + int centerX = SCREEN_WIDTH / 2; + int centerY = SCREEN_HEIGHT / 2; + tft.drawCentreString("Setup complete.", centerX, centerY, FONT_SIZE); + Serial.println("setup complete"); } @@ -87,6 +106,12 @@ void handlePress() { Serial.println("Encoder pressed"); digitalWrite(ONBOARD_LED_PIN, HIGH); + + int centerX = SCREEN_WIDTH / 2; + int centerY = SCREEN_HEIGHT / 2; + + tft.fillScreen(TFT_BLACK); + tft.drawCentreString("Button pressed.", centerX, centerY, FONT_SIZE); } void handleRelease() @@ -95,14 +120,24 @@ void handleRelease() digitalWrite(ONBOARD_LED_PIN, LOW); } -void handleRotate(int8_t rotation) { +void handleRotate(int8_t rotation) +{ Serial.print("Encoder rotated by "); Serial.println(rotation); - if (rotation > 0) { + if (rotation > 0) + { frequency += 10; - } else if (rotation < 0) { + } + else if (rotation < 0) + { frequency -= 10; } Serial.print("Frequency: "); Serial.println(frequency); + + int centerX = SCREEN_WIDTH / 2; + int centerY = SCREEN_HEIGHT / 2; + + tft.fillScreen(TFT_BLACK); + tft.drawCentreString("Frequency: " + String(frequency) + "Hz", centerX, centerY, FONT_SIZE); } \ No newline at end of file