Свайп экранов вправо и влево

#include <TFT_eSPI.h>
#include <LilyGo_AMOLED.h>

LilyGo_Class amoled;

TFT_eSPI TFT = TFT_eSPI();
TFT_eSprite RED = TFT_eSprite(&TFT);
TFT_eSprite BLUE = TFT_eSprite(&TFT);
TFT_eSprite GREEN = TFT_eSprite(&TFT);

void setup(void)
{
    amoled.beginAMOLED_191();

    RED.createSprite(536,240);
    BLUE.createSprite(536,240);
    GREEN.createSprite(536,240);

    TEST1();
}

bool first = true;

void loop()
{
    static int16_t x, y, x1, i;
    bool touched = amoled.getPoint(&x, &y);
    if (touched)
    {
      if (x1 - x > 100)
      {
        ++i;
        if (i > 2)
          i = 0;
        
      }
      if (x - x1 > 100 )
      {
          --i;
          if (i < 0)
            i = 2;
      }
    }
    else
    {
      x1 = x;
      first = true;
    }
    if (touched && first)
    {
      x1 = x;
      first = false;
    }
    if (i == 0)
      CONNECTION();
    else if (i == 1)
      MEASUREMENT();
    else if (i == 2)
      OSCILLOSCOPE();
}


void TEST1()
{
  RED.fillRect(0,0,536,240,TFT_RED);   
  amoled.pushColors(0,0,536,240,(uint16_t *)RED.getPointer());
}

void TEST2()
{
  BLUE.fillRect(0,0,536,240,TFT_BLUE);  
  amoled.pushColors(0,0,536,240,(uint16_t *)BLUE.getPointer());
}

void TEST3()
{
  GREEN.fillRect(0,0,536,240,TFT_GREEN);  
  amoled.pushColors(0,0,536,240,(uint16_t *)GREEN.getPointer());
}

Вроде код свайпает экраны, но если быстро нажать на экран, а затем нажать радом то он тоже это зачтёт за свайп. (если вдруг важно, на чём делаю, то на этом модуле (сенсорная версия) T-Display S3 AMOLED – LILYGO® )
Как правильно организовать свайп экранов?

В “штатных функциях” библиотек для сенсорных экранов отслеживается только факт касания экрана, а не факт отпускания или удержания на нём стилуса. Поэтому краткие касания от протяжки не отличаются. Это надо самому выдумывать используя миллис и делей. В моей теме про записку на ILI9488 есть вроде пример про писание текста от стилуса, там именно это, фиксируется событие отрыва стилуса от экрана для начала нового слова.

Это одно и то же.

Если Вы считаете, что существует какая-то разница, то попытайтесь сформулировать, в чем она состоит.

Наверняка есть готовые библиотеки подобно библиотекам для кнопок.

Свайп это несколько (более двух)последовательных нажатий , выполненных в определенном направлении и с определенной скоростью. Число нажатий, направление и скорость можно использовать для более точного выбора между свайпом и просто отдельными касаниями

Возможно скорость не главное. В Андроид, например, верхнюю шторку можно “вытянуть” как медленно, так и быстро.

Главное, чтобы между касаниями не было больших временных промежутков. Под “больших” подразумевается время, позволяющее совершить два последовательных тапа с макс. возможной скоростью.

Лучше делать на постоянной протяжке, тогда по её скорости ещё можно разделять события - быстрая протяжка или медленная. Я хотел поопытничать, но не вижу практически интересного применения.

Так в чем разница то?

См. #6.

Ну раз ты реагируешь на сообщения, предназначенные ТС, то, может, ответишь, в чем разница?
Примерно по такой схеме:

  1. Свайп это <определение>.
  2. “нажать радом” это <определение>.
  3. 1 и 2 различаются следующим:
  • <первое отличие>
  • <второе отличие>
  • <третье отличие>
  • <четвертое отличие>

Ты отреагировал на сообщение от @MMM, а я именно на него, так что вступление противоречит формальной логике.

  1. Управляющий жест при работе с сенсорным экраном, при котором палец кладут на экран и проводят в каком-либо направлении. Викисловарь.
  2. Касание - прикосновение к сенсорному экрану управляющим предметом (пальцем руки, ноги , стилусом и т.д) с последующим отрывом вышеупомянутого предмета от экрана. Касание может быть одиночным или многократным, длинным и коротким, приходится на одну и ту же область экрана или на разные, в т.ч и расположенные “рядом”.

Касание - постоянное воздействие на определенную область экрана. Размер этой области задается программой. Свайп - последовательное воздействие на соседние области экрана в определенном направлении.
Касание фиксируется если управляющий предмет оторван от экрана или не перемещается в течение опр. промежутка времени в пределах первоначальной области, в отличие от свайпа.

Прим 1.
Ввиду несовершенства сенсора может быть заложен временной интервал, в течение которого программа не реагирует на ложное отсутствие сигнала при касании либо свайпе. Этот интервал должен быть меньше, чем время, за которое человек физически способен совершить повторное касание…

Ну и давай без “я не про это спрашивал”. В вопросе ТС шла речь именно про даблтап в соседних областях экрана.

Не знаю, у меня на смартфоне прокрутка так: приложил палец и двигаешь по экрану, скорость прокрутки синхронизирована со скоростью пальца. Ни на какие серии быстрых касаний не реагирует. Явно фиксируется событие отрыва пальца от экрана для исключения реакции на это :slight_smile:

Дык патамушта программа написана грамотно и сенсор неплохой.

МК не знает, что такое “жест”, что такое “палец” и что такое “проводят”. Чтобы найти решение задачи, ее нужно сформулировать в терминах понятных МК: высокий и низкий уровень, напряжение на аналоговом входе, дребезг, шум и т.д.

Ну вот и вышли на возможного виновника: неадекватная величина временного интервала.

Собственно, это универсальный метод решения подобных задач: представить себя на месте МК, а также сформулировать задачу в понятных терминах.

Ты просил “определение”, я его дал. Определение, понятное человеку. Но тут почему-то выплывает это:

нескладуха, не находишь?

Может, нужно дочитывать до конца пост, на который отвечаешь?

Как я понял в терминологии вы разобрались, а по поводу решения, есть идеи?

Собственно во втором сообщении @lilik всё написал. Для распознавания свайпа нужно распознавать два события - касание и отпускание, и смотреть разность их координат. Вот примерчик вроде как раз про это: Swipe Gestures Using a TFT Display
И готовые библиотеки про это есть, например: TouchEvent

Нет. Оказывается я путал со скроллом.

…Коснулись пальцем экрана один раз и запустили приложение, провели пальцем по эрану вверх или вниз – прокрутили страницу (это действие носит название «скролл»), смахнули пальцем вправо или влево и перелистнули страницу ( «свайп»)…

Определять событие отпускания пальца с экрана.

Спасибо за библиотеку, вот решение задачи:

        
    if (touched && !first && is_touch)
    {
      if (x1 - x > 100)
      {
        ++i;
        if (i > 7)
          i = 0;
        first = true;
        is_touch = false;
        
      }
      if (x - x1 > 100 )
      {
          --i;
          if (i < 0)
            i = 7;
          first = true;
          is_touch = false;
      }

      
      if (y - y1 > 100 )
      {
          if (n == 0)
            n = 1;
          if (n == 2)
            n = 0;
          first = true;
          is_touch = false;
      }
      if (y1 - y > 100 )
      {
          if (n == 0)
            n = 2;
          if (n == 1)
            n = 0;
          first = true;
          is_touch = false;
      }
      
    }
    if (!touched)
    {
      y1 = y;
      x1 = x;
      first = true;
      is_touch = true;
      Serial.println(x);
    }
    if (touched && first)
    {
      x1 = x;
      y1 = y;
      first = false;
    }