/**
* Detailed usage of the example can be found in the [README.md](./README.md) file
*/
#include <Arduino.h>
#include <esp_display_panel.hpp>
#include <lvgl.h>
#include "lvgl_v8_port.h"
using namespace esp_panel::drivers;
#define EXAMPLE_LCD_NAME ILI9341
#define EXAMPLE_LCD_WIDTH (320)
#define EXAMPLE_LCD_HEIGHT (240)
#define EXAMPLE_LCD_COLOR_BITS (16)
#define EXAMPLE_LCD_SPI_FREQ_HZ (40 * 1000 * 1000)
#define EXAMPLE_LCD_SPI_IO_CS (8)
#define EXAMPLE_LCD_SPI_IO_DC (17)
#define EXAMPLE_LCD_SPI_IO_SCK (15)
#define EXAMPLE_LCD_SPI_IO_SDA (16)
#define EXAMPLE_LCD_SPI_IO_SDO (-1)
#define EXAMPLE_LCD_RST_IO (18)
#define EXAMPLE_LCD_RST_LEVEL (1)
#define EXAMPLE_LCD_BL_IO (7)
#define EXAMPLE_LCD_BL_ON_LEVEL (1)
#define EXAMPLE_LCD_BL_OFF_LEVEL (0)
#define EXAMPLE_TOUCH_NAME FT5x06
#define EXAMPLE_TOUCH_ADDRESS (0)
#define EXAMPLE_TOUCH_WIDTH (320)
#define EXAMPLE_TOUCH_HEIGHT (240)
#define EXAMPLE_TOUCH_I2C_FREQ_HZ (400 * 1000)
#define EXAMPLE_TOUCH_READ_PERIOD_MS (130)
#define EXAMPLE_TOUCH_I2C_IO_SCL (5)
#define EXAMPLE_TOUCH_I2C_IO_SDA (4)
#define EXAMPLE_TOUCH_I2C_SCL_PULLUP (1)
#define EXAMPLE_TOUCH_I2C_SDA_PULLUP (1)
#define EXAMPLE_TOUCH_RST_IO (-1)
#define EXAMPLE_TOUCH_RST_ACTIVE_LEVEL (0)
#define EXAMPLE_TOUCH_INT_IO (-1)
#define _EXAMPLE_LCD_CLASS(name, ...) LCD_##name(__VA_ARGS__)
#define EXAMPLE_LCD_CLASS(name, ...) _EXAMPLE_LCD_CLASS(name, ##__VA_ARGS__)
#define _EXAMPLE_TOUCH_CLASS(name, ...) Touch##name(__VA_ARGS__)
#define EXAMPLE_TOUCH_CLASS(name, ...) _EXAMPLE_TOUCH_CLASS(name, ##__VA_ARGS__)
static LCD *create_lcd_without_config(void)
{
BusSPI *bus = new BusSPI(
EXAMPLE_LCD_SPI_IO_CS, EXAMPLE_LCD_SPI_IO_DC, EXAMPLE_LCD_SPI_IO_SCK,
EXAMPLE_LCD_SPI_IO_SDA, EXAMPLE_LCD_SPI_IO_SDO
);
return new EXAMPLE_LCD_CLASS(
EXAMPLE_LCD_NAME, bus, EXAMPLE_LCD_WIDTH, EXAMPLE_LCD_HEIGHT, EXAMPLE_LCD_COLOR_BITS, EXAMPLE_LCD_RST_IO
);
}
Touch *touch = nullptr;
static Touch *create_touch_without_config(void)
{
BusI2C *bus = new BusI2C(
EXAMPLE_TOUCH_I2C_IO_SCL, EXAMPLE_TOUCH_I2C_IO_SDA,
#if EXAMPLE_TOUCH_ADDRESS == 0
(BusI2C::ControlPanelFullConfig)ESP_PANEL_TOUCH_I2C_CONTROL_PANEL_CONFIG(EXAMPLE_TOUCH_NAME)
#else
(BusI2C::ControlPanelFullConfig)ESP_PANEL_TOUCH_I2C_CONTROL_PANEL_CONFIG_WITH_ADDR(EXAMPLE_TOUCH_NAME, EXAMPLE_TOUCH_ADDRESS)
#endif
);
return new EXAMPLE_TOUCH_CLASS(
EXAMPLE_TOUCH_NAME, bus, EXAMPLE_TOUCH_WIDTH, EXAMPLE_TOUCH_HEIGHT,
EXAMPLE_TOUCH_RST_IO, EXAMPLE_TOUCH_INT_IO
);
}
void setup()
{
Serial.begin(115200);
#if EXAMPLE_LCD_BL_IO >= 0
Serial.println("Initializing backlight and turn it off");
BacklightPWM_LEDC *backlight = new BacklightPWM_LEDC(EXAMPLE_LCD_BL_IO, EXAMPLE_LCD_BL_ON_LEVEL);
backlight->begin();
backlight->off();
#endif
Serial.println("Initializing \"SPI\" LCD");
auto lcd = create_lcd_without_config();
auto bus = static_cast<BusSPI *>(lcd->getBus());
bus->configSPI_FreqHz(EXAMPLE_LCD_SPI_FREQ_HZ);
/* Startup the LCD and operate it */
assert(lcd->begin());
lcd->displayOn();
touch = create_touch_without_config();
auto bus2 = static_cast<BusI2C *>(touch->getBus());
bus2->configI2C_FreqHz(EXAMPLE_TOUCH_I2C_FREQ_HZ);
bus2->configI2C_PullupEnable(EXAMPLE_TOUCH_I2C_SDA_PULLUP, EXAMPLE_TOUCH_I2C_SCL_PULLUP);
assert(touch->begin());
//Serial.println("Draw color bar from top left to bottom right, the order is B - G - R");
//lcd->colorBarTest();
#if EXAMPLE_LCD_BL_IO >= 0
Serial.println("Turn on the backlight");
backlight->on();
lvgl_port_init(lcd, touch);
lvgl_port_lock(-1);
lv_obj_t *label_1 = lv_label_create(lv_scr_act());
lv_label_set_text(label_1, "Hello World!");
lv_obj_set_style_text_font(label_1, &lv_font_montserrat_30, 0);
lv_obj_align(label_1, LV_ALIGN_CENTER, 0, -20);
lv_obj_t *label_2 = lv_label_create(lv_scr_act());
lv_label_set_text_fmt(
label_2, "ESP32_Display_Panel (%d.%d.%d)",
ESP_PANEL_VERSION_MAJOR, ESP_PANEL_VERSION_MINOR, ESP_PANEL_VERSION_PATCH
);
lv_obj_set_style_text_font(label_2, &lv_font_montserrat_16, 0);
lv_obj_align_to(label_2, label_1, LV_ALIGN_OUT_BOTTOM_MID, 0, 10);
lv_obj_t *label_3 = lv_label_create(lv_scr_act());
lv_label_set_text_fmt(label_3, "LVGL (%d.%d.%d)", LVGL_VERSION_MAJOR, LVGL_VERSION_MINOR, LVGL_VERSION_PATCH);
lv_obj_set_style_text_font(label_3, &lv_font_montserrat_16, 0);
lv_obj_align_to(label_3, label_2, LV_ALIGN_OUT_BOTTOM_MID, 0, 10);
lvgl_port_unlock();
#endif
}
void loop()
{
// Read all touch points and buttons
touch->readRawData(-1, -1, EXAMPLE_TOUCH_READ_PERIOD_MS);
std::vector<TouchPoint> points;
int i = 0;
touch->getPoints(points);
for (auto &point : points) {
Serial.printf("Touch point(%d): x %d, y %d, strength %d\n", i++, point.x, point.y, point.strength);
}
std::vector<TouchButton> buttons;
i = 0;
touch->getButtons(buttons);
for (auto &button : buttons) {
Serial.printf("Touch button(%d): %d\n", i++, button.second);
}
if (!touch->isInterruptEnabled()) {
delay(EXAMPLE_TOUCH_READ_PERIOD_MS);
}
}
Loading
ili9341-cap-touch
ili9341-cap-touch