ILI9488 3,95 дюйма, сенсорный экран

Это по поводу 256?

А есть толковое описание функций библиотеки?

Тут мимоходом оказывается поддерживается сенсорный экран библиотекой, а я сочиняю роман :slight_smile:

//вывод фотокартинок
#include <Adafruit_GFX.h>
#include <TFT_eSPI.h> 
#include <SPI.h>
#include <XPT2046_Touchscreen.h>// Библиотека для работы с сенсорным экраном
#include "ris_.h"//файл хранения массивов фотокартинок
TFT_eSPI tft = TFT_eSPI();// 
#define CS_PIN  14
XPT2046_Touchscreen ts(CS_PIN);  // Param 2 - NULL - No interrupts
int st=1;//

void setup() {
 tft.init();
 tft.setRotation(4);
 tft.fillScreen(tft.color565(0,0,0));
 ts.begin();
  ts.setRotation(1);
  }
void loop() {
int x, y;                         // Переменные для работы с координатами нажатий
 
  if(ts.touched())         // Пока имеются данные с сенсорного модуля
  {
    st++;if(st>2){st=1;}//листаем касанием экрана
   if(st==1){draw_Ris(0,0,ris_00,320,480);}
   if(st==2){draw_Ris(0,0,ris_11,320,480);} 
  /*  
    TS_Point p = ts.getPoint();                      // Считываем с него данные
    x = map(p.x,220,3720,0,320);                  // Считываем и преобразуем координату нажатия X
    y =map(p.y,275,3830,0,240);                   // Считываем и преобразуем  координату нажатия Y 
     x = x*1.42;// поправки с учётом размера экрана                 
     y = y*1.35;//           
    if((x!=-1) && (y!=-1))          // Если обе координаты в положительном диапазоне (т.е. если есть нажатие) 
    {
      x += 0;                      // Корректируем координату с учетом калибровочных данных
      y += 0;                       // Корректируем координату с учетом калибровочных данных
   // 
    
 
   //   
      }
    */  
  }
   delay(20);//
}
//
void draw_Ris(int x, int y, const uint8_t *bitmap, int w, int h) { //функция вывода фотокартинки
  if (x < 0 || x + w > 320 || y < 0 || y + h > 480) {
    return;
  }
  tft.setAddrWindow(x,y,w ,h );
  for (int j = 0; j < h; j++) {
    for (int i = 0; i < 2 * w; i = i + 2) {
      tft.pushColor(256 * bitmap[i + 1 + j * 2 * w] + bitmap[i + j * 2 * w]);
    }
  }
}
//

…Пробовал компилировать под ЕСП32, не прошло, пишет много чего, но основная идея:

hal/gpio_ll.h: No such file or directory

Это что может быть?

От вас странно это слышать ! Не видит файла и/или каталог …

с тачем для этой библиотеки ты что-то перемудрил, там всё внутрях есть, вот демо глянь

#include "FS.h"
#include <SPI.h>
#include <TFT_eSPI.h>
TFT_eSPI tft = TFT_eSPI();

#define CALIBRATION_FILE "/calibrationData"

void setup(void) {
  uint16_t calibrationData[5];
  uint8_t calDataOK = 0;

  Serial.begin(115200);
  Serial.println("starting");

  tft.init();

  tft.setRotation(3);
  tft.fillScreen((0xFFFF));

  tft.setCursor(20, 0, 2);
  tft.setTextColor(TFT_BLACK, TFT_WHITE);  tft.setTextSize(1);
  tft.println("calibration run");

  // check file system
  if (!SPIFFS.begin()) {
    Serial.println("formatting file system");

    SPIFFS.format();
    SPIFFS.begin();
  }

  // check if calibration file exists
  if (SPIFFS.exists(CALIBRATION_FILE)) {
    File f = SPIFFS.open(CALIBRATION_FILE, "r");
    if (f) {
      if (f.readBytes((char *)calibrationData, 14) == 14)
        calDataOK = 1;
      f.close();
    }
  }
  if (calDataOK) {
    // calibration data valid
    tft.setTouch(calibrationData);
  } else {
    // data not valid. recalibrate
    tft.calibrateTouch(calibrationData, TFT_WHITE, TFT_RED, 15);
    // store data
    File f = SPIFFS.open(CALIBRATION_FILE, "w");
    if (f) {
      f.write((const unsigned char *)calibrationData, 14);
      f.close();
    }
  }

  tft.fillScreen((0xFFFF));

}

void loop() {
  uint16_t x, y;
  static uint16_t color;

  if (tft.getTouch(&x, &y)) {

    tft.setCursor(5, 5, 2);
    tft.printf("x: %i     ", x);
    tft.setCursor(5, 20, 2);
    tft.printf("y: %i    ", y);

    tft.drawPixel(x, y, color);
    color += 155;
  }
}



Это я перевёл.

:slight_smile: Я не знаю, что он не видит.

hal/gpio_ll.h из этого что то

Да посмотрел, попробовал компилировать, там он не видит класс.

'class TFT_eSPI' has no member named 'setTouch'

По идее в файле пользователя надо где то указать пин cs для сенсора как минимум, а где он, не нашёл.

у меня с 220 строки, смотрим

// For ESP32 Dev board (only tested with GC9A01 display)
// The hardware SPI can be mapped to any pins

#define TFT_MOSI 13 // In some display driver board, it might be written as "SDA" and so on.
#define TFT_SCLK 14
#define TFT_CS   15  // Chip select control pin
#define TFT_DC   17  // Data Command control pin
#define TFT_RST  16  // Reset pin (could connect to Arduino RESET pin)
#define TFT_BL   22  // LED back-light

#define TOUCH_CS 21     // Chip select pin (T_CS) of touch screen

//#define TFT_WR 22    // Write strobe for modified Raspberry Pi TFT only

Сейчас ещё раз поищу.

Попробовал, калибровочный пример работает. Как данные калибровки сохранить и где они?
В своём примере пришлось по своему калибровать:

//ЗАПИСКА
#include "Adafruit_GFX.h"     // Библиотека обработчика графики
#include <SPI.h>          
#include <TFT_eSPI.h>       // Hardware-specific library
TFT_eSPI tft = TFT_eSPI();  // Invoke custom library

uint16_t color=tft.color565(0,0,0);
int xx=0;int yy=21;//
byte flag=0;//
long Y=0;//

void setup(){
  tft.init();
  tft.setRotation(3);               // Переводим дисплей в альбомную ориентацию
 tft.fillScreen(color);panel();//начальная отрисовка зон экрана
 }
 
void loop()
{
  if(millis()-Y>150&&flag!=3){flag=1;}// условие прерывающие рисование серии отрезков после паузы в 0,15 секунды (не касаемся стилусом экрана)
  uint16_t x, y;                         // Переменные для работы с координатами нажатий
 
  if (tft.getTouch(&x, &y)) {
    Y=millis();//
   if((x!=-1) && (y!=-1))          // Если обе координаты в положительном диапазоне (т.е. если есть нажатие) 
    {
      x += 0 ;                      // Корректируем координату с учетом калибровочных данных
      y += 5;                       // Корректируем координату с учетом калибровочных данных
      x=480-x*0.97;
      y=y*1.00;
   // 
     // 
       
      if(y<20&&x>320&&x<480){ tft.fillRect(320,0,160,20,tft.color565(0,255,0));delay(20);tft.fillRect(320,0,160,20,tft.color565(255,0,0)); tft.fillRect(0,20,480,320,tft.color565(0,0,0) );xx=0,yy=21;flag=0;panel();}//стираем рисунок
      if(y>20&&flag==2){tft.drawLine(x, y, xx, yy,tft.color565(255,255,255));xx=x;yy=y;}//рисуем отрезок выбранным цветом
      if(y>20&&flag==3){xx=x;yy=y;tft.fillCircle(xx, yy,6,tft.color565(0,0,0)  );}//режим стирательной резинки
      if(y<20&&x>160&&x<320){flag=3;tft.fillRect(160,0,160,20,tft.color565(0,255,0));delay(20);tft.fillRect(160,0,160,20,tft.color565(100,100,100));}//включаем режим стирательной резинки 
      if(y>20&&flag==1){flag=2;xx=x;yy=y;}//начало рисования новой серии отрезков
      if(y<20&&x>0&&x<160){flag=1;tft.fillRect(0,0,160,20,tft.color565(0,255,0));delay(20);tft.fillRect(0,0,160,20,tft.color565(255,255,255));}//включаем режим рисования отрезками
      
     //   
 
   //   
      }
  }
   delay(20);//
// NVIC_SystemReset();//програмная перезагрузка платы   
}
////////////////////
void panel(){
 tft.fillRect(0,0,160,20,tft.color565(255,255,255));//кнопка рисования отрезками
 tft.fillRect(160,0,160,20,tft.color565(100,100,100));//кнопка стирашки 
 tft.fillRect(320,0,160,20,tft.color565(255,0,0));//кнопка очистки экрана  
}

строки 27-30.
В плане сенсора библиотека не лучше внешней и даже рвёт линию рисования при постоянном прижиме. Обе уступают в чистописании букв библиотеке для UNO, но для жатия мелких кнопок пойдёт:)

Нашёл решение здесь. Авторы библиотек не согласованы, вина как я понял от ESP32.

…писец, а не программирование :slight_smile: Вот это бред самый настоящий… Не пробовали пины прямо в скетчах писать, а этот юзерский файл игнорить?

библиотека LVGL тогда в помощь, там можно конфигурировать в скетче

Не, хватит пока, нельзя же все пробовать. На ESP32 всё заработало, чуть лучше чем на RP2040.

@lilik , это просто уникум данного форума он может как удивлять, так и поражать. И всё это в один день )))

Ну для макетирования электронной записки в рукописном и печатном варианте вполне хватает УНО. RP2040 и ESP32 это уже любопытство, а вдруг лучше ?, ну и ковырятельство в библиотеках.
Благо, что один скетч можно на разных платах проверять. ESP32 пойдёт.



…Лучше когда узнаёшь руку, а не палец :slight_smile:

Решил клавиатуру не ставить картинкой, а просто написать её :slight_smile:

стареешь дорогой :grinning:
не разочаровывай нас!

1 лайк

Тогда с уной вариант не проскочит. Да и нету забористых картинок виртуальный клав с русскими буквами, всё какая то мелочёвка.



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

//ЗАПИСКА
//#include "Adafruit_GFX.h"     // Библиотека обработчика графики
#include <SPI.h>          
#include <TFT_eSPI.h>       // Hardware-specific library
TFT_eSPI tft = TFT_eSPI();  // Invoke custom library
#define h  5 //
uint16_t color=tft.color565(0,0,0);
uint16_t x, y;// Переменные для работы с координатами нажатий
int Xk=0,Yk=h;// переменные хранения положения курсора
String znaki[]={"1","2","3","4","5","6","7","8","9",",","."," ","0",
                "Й","Ц","У","К","Е","Н","Г","Ш","Щ","З","Х"," ","Ъ",            
                "Ф","Ы","В","А","П","Р","О","Л","Д","Ж","Э"," ","?",
                "Я","Ч","С","М","И","Т","Ь","Б","Ю",";","!"," ","*",
};
 

void setup(){
 Serial.begin(9600);
tft.init();
tft.setRotation(3);// Переводим дисплей в альбомную ориентацию
tft.fillScreen(color);//заливка фона
tft.setTextSize(3); tft.setTextColor(tft.color565(255,255,255),tft.color565(255,0,0));// отрисовка клавиатуры
tft.setCursor(120,220); tft.println("123456789,. 0");
tft.setCursor(120,245); tft.println("ЙЦУКЕНГШЩЗХ Ъ");
tft.setCursor(120,270); tft.println("фЫВАПРОЛДЖЭ ?");
tft.setCursor(120,295); tft.println("ЯЧСМИТЬБЮ;! *");
tft.setTextColor(tft.color565(255,255,255),tft.color565(0,0,0));//
 }
 
void loop()
{
  if (tft.getTouch(&x, &y)) {
   
   if((x!=-1) && (y!=-1))          // Если обе координаты в положительном диапазоне (т.е. если есть нажатие) 
    {
      x += 0 ;                      // Корректируем координату с учетом калибровочных данных
      y += 5;                       // Корректируем координату с учетом калибровочных данных
      x=480-x*0.97;
      y=y*1.00;
   // 
     // 
      //Serial.print(x);Serial.print(" ");Serial.println(y); 
      klava();
     //   
 
   //   
      }
  }
   delay(100);//
 }
//
void klava(){
 int N=0;
 N=(x-120)/18+((y-220)/25)*13;//определяем соответсвие нажатой кнопки-буквы и номера буквы в массиве
// Serial.println(N);

if(N!=11&&N!=24&&N!=37){//пишем буквы
tft.setCursor(Xk,Yk);tft.print(znaki[N]);Xk=Xk+18;if(Xk>18*25&&Yk<192){Xk=0;Yk=Yk+24;}
tft.setTextColor(tft.color565(255,255,255),tft.color565(255,0,0));tft.print(" ");tft.setTextColor(tft.color565(255,255,255),tft.color565(0,0,0));//
}
if(N==11){//стираем курсором
tft.setCursor(Xk,Yk);tft.print(" ");Xk=Xk-18;if(Yk>h&&Xk<0){Xk=18*25;Yk=Yk-24;}if(Xk<0){Xk=0;}tft.setCursor(Xk,Yk);
tft.setTextColor(tft.color565(255,255,255),tft.color565(255,0,0));tft.print(" ");tft.setTextColor(tft.color565(255,255,255),tft.color565(0,0,0));//  
} 

}
//

Нет, для полной аутентичности нужно заменить “,” на “ЗПТ”, а “.” - на “ТЧК”.

1 лайк