Ввод данных с экрана (SPI)

sas

✩✩✩✩✩✩✩
7 Май 2020
2
0
Доброго времени суток, Господа! Подскажите, пожалуйста, есть ли возможность ввода данных (числовых значений) с сенсорного цветного экрана (типа
) для дальнейшей их обработки в программе?

Если такая тема уже создана прошу прощение за флуд.

Заранее спасибо!
 

Старик Похабыч

★★★★★★✩
14 Авг 2019
2,009
507
Москва
поясни что ты имеешь ввиду. Получать какие то данные (числа) используя тач скрин? Хочешь получить распознавание цифр?
 

sas

✩✩✩✩✩✩✩
7 Май 2020
2
0
да.оператор нажал на экран, у него вылез ввод данных?? или это лучше делать с добавлением клавиатуры? или других экранов, где есть реализованы блоки ввода данных (типа клавиатура?)

или сделать на экране 2 кнопки типа "+" и "-" , при нажатии на которых будет увеличивать и уменьшать вводимое значение параметра соответственно
 

Старик Похабыч

★★★★★★✩
14 Авг 2019
2,009
507
Москва
я тестировал такие экраны. Лучше делать с использованием экранной клавиатуры.
Вот кусочек видео:
Если обратите внимание кнопки плохо реагируют. Это один из 1-ых тестов, использовался стандартный определитель положения. (очень важно правильно провести калибровку). Далее я потратив день переписал в свой, выяснил, что сетка, отвечающая за определения положения, у меня не прямоугольник , не параллелепипед, и даже не трапеция, а просто какой то разносторонний четырехугольник.
Я нарисовал на экране 4 креста, центры были по 5 пикселей от краев экрана, сделал по десятку нажатий на каждый и получил средние значения , их и использовал в скетче (в самом низу). Сначала я пропорционально рассчитал х (т.к. он более стабильный был), а уже потом у, он у меня сильно кривой, поэтому там и умножение на коэффициент. В результате получил очень отзывчивый экранчик.

обработчик нажатий:
#define P_TIME 100

struct TP_point
{
  uint16_t x;
  uint16_t y;
};

uint16_t isPress(uint8_t yp, uint8_t xm, uint8_t ym , uint8_t xp)
{
  static uint32_t tm_m = 0;
  if (millis() - tm_m < P_TIME) return 0;
  tm_m = millis();

  pinMode(xp, OUTPUT);
  digitalWrite(xp, LOW);
  pinMode(ym, OUTPUT);
  digitalWrite(ym, HIGH);

  digitalWrite(xm, LOW);
  pinMode(xm, INPUT);
  digitalWrite(yp, LOW);
  pinMode(yp, INPUT);

  uint16_t z1 = analogRead(xm);
  uint16_t z2 = analogRead(yp);
  return (1023 - (z2 - z1));
};


uint16_t GetX(uint8_t yp, uint8_t xm, uint8_t ym , uint8_t xp)
{
  pinMode(yp, INPUT);
  pinMode(ym, INPUT);
  digitalWrite(yp, LOW);
  digitalWrite(ym, LOW);
  pinMode(xp, OUTPUT);
  digitalWrite(xp, HIGH);
  pinMode(xm, OUTPUT);
  digitalWrite(xm, LOW);
  return 1023 - analogRead(ym);
};



uint16_t GetY(uint8_t yp, uint8_t xm, uint8_t ym , uint8_t xp)
{
  pinMode(xp, INPUT);
  pinMode(xm, INPUT);
  digitalWrite(xp, LOW);
  digitalWrite(xm, LOW);
  pinMode(yp, OUTPUT);
  digitalWrite(yp, HIGH);
  pinMode(ym, OUTPUT);
  digitalWrite(ym, LOW);
  return 1023 - analogRead(xm);
};


TP_point GetXY(uint8_t yp, uint8_t xm, uint8_t ym , uint8_t xp)
{
  TP_point p;
  p.x = GetX(yp, xm, ym, xp);
  p.y = GetY(yp, xm, ym, xp);

  // коэффициенты только для моего экрана!
  p.y = constrain(map(p.y, 127, 903, 5, 235),0,239);
  p.x = constrain(map(p.x, (237 - 0.44 * (float)p.y), 930, 5, 315),0,319);
  return p;
}