Ili9341 и сенсорный экран

Иногда полезно прямо по ролику из Ютуба :slight_smile:
Немного переделать и рисовалка готова…Иногда подглючивает сенсорный экран и появляются артефакты, поэтому нужна стирашка как опция.

Вот я тоже такой. Когда нечего делать - сразу к звёздам. Причём, желательно, через альпы тернии.

1 лайк

Аналоговнет :slight_smile:

//рисовалка семицветная со стирашкой
#include "Adafruit_GFX.h"     // Библиотека обработчика графики
#include "Adafruit_ILI9341.h" // Программные драйвера для дисплеев ILI9341
#include "URTouch.h"          // Библиотека для работы с сенсорным экраном

#define TFT_DC 9              // Пин подключения вывода D/C дисплея
#define TFT_CS 10             // Пин подключения вывода CS дисплея
#define TFT_RST 8             // Пин подключения вывода RESET 
// Uno Hardware SPI
#define TFT_MISO 12           // Пин подключения вывода дисплея SDO(MISO)
#define TFT_MOSI 11           // Пин подключения вывода дисплея SDI(MOSI)
#define TFT_CLK 13            // Пин подключения вывода дисплея SCK

Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_CLK, TFT_RST, TFT_MISO);  // Создаем объект дисплея и сообщаем библиотеке распиновку для работы с графикой

#define t_SCK 3               // Пин подключения вывода дисплея T_CLK
#define t_CS 4                // Пин подключения вывода дисплея T_CS
#define t_MOSI 5              // Пин подключения вывода дисплея T_DIN
#define t_MISO 6              // Пин подключения вывода дисплея T_DOUT
#define t_IRQ 7               // Пин подключения вывода дисплея T_IRQ

URTouch ts(t_SCK, t_CS, t_MOSI, t_MISO, t_IRQ); // Создаем объект сенсорного модуля и сообщаем библиотеке распиновку для работы с ним

int x0 = 0, y0 = 21;
uint16_t color = tft.color565(0, 0, 0);
byte flag = 0; //

void setup() {
  tft.begin();                      // Инициализируем начало работы с графическим дисплеем
  tft.setRotation(1);               // Переводим дисплей в альбомную ориентацию

  ts.InitTouch();                   // Инициализируем сенсорный модуль дисплея
  ts.setPrecision(PREC_EXTREME);        // Определяем необходимую точность обработки нажатий: PREC_LOW - низкая, PREC_MEDIUM - средняя, PREC_HI - высокая, PREC_EXTREME - максимальная
  tft.fillScreen(ILI9341_BLACK);
  //
  tft.fillRect(0, 5, 319, 12, tft.color565(75, 75, 75) );
  for (int i = 1; i < 8; i++) {
    tft.fillCircle(30 * i, 10, 10, tft.color565(255 * (i % 2), 255 * ((i / 2) % 2), 255 * ((i / 4) % 2)) ); //строка кнопок - отрисовка
  }
  tft.drawCircle(250, 10, 10, tft.color565(255, 255, 255) );
  tft.drawCircle(290, 10, 10, tft.color565(255, 0, 0) );
  //
}

void loop()
{
  int x, y;                         // Переменные для работы с координатами нажатий

  while (ts.dataAvailable())        // Пока имеются данные с сенсорного модуля
  {
    ts.read();                      // Считываем с него данные
    x = ts.getX();                  // Считываем координату нажатия X
    y = ts.getY();                  // Считываем координату нажатия Y
    if ((x != -1) && (y != -1))     // Если обе координаты в положительном диапазоне (т.е. если есть нажатие)
    {
      x += 13;                      // Корректируем координату с учетом калибровочных данных
      y += 4;                       // Корректируем координату с учетом калибровочных данных
      //
      if (y < 24 && x > 280) {
        tft.fillRect(0, 21, 320, 240, ILI9341_BLACK );  //стираем рисунок
        x0 = 0, y0 = 21;
        color = tft.color565(0, 0, 0);
        flag = 0;
      }
      if (y > 24 && flag == 2) {
        tft.drawLine(x, y, x0, y0, color);  //рисуем отрезок выбранным цветом
        x0 = x;
        y0 = y;
      }
      if (y > 24 && flag == 3) {
        x0 = x;  //режим стирательной резинки
        y0 = y;
        tft.fillCircle(x0, y0, 5, tft.color565(0, 0, 0) );
      }
      if (y < 24 && x > 240 && x < 260) {
        flag = 3; //включаем режим стирательной резинки
      }
      if (y > 24 && flag == 1) {
        flag = 2;  //начало рисования новой серии отрезков
        x0 = x;
        y0 = y;
      }
      for (int i = 1; i < 8; i++) {
        if (y < 24 && x > 30 * i - 10 && x < 30 * i + 10) {
          flag = 1;  //выбираем цвет рисования
          color = tft.color565(255 * (i % 2), 255 * ((i / 2) % 2), 255 * ((i / 4) % 2));
        }
      }

      //
    }
  }
}

1 лайк

а так не лучше?

//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);

В теории должно быть лучше, но на практике - просто белый экран после загрузки.

предположу, что RESET дисплея не дёргается

Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);

Такой вариант загрузился, но экран белый.

видимо конфликт между soft и hard SPI


Шрек-Марио…
…Написал вариант пиксельной рисовалки в дополнение к отрезочной. Какие ещё есть варианты?

Практика баловства показала две необходимости - сделать палитру псевдонепрерывной, а не на 7 цветов и перейти на другой мк т.к. ресурсов для хранения графики нет. С первым вроде ясно, а вот со вторым нет. Библиотеки экрана и сенсорного модуля с RP2040 не хотят работать.


коли в библиотеке нет этого контроллера то очевидно жеж, что не заработает, может библиотеку от адафруита допилить
но сдаётся мне, что надо смотреть в сторону TFT_eSPI

Странно, на тех же st7735 библиотека от “адафрукт” работала и на уно, есп и “рассберри”. Другая для st7789 тоже и на есп и на RP2040, только номера выводов для spi менялись. Здесь почему то аппаратный спи не работает. И с библиотекой для тачскрина и без неё…


… Сделал палитру на 27 цветов и для фона и для квадратиков, убрал стирашку - теперь она не нужна. Добавил индикатор выбранного цвета.

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

Я пробовал пробный скетч без тачскрина - не работает хардовый. Ну ещё смешнее попытка обновить библиотеку Adafruit_ILI9341. После обновления пишет нет файла <Adafruit_SPITFT.h>. Ищем и понимаем, что он входит в состав библиотеки Adafruit-GFX-Library. Что же… и её меняем на новую… И удивляемся, теперь не хватает файла <Adafruit_I2CDevice.h> который входит в файл какого то “серого оледа” и т.д. Теперь искать ещё какую то библу? Что это вообще за пакетный подход?

Adafruit_BusIO.h

У них всё органично, для работы с разными шинами эта библиотека, далее общая графическая и для конкретного дисплея

Ясно, гармония, там где раньше две работало теперь надо три новых ставить… потом выяснится, что с библиотекой тачскрина они не сработаются :)… и на уно тоже.

Сделал вариант по подобию автора ролика, только пиксель-квадрат 5*5 точек.

1 лайк

Что за контроллер используется, @lilik ?

Плата ардуино уно.

«Под завязку» с такими картинками то?

Майнкрафт))