Да, именно этот хеловордовый код использовал. Спасибо за советы!
Ноги только пришлось поменять и в коде и в схеме.
GxEPD2_3C<GxEPD2_290_C90c, GxEPD2_290_C90c::HEIGHT> display(GxEPD2_290_C90c(/CS=5/ SS, /DC=/ 1, /RES=/ 0, /BUSY=/ 3)); // GDEM029C90 128x296, SSD1680
да ладно, этож курс биткоена в долларах.
Красиво, но дорого - я так понял там по модулю на каждую цифру
![]()
Для индикации такого курса ничего не жалко.
Сложно сенсорным экраном управлять из программы?.. Точнее брать с него данные?
Он там резистивный или емкостный, кстати?
Мой ещё едет с Али, причем СДЭКом, доедет ли…
Нет, не сложно. Простой код выдаёт координаты касания в привязке к пикселям экрана. Так реализована рисовалка:
// ПИКСЕЛЬНАЯ рисовалка 27 цветов
#include "Adafruit_GFX.h" // Библиотека обработчика графики
#include "Adafruit_ILI9341.h" // Программные драйвера для дисплеев ILI9341
#include <XPT2046_Touchscreen.h>// Библиотека для работы с сенсорным экраном
#include <SPI.h>
#define TFT_DC 20 // Пин подключения вывода D/C дисплея
#define TFT_CS 17 // Пин подключения вывода CS дисплея
#define CS_PIN 14
//#define TFT_RST -1 // Пин подключения вывода RESET
//#define TFT_MISO 16 // Пин подключения вывода дисплея SDO(MISO)
//#define TFT_MOSI 19 // Пин подключения вывода дисплея SDI(MOSI)
//#define TFT_CLK 18 // Пин подключения вывода дисплея SCK
//Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_CLK, TFT_RST, TFT_MISO); // Создаем объект дисплея и сообщаем библиотеке распиновку для работы с графикой
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);//
XPT2046_Touchscreen ts(CS_PIN); // Param 2 - NULL - No interrupts
uint16_t color=tft.color565(0,0,0);
int xx=0;int yy=21;//
byte flag=0;//
void setup(){
tft.begin(); // Инициализируем начало работы с графическим дисплеем
tft.setRotation(1); // Переводим дисплей в альбомную ориентацию
ts.begin();
ts.setRotation(1);
tft.fillScreen(color);panel();//начальная отрисовка зон экрана
}
void loop()
{
int x, y; // Переменные для работы с координатами нажатий
if(ts.touched()) // Пока имеются данные с сенсорного модуля
{
TS_Point p = ts.getPoint(); // Считываем с него данные
x = map(p.x,220,3720,0,319); // Считываем и преобразуем координату нажатия X
y =map(p.y,275,3830,0,240); // Считываем и преобразуем координату нажатия Y
if((x!=-1) && (y!=-1)) // Если обе координаты в положительном диапазоне (т.е. если есть нажатие)
{
x += 0; // Корректируем координату с учетом калибровочных данных
y += 0; // Корректируем координату с учетом калибровочных данных
//
//
if(y<20&&x>290){tft.fillRect(0,20,320,240,color );xx=0,yy=21;flag=0;panel();}//стираем рисунок
if(y>20&&flag==2){tft.drawLine(x, y, xx, yy,color);xx=x;yy=y;}//рисуем отрезок выбранным цветом
if(y>20&&flag==3){xx=x;yy=y;tft.fillCircle(xx, yy,3, color );}//режим стирательной резинки или толстой кисти
if(y<20&&x>0&&x<20){flag=3;}//включаем режим стирательной резинки или толстой кисти
if(y>20&&flag==1){flag=2;xx=x;yy=y;}//начало рисования новой серии отрезков
for(int i=0;i<27;i++){
if(y<20&&x>10*i+15&&x<10*i+25){flag=1;color=tft.color565(min(180*(i%3),255),min(180*((i/3)%3),255),min(180*((i/9)%3),255));tft.fillCircle(10,10,7,color);}//выбираем цвет рисования и отображаем на индикаторе выбранного цвета
}
//
//
}
}
delay(10);//
// NVIC_SystemReset();//програмная перезагрузка платы
}
////////////////////
void panel(){
for(int i=0;i<27;i++){
tft.fillRect(10*i+20,0,10,20,tft.color565(min(180*(i%3),255),min(180*((i/3)%3),255),min(180*((i/9)%3),255)));//строка кнопок - отрисовка
}
tft.drawRect(290,0,20, 20,ILI9341_RED );//кнопка стирания рисунка
tft.drawLine(290,0,310, 20,ILI9341_RED );
tft.drawLine(290,20,310, 0,ILI9341_RED );
}
Или раскрашка:
Экран резистивный удобно работать стилусом и пальцем. Из практического применения я нашёл два - рисование и кнопочное управление.
Спасибо! меня только управление интересует.
Управление, меню-кнопки, движки + - , шкалы… Сколько фантазии хватит.
А может что-то и для рисования пригодится…
…полистал скетч - круто! такая функциональность при таком коротком скетче, класс. Думал для рисования надо что-то чертовски сложное.
Именно! И чтобы стилусом двигать больше-меньше и тп. и тут же это отображалось, и шкалой и цифрой, класс.
В осциллографе Миксиг можно вращением пальца развертку регулировать. (Там сенсорный экран)
Часть механики регулятора.

Для её объяснения надо целый параграф писать ![]()
#include "Adafruit_GFX.h" // Библиотека обработчика графики
#include "Adafruit_ILI9341.h" // Программные драйвера для дисплеев ILI9341
#include <XPT2046_Touchscreen.h>// Библиотека для работы с сенсорным экраном
#include <SPI.h>
#define TFT_DC 20 // Пин подключения вывода D/C дисплея
#define TFT_CS 17 // Пин подключения вывода CS дисплея
#define CS_PIN 14
//#define TFT_RST -1 // Пин подключения вывода RESET
//#define TFT_MISO 16 // Пин подключения вывода дисплея SDO(MISO)
//#define TFT_MOSI 19 // Пин подключения вывода дисплея SDI(MOSI)
//#define TFT_CLK 18 // Пин подключения вывода дисплея SCK
//Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_CLK, TFT_RST, TFT_MISO); // Создаем объект дисплея и сообщаем библиотеке распиновку для работы с графикой
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);//
XPT2046_Touchscreen ts(CS_PIN); // Param 2 - NULL - No interrupts
int x, y; // Переменные для работы с координатами нажатий
uint16_t color_1=tft.color565(127,127,127);
uint16_t color_2=tft.color565(0,0,0);
uint16_t color_3=tft.color565(255,0,0);
bool raz=true;
int Xu,Yu,Xuu,Yuu;//текущие и предыдущие координаты центра указателя
void setup(){
tft.begin(); // Инициализируем начало работы с графическим дисплеем
tft.setRotation(1); // Переводим дисплей в альбомную ориентацию
ts.begin();
ts.setRotation(1);
tft.fillScreen(color_2);//фоновая заливка
}
void loop()
{
gui_1(160,120,100,70);
delay(100);
}
//////////////////
void gui_1(int Xr,int Yr,int R,int dr){//Xr,Yr-координаты расположения центра регулятора,R-радиус внешней окружности трека,dr-ширина трека
if(raz){raz=false;tft.fillCircle(Xr,Yr,R,color_1);tft.fillCircle(Xr,Yr,R-dr,color_2);tft.fillCircle(Xr,Yr-R+dr/2,dr/2,color_3);tft.fillCircle(Xr,Yr-R,R-dr,color_2);Xuu=Xr;Yuu=Yr-R+dr/2;}//однократная отрисовка при обращении к функции
else{
if(ts.touched())// Пока имеются данные с сенсорного модуля
{
TS_Point p = ts.getPoint(); // Считываем с него данные
x = map(p.x,220,3720,0,319); // Считываем и преобразуем координату нажатия X
y =map(p.y,275,3830,0,240); // Считываем и преобразуем координату нажатия Y
if((x!=-1) && (y!=-1)) // Если обе координаты в положительном диапазоне (т.е. если есть нажатие)
{
x += 0; // Корректируем координату с учетом калибровочных данных
y += 0; // Корректируем координату с учетом калибровочных данных
//
if((R-dr)*(R-dr)<(x-Xr)*(x-Xr)+(y-Yr)*(y-Yr)&&R*R>(x-Xr)*(x-Xr)+(y-Yr)*(y-Yr)){//проверка условия - попадает ли касание в трек указателя регулятора
//механика указателя
tft.fillCircle(Xuu,Yuu,dr/2,color_1);//
Xu=Xr+(R-dr/2)*(x-Xr)/(sqrt((x-Xr)*(x-Xr)+(y-Yr)*(y-Yr)));//
Yu=Yr+(R-dr/2)*(y-Yr)/(sqrt((x-Xr)*(x-Xr)+(y-Yr)*(y-Yr)));
tft.fillCircle(Xu,Yu,dr/2,color_3);//
Xuu=Xu;Yuu=Yu;
//
tft.fillCircle(Xr,Yr-R,R-dr,color_2);//метка отсчёта
}
}
}
}
}
///////////////////

#include "Adafruit_GFX.h" // Библиотека обработчика графики
#include "Adafruit_ILI9341.h" // Программные драйвера для дисплеев ILI9341
#include <XPT2046_Touchscreen.h>// Библиотека для работы с сенсорным экраном
#include <SPI.h>
#define TFT_DC 20 // Пин подключения вывода D/C дисплея
#define TFT_CS 17 // Пин подключения вывода CS дисплея
#define CS_PIN 14
//#define TFT_RST -1 // Пин подключения вывода RESET
//#define TFT_MISO 16 // Пин подключения вывода дисплея SDO(MISO)
//#define TFT_MOSI 19 // Пин подключения вывода дисплея SDI(MOSI)
//#define TFT_CLK 18 // Пин подключения вывода дисплея SCK
//Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_CLK, TFT_RST, TFT_MISO); // Создаем объект дисплея и сообщаем библиотеке распиновку для работы с графикой
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);//
XPT2046_Touchscreen ts(CS_PIN); // Param 2 - NULL - No interrupts
int x, y; // Переменные для работы с координатами нажатий
uint16_t color_1=tft.color565(127,127,127);
uint16_t color_2=tft.color565(0,0,0);
uint16_t color_3=tft.color565(255,0,0);
bool raz=true;
int Xu,Yu,Xuu,Yuu;//текущие и предыдущие координаты центра указателя
void setup(){
tft.begin(); // Инициализируем начало работы с графическим дисплеем
tft.setRotation(1); // Переводим дисплей в альбомную ориентацию
ts.begin();
ts.setRotation(1);
tft.fillScreen(color_2);//фоновая заливка
tft.setTextSize(4); tft.setTextColor(tft.color565(255,255,255));
}
void loop()
{
gui_1(160,120,100,70);
delay(100);
}
//////////////////
void gui_1(int Xr,int Yr,int R,int dr){//Xr,Yr-координаты расположения центра регулятора,R-радиус внешней окружности трека,dr-ширина трека
if(raz){raz=false;tft.fillCircle(Xr,Yr,R,color_1);tft.fillCircle(Xr,Yr,R-dr,color_2);tft.fillCircle(Xr,Yr-R+dr/2,dr/2,color_3);
Xuu=Xr;Yuu=Yr-R+dr/2;tft.setCursor(Xuu-22,Yuu-17);tft.println("0");tft.fillCircle(Xr,Yr-R,R-dr,color_2);}//однократная отрисовка при первом обращении к функции
else{
if(ts.touched())// Пока имеются данные с сенсорного модуля
{
TS_Point p = ts.getPoint(); // Считываем с него данные
x = map(p.x,220,3720,0,319); // Считываем и преобразуем координату нажатия X
y =map(p.y,275,3830,0,240); // Считываем и преобразуем координату нажатия Y
if((x!=-1) && (y!=-1)) // Если обе координаты в положительном диапазоне (т.е. если есть нажатие)
{
x += 0; // Корректируем координату с учетом калибровочных данных
y += 0; // Корректируем координату с учетом калибровочных данных
//
if((R-dr)*(R-dr)<(x-Xr)*(x-Xr)+(y-Yr)*(y-Yr)&&R*R>(x-Xr)*(x-Xr)+(y-Yr)*(y-Yr)){//проверка условия - попадает ли касание в трек указателя регулятора
//механика указателя
tft.fillCircle(Xuu,Yuu,dr/2,color_1);//
Xu=Xr+(R-dr/2)*(x-Xr)/(sqrt((x-Xr)*(x-Xr)+(y-Yr)*(y-Yr)));//
Yu=Yr+(R-dr/2)*(y-Yr)/(sqrt((x-Xr)*(x-Xr)+(y-Yr)*(y-Yr)));
//tft.fillCircle(Xu,Yu,dr/2,color_3);//
tft.fillCircle(Xu,Yu,dr/2,color_3);
Xuu=Xu;Yuu=Yu;
///
//вычисление числового эквивалента
tft.setCursor(Xu-22,Yu-17);
if(x>=Xr&&y<Yr){
tft.println(25-(int)(15.93*asin(abs(y-Yr)/(sqrt((x-Xr)*(x-Xr)+(y-Yr)*(y-Yr))))));
}
if(x>=Xr&&y>=Yr){
tft.println(25+(int)(15.93*asin(abs(y-Yr)/(sqrt((x-Xr)*(x-Xr)+(y-Yr)*(y-Yr))))));
}
if(x<Xr&&y>=Yr){
tft.println((int)(75-15.93*asin(abs(y-Yr)/(sqrt((x-Xr)*(x-Xr)+(y-Yr)*(y-Yr))))));
}
if(x<Xr&&y<Yr){
tft.println((int)(75+15.93*asin(abs(y-Yr)/(sqrt((x-Xr)*(x-Xr)+(y-Yr)*(y-Yr))))));
}
//
tft.fillCircle(Xr,Yr-R,R-dr,color_2);//метка отсчёта
}
}
}
}
}
///////////////////
Надо геометрию школьную знать
Без пояснений через месяц всё забудется.
“были и мы рысаками когда-то” ))
мотание цифры круто, но в реале неудобно ИМХО. Я бы оставил цифру в середине. Но вообще здорово. Пока руки не дошли, как и сама плата.
Дак с андроида надо срисовать. Там как на дисковом телефоне - цифири по кругу, а выделение как у тебя.
у нас в коридоре такой висел, ни у кого не было, ходили к нам позвонить ))
а ты периодически полярность на входе менял, признавайся )))












