Hello! I use ili9341 and XPT2046 touchscreen display with esp32 in platformio with esp-idf. LVGL 8.1.
if i touch some known point i have a log
[0;32mI (341879) XPT2046: x = 61, y = 78␛[0m
␛[0;32mI (341914) XPT2046: x = 121, y = 156␛[0m
␛[0;32mI (341948) XPT2046: x = 121, y = 156␛[0m
␛[0;32mI (341983) XPT2046: x = 121, y = 156␛[0m
␛[0;32mI (342017) XPT2046: x = 121, y = 156␛[0m
␛[0;32mI (342051) XPT2046: x = 121, y = 155␛[0m
␛[0;32mI (342085) XPT2046: x = 60, y = 77␛[0m
␛[0;32mI (342119) XPT2046: x = 60, y = 77␛[0m
␛[0;32mI (342154) XPT2046: x = 121, y = 155␛[0m
␛[0;32mI (342188) XPT2046: x = 121, y = 155␛[0m
␛[0;32mI (342223) XPT2046: x = 121, y = 155␛[0m
␛[0;32mI (342257) XPT2046: x = 121, y = 155␛[0m
␛[0;32mI (342291) XPT2046: x = 121, y = 155␛[0m
␛[0;32mI (342325) XPT2046: x = 60, y = 77␛[0m
␛[0;32mI (342359) XPT2046: x = 60, y = 77␛[0m
Coordinates changes to half of original ? I use LVGL default drivers functions
lv_indev_drv_init(&indev_drv);
indev_drv.type = LV_INDEV_TYPE_POINTER;
indev_drv.read_cb = touch_driver_read;
lv_indev_drv_register(&indev_drv);
bool xpt2046_read(lv_indev_drv_t * drv, lv_indev_data_t * data)
{
static int16_t last_x = 0;
static int16_t last_y = 0;
bool valid = false;
int16_t x = last_x;
int16_t y = last_y;
if (xpt2048_is_touch_detected() == TOUCH_DETECTED)
{
x = xpt2046_cmd(CMD_X_READ);
y = xpt2046_cmd(CMD_Y_READ);
//ESP_LOGI(TAG, "P(%d,%d)", x, y);
x = x >> 4;
y = y >> 4;
//ESP_LOGI(TAG, "P_norm(%d,%d)", x, y);
xpt2046_corr(&x, &y);
xpt2046_avg(&x, &y);
last_x = x;
last_y = y;
ESP_LOGI(TAG, "x = %d, y = %d", x, y);
valid = true;
}
else
{
avg_last = 0;
}
data->point.x = x;
data->point.y = y;
data->state = (valid == false ? LV_INDEV_STATE_REL : LV_INDEV_STATE_PR);
return false;
}
if average xpt2046_avg(&x, &y); not commented coordinates are wrong and i have a lot of touch ing mistakes
if average xpt2046_avg(&x, &y); commented it is working bad video
i solved the problem like this:
bool xpt2046_read(lv_indev_drv_t * drv, lv_indev_data_t * data)
{
static int16_t last_x = 0;
static int16_t last_y = 0;
bool valid = false;
int16_t x = last_y;
int16_t y = last_y;
if (xpt2048_is_touch_detected() == TOUCH_DETECTED)
{
while(1)
{
x = xpt2046_cmd(CMD_X_READ);
y = xpt2046_cmd(CMD_Y_READ);
//ESP_LOGI(TAG, "P(%d,%d)", x, y);
x = x >> 4;
y = y >> 4;
//ESP_LOGI(TAG, "P_norm(%d,%d)", x, y);
xpt2046_corr(&x, &y);
if(x>0 && y>0) break;
}
xpt2046_avg(&x, &y);
ESP_LOGI(TAG, "x = %d, y = %d", x, y);
last_x = x;
last_y = y;
valid = true;
}
else
{
avg_last = 0;
}
data->point.x = x;
data->point.y = y;
data->state = (valid == false ? LV_INDEV_STATE_REL : LV_INDEV_STATE_PR);
return false;
}
may be its incorrect, but works