Это по поводу 256?
А есть толковое описание функций библиотеки?
Тут мимоходом оказывается поддерживается сенсорный экран библиотекой, а я сочиняю роман
//вывод фотокартинок
#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;
}
}
Это я перевёл.
Я не знаю, что он не видит.
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.
…писец, а не программирование Вот это бред самый настоящий… Не пробовали пины прямо в скетчах писать, а этот юзерский файл игнорить?
библиотека LVGL тогда в помощь, там можно конфигурировать в скетче
Не, хватит пока, нельзя же все пробовать. На ESP32 всё заработало, чуть лучше чем на RP2040.
@lilik , это просто уникум данного форума он может как удивлять, так и поражать. И всё это в один день )))
Ну для макетирования электронной записки в рукописном и печатном варианте вполне хватает УНО. RP2040 и ESP32 это уже любопытство, а вдруг лучше ?, ну и ковырятельство в библиотеках.
Благо, что один скетч можно на разных платах проверять. ESP32 пойдёт.
…Лучше когда узнаёшь руку, а не палец

стареешь дорогой
не разочаровывай нас!
Тогда с уной вариант не проскочит. Да и нету забористых картинок виртуальный клав с русскими буквами, всё какая то мелочёвка.
Ну не очень печатное по сравнению с прописными и строчными…Надо добавить на досуге маленькие печатные, может чуть лучше будет смотреться. Влазит конечно больше.
//ЗАПИСКА
//#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));//
}
}
//
Нет, для полной аутентичности нужно заменить “,” на “ЗПТ”, а “.” - на “ТЧК”.