TFT Display ili9341 240*320

Во-первых, RAW - это не формат. Так принято обозначать “сырые” данные, не имеющие формата. Обычно - полученные с матрицы фотоаппарата. Но при работе с МК зачастую так называю данные, преобразованные специально для загрузки в дисплей.

Чего же тут странного?
PNG - формат со сжатием, BMP - без сжатия, а RAW тоже сжатия не подразумевает.

16-ричный код - способ представления чисел в виде текста. К изображению никакого отношения не имеет. Поэтому надо радоваться, что ничего не изменилось, значит, не насажали новых ошибок поверх старых.

Нет.
Сжатый файл будет загружаться дольше, так как требуется дополнительное время на распаковку.

Нет.
Устройства поочередно используют “одни и те же пины” при общении с МК.
Т.е. МК сначала считывает некоторую порцию информации себе в память, потом передает ее на экран.
Естественно, есть ряд особенностей:

  1. Если у МК мало памяти, то изображение загружается в память и передается на дисплей по частям.
  2. Если изображение хранится в виде отличающемся от того, какой нужен дисплею, то после считывания с карты и передачей на дисплей изображение преобразуется к нужному виду.
  3. Если тзображение находится в сжатом формате, оно сначала распаковывается.

А это - как Вам удобнее.

Спасибо за развернутый ответ.

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

часть кода бы посмотреть(подрезать) как обращаться к таким регистрам памяти… читать записывать… желательно не 1но значение, а потоком…
а то psram даже 30 мб мало… а тут может скорость будет приемлема, и пригодится в будущем… например для подключения необычных мк с их памятью, по spi а то ии может выдать не понятно что…

По замыслу sd карта используется как Флеш память для хранения настроек/установок работы терморегулятора, и для хранения фонового изображения и двух индикаторов., таймер будет хранить время внутри себя. Сначала хотел использовать EPROM арлуинку для хранения установленных данных и не использовать sd карту, но потом перечитав кучу всяких примеров и мануалом понял что картинки фонового изображения и индикаторов в EPROM с таким объемом какой получался у меня не залить, и так же хранить изображение в виде пиксельного кода так же не вариант так как объема памяти у ардуины не хватает, переключился на работу с sd картой. Вроде как в разы проще, но все таки не догоняю в каком формате. Хранить изображения на карте. Были сомнения с параллельным подключением одноименных пинов дисплея и sd карты, но благодаря вам все встало на свои места. Осталось собрать тестовую модель и проверить функционал.

Что именно вас интересует в скетче? Какая его часть?

Сейчас корпус печатаю для этого барахла, передняя крышка распечаталась на 60% там где будет стоять дисплей, плата согласования уровней между дисплеем и ардуиной и энкодер для установки режимов работы и настройки режима работы.

4-16 мб psram в некоторых esp32 вам тоже мало ?))) а если хватает вам надо почитать про partition scheme arduino ide

я советовал если что использовать разные пины…

от andriano если он превратит дисплей в дополнительную память)))

Нет, дисплей как память я не думал даже об этом. Если на плате дисплея есть слот под sd решил применить его как стороннюю память для хранения настроек. Даже порывшись в барахла нашел sd карту на 128мб😄 которой должно хватить для хранения фонового изображения иконок и сохранения настроек.

С ESP вообще не работал никогда, по этому и не пытался сразу внедрить ее в проект.

Ещё вот такой вопрос, можно ли использовать готовую плату для преобразования уровней играла для дисплея или лучше по старинке на резюках сделать

Немножечко забросил. Пришел другой дисплей - у него свои проблемы. Пока с ними разбираюсь.
А по поводу использования свободной части видеопамяти, хоть в теме и есть намек, что это невозможно из-за того, как аппаратно сконфигурирован дисплей, но это не совсем так: можно заставить работать MOSI как MISO. Т.е. информацию можно прочитать с того же пина, который используется для записи. При этом, правда, вместо аппаратного SPI приходится делать его софтверный аналог, работающий в обе стороны через один пин. Информацию из регистров мне так уже удалось считать. А до чтения из памати - не дошел - отвлекся (см. выше).

Да, я тоже пришел к идее блочного устройства. Ориентировочно по 128 байт - как в CP/M-80.

Вообще-то видеопамяти там сотни кбайт, о Мбайтах даже речи не идет.

Чаще всего используется как раз RAW, совпадающий с устройством видеопамяти. Чтобы всю перекодировку возложить на ПК, а на МК этим не заниматься.
Чаще всего в цветных экранах для МК используется 16-разрядный цвет (R:5,G:6,B:5).
Но я как раз сейчас вожусь с дисплеем, который мне пока не удалось заставить работать в этом режиме.

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

Можно и так, и так.
На резисторах, вроде, проще, но есть ограничения по частоте. Теоретически. На практике, если Вы используете 5-вольтовый МК, там не те скорости, чтобы это могло сказаться.

Что за модель?

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

ILI9488 с последовательным интерфейсом.
https://www.ozon.ru/product/graficheskiy-ekran-3160885914/

Друзья, что то у меня ни чего не получается, установил библиотеки для дисплея UTFT но потом начитавшись всякой ереси поставил библиотеку utft_eSPI типа эта Библия легко переделывает jpg файлы

#include <TFT_eSPI.h> #include <SD.h> но возникли конфликты по подключению пинов.

Мучался целый день, лазил в библиотеках, менял настройки пинов подключения в библиотеке и так ни чего не получилось, все равно ошибка в скетче по назначению пинов.

Сейчас хочу все таки разделить SPI, оставить отдельно для SD card аппаратную SPI, для дисплея выделить программную SPI.

Такой вариант вполне жизнеспособен?

#include <UTFT.h> #include <UTFT_SdRaw.h> #include <SdFat.h>

Хочу попробовать эти библиотеки, соответственно изменить формат фонового изображения и иконок с расширением .raw

Собственно вопрос, при использовании этих библиотек я могу назначить пины для SD card и для дисплея?

МК Arduino nano.

За ранее спасибо за ответы.

Странненько.

Тоже так показалось когда начал читать про библиотеку, и смотреть user settings

// --- ПОДКЛЮЧЕНИЕ БИБЛИОТЕК ---
#include <UTFT.h>        // Основная библиотека для управления дисплеем
#include <UTFT_SdRaw.h>  // Библиотека для работы с графикой на SD-карте
#include <SdFat.h>       // Профессиональная библиотека для работы с SD-картой
#include <Wire.h>        // Для шины I2C (нужна для RTC и датчика)
#include <RTClib.h>      // Библиотека для часов реального времени (RTC)
#include <Encoder.h>     // Библиотека для обработки сигналов энкодера
#include <Adafruit_SHT31.h> // Библиотека для датчика температуры и влажности

// --- ОПРЕДЕЛЕНИЕ ПИНОВ (СОГЛАСНО НАШЕЙ СХЕМЕ) ---
// *** ДИСПЛЕЙ (Программный SPI) ***
#define TFT_CS    4  // Chip Select (CS)
#define TFT_RST   8  // Reset (RST)
#define TFT_DC    9  // Data/Command (DC)
#define TFT_MOSI  2  // Программный MOSI
#define TFT_SCLK  3  // Программный SCK

// *** SD-КАРТА (Аппаратный SPI) ***
#define SD_CS_PIN 10 // Chip Select для SD-карты

// *** ЭНКОДЕР ***
#define ENC_CLK_PIN 5
#define ENC_DT_PIN  6
#define ENC_BUTTON_PIN 7

// *** РЕЛЕ ***
#define RELAY_PIN 14 // Используем пин A0 как цифровой D14

// --- СОЗДАНИЕ ОБЪЕКТОВ (ИНСТАНСОВ) КЛАССОВ ---
// Создаем объект дисплея. Указываем модель контроллера (ILI9341) и пины.
UTFT myGLCD(ILI9341_16, TFT_CS, TFT_DC, TFT_RST, TFT_MOSI, TFT_SCLK);

// Создаем объект для работы с файлами картинок на SD-карте.
// Передаем ему ссылку на наш дисплей.
UTFT_SdRaw myFiles(myGLCD);

// Создаем объект для работы с SD-картой.
SdFat SD;

// Создаем объекты для RTC и датчика.
RTC_DS3231 rtc;
Adafruit_SHT31 sensor = Adafruit_SHT31();

// --- КОНСТАНТЫ ГРАФИЧЕСКОГО ИНТЕРФЕЙСА (UI) ---
// Центры шкал
#define TEMP_CENTER_X 203 
#define TEMP_CENTER_Y 157 
#define HUM_CENTER_X 88  
#define HUM_CENTER_Y 157  

// Размеры стрелок
#define TEMP_NEEDLE_LENGTH 77
#define HUM_NEEDLE_LENGTH 63
#define NEEDLE_WIDTH 2

// Цвета (в формате библиотеки UTFT)
#define NEEDLE_COLOR VGA_YELLOW
#define BACKGROUND_COLOR VGA_BLACK
#define TEXT_COLOR VGA_WHITE
#define ERROR_COLOR VGA_RED

// Координаты элементов на экране
#define TIME_X 10
#define TIME_Y 10
#define HEAT_ICON_X 260
#define HEAT_ICON_Y 160
#define FROST_ICON_X 120
#define FROST_ICON_Y 160
#define ICON_W 30
#define ICON_H 30

// --- ИМЕНА ФАЙЛОВ НА SD-КАРТЕ ---
const char *backgroundFile = "/bg.raw"; 
const char *heatingIconFile = "/heat.raw";
const char *defrostingIconFile = "/frost.raw";
const char *temperatureConfigFile = "/temperature.cfg";
const char *hysteresisConfigFile = "/hysteresis.cfg";
const char *defrostingConfigFile = "/defrosting.cfg";
const char *timer1ConfigFile = "/set timer 1.cfg";
const char *timer2ConfigFile = "/set timer 2.cfg";
const char *timer3ConfigFile = "/set timer 3.cfg";
const char *timer4ConfigFile = "/set timer 4.cfg";

// --- ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ И ФЛАГИ СОСТОЯНИЯ ---
DateTime now;
float temperature = 0, humidity = 0;
unsigned long previousMillis = 0;
bool colonVisible = true;
bool heatingEnabled = false;
unsigned long heatingBlinkInterval = 500;
unsigned long nextHeatingBlink = 0;
bool defrostingMode = false;
unsigned long nextDefrostingBlink = 0;
float targetTemperature = 25.0;
float hysteresis = 2.0;
float defrostingTemperature = 5.0;
char modeNames[][4] = {"ON ", "AUTO", "OFF"};
int modePositionsX[] = {34, 122, 240};
int modePositionsY = 213;
int selectedIndex = 0;
int activeIndex = 1; 
bool selectionInProgress = false;
enum PageState {MAIN_PAGE, SETTINGS_PAGE};
PageState pageState = MAIN_PAGE;
int menuCursorPos = 0;
unsigned long holdStartTime = 0;
bool sdOk = false, rtcOk = false, sensorOk = false;
unsigned long initStatusTimer = 0; // Таймер для очистки статусных надписей

// Статические переменные для хранения предыдущего угла стрелок (для стирания)
static float prevTempAngle = 0;
static float prevHumAngle = 0;`
```

Примерно новой заголовок скетча

У меня скоро уже так будет🤣 как у котенка с кубиками😂

Ты скрещиваешь нано, экран и sd ?
Может заменишь нану на esp32 подобную ?

На экране есть слот SD и пины для подключения так что я ни чего там не скрещиваю. А с ESP просто не работал по этому вообще не знаю с какой стороны к ней подходить,

И если это можно реализовать на ардуинке то почему бы и да

А свободной памяти сколько остаётся на нане?