E-paper много

Да, именно этот хеловордовый код использовал. Спасибо за советы!
Ноги только пришлось поменять и в коде и в схеме.
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


Наткнулся среди фоток покупателей экранов на красивое использование. Не знаю что это правда.

да ладно, этож курс биткоена в долларах.
Красиво, но дорого - я так понял там по модулю на каждую цифру

:slight_smile:
Для индикации такого курса ничего не жалко.



Прикрутил к макетке с рисовалкой e paper. Экономия на мех.кнопках управления в пользу сенсорного экрана.

Сложно сенсорным экраном управлять из программы?.. Точнее брать с него данные?
Он там резистивный или емкостный, кстати?
Мой ещё едет с Али, причем СДЭКом, доедет ли…

Нет, не сложно. Простой код выдаёт координаты касания в привязке к пикселям экрана. Так реализована рисовалка:

// ПИКСЕЛЬНАЯ рисовалка 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 );
}


Или раскрашка:


Экран резистивный удобно работать стилусом и пальцем. Из практического применения я нашёл два - рисование и кнопочное управление.

Спасибо! меня только управление интересует.
Управление, меню-кнопки, движки + - , шкалы… Сколько фантазии хватит.

А может что-то и для рисования пригодится…

…полистал скетч - круто! такая функциональность при таком коротком скетче, класс. Думал для рисования надо что-то чертовски сложное.

Это GUI получается, типа такой:

Именно! И чтобы стилусом двигать больше-меньше и тп. и тут же это отображалось, и шкалой и цифрой, класс.

Пальцем тоже будет хорошо… можно с простых попробовать начать, с числами и без:



Попробую на досуге проработать математику регулятора на подобии дискового номеронабира́теля.

В осциллографе Миксиг можно вращением пальца развертку регулировать. (Там сенсорный экран)

Часть механики регулятора.
VID_20240605_075838
Для её объяснения надо целый параграф писать :frowning:

#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);//метка отсчёта
}
     
      }
  }    
 
}  
}
///////////////////

VID_20240605_162132

#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);//метка отсчёта    
}
     
      }
  }    
 
}  
}
///////////////////

Надо геометрию школьную знать :slight_smile: Без пояснений через месяц всё забудется.

“были и мы рысаками когда-то” ))

мотание цифры круто, но в реале неудобно ИМХО. Я бы оставил цифру в середине. Но вообще здорово. Пока руки не дошли, как и сама плата.

Дак с андроида надо срисовать. Там как на дисковом телефоне - цифири по кругу, а выделение как у тебя.

Вот такого типа можно подумать как похожим набор сделать примитивными средствами геометрии :slight_smile: В точности конечно графику не повторить.

у нас в коридоре такой висел, ни у кого не было, ходили к нам позвонить ))

а ты периодически полярность на входе менял, признавайся )))