ARDUINO Проблема при попытке вывести изображение наTFT 2.8'' 320x240 (ILI9341) с SD-карты.

SpyHUNTERrzn

✩✩✩✩✩✩✩
24 Июл 2025
3
0
Всем привет, я начинающий в электронике и программировании. Так получилось, что насмотревшись видео Алекса, и повторив парочку его проектов, я решил сделать что то своё. Выбор пал на контроллер для управления аквариумом, устройство состоит из двух частей, в каждой установлена Atmega328p. Первая половина уже собрана и протестирована, по факту это самостоятельный модуль, но без возможности внести изменения в настройки. Вторая часть призвана отобразить текущие параметры работы, дать возможность изменять настройки первого модуля. Так вот, для того, что бы не грузить шрифт (сделаю свой, только на цифры) и с экономить память контроллера, я решил нарисовать экраны меню, загрузить их на CD-карту, и оттуда выводить их по мере необходимости. Собственно написал тестовый скетч, загрузил его на китайскую Nano, собрал макет, но вроде бы простая программа подкинула сюрприз.

#include <SPI.h>
#include <SdFat.h>
#include <UTFT.h>
#include <UTFT_SdRaw.h>
#define SD_CHIP_SELECT 7
UTFT myGLCD(TFT01_24SP,11,13,10,9,8); // тип дисплея 2,8 TFT (320×240 chip ILI9341)
SdFat mySD;
UTFT_SdRaw myFiles(&myGLCD);

void setup() {
Serial.begin(9600);
Serial.print("Initializing SD card...");

myGLCD.InitLCD();
myGLCD.clrScr();
myGLCD.setColor( VGA_WHITE );
myGLCD.fillCircle( 160 , 120 , 30 );

while(!mySD.begin(SD_CHIP_SELECT,1)){
Serial.print("\nInitialization failed");
myGLCD.setColor( VGA_RED );
myGLCD.fillCircle( 160 , 120 , 30 );
delay(1000);}
Serial.print("\nInitialization OK");
myGLCD.setColor( VGA_YELLOW );
myGLCD.fillCircle( 160 , 120 , 30 );
delay(1000);
}
void loop() {
myFiles.load(0,0,193,179,"MenuStart.raw");
Serial.print("\nFile_1_Load");
delay(250);
myGLCD.clrScr();
myGLCD.setColor( VGA_GREEN);
myGLCD.fillCircle( 160 , 120 , 10 );
myFiles.load(0,0,320,240,"MenuMain.raw");
Serial.print("\nFile_2_Load");
delay(250);
myGLCD.clrScr();
myGLCD.setColor( VGA_OLIVE);
myGLCD.fillCircle( 160 , 120 , 10 );
}

В общем, если залить скетч на плату, потом выключить питание, потом снова включить, то в монитор порта выводится вот это:
После выключения питания.png
При этом на дисплей выводиться вот это:Вывод на экран.jpg
Получается, дисплей инициализировался, вывел изображение, а вот дальше карта якобы прошла инициализацию, и перешла в петлю, но при этом программа начисто игнорирует команды вывода на дисплей. Не только не выводит содержимое файлов, но и не рисует программную графику.
Если нажать "Сброс" на контроллере, то ситуация меняется:После нажатия кнопки сброс на плате.png
Тут карта не инициализируется, но по прежнему игнорируется вывод программной графики. Карта отформатирована в FAT32, если прочитать ее при помощи скетчей CardInfo или SDInfo, то всё читается, файлы содержащиеся на карте распознаются. Собственно картинки преобразованы в *.raw. Если кто сталкивался с подобным, или знает как решить проблему, буду благодарен за совет или направляющий пендель.
 

Bruzzer

★★★★✩✩✩
23 Май 2020
670
202
Вы подключаете экран к аппаратному SPI. Подключите к любым другим свободным пинам. Должно заработать.
 
  • Лойс +1
Реакции: SpyHUNTERrzn

SpyHUNTERrzn

✩✩✩✩✩✩✩
24 Июл 2025
3
0
Вы подключаете экран к аппаратному SPI. Подключите к любым другим свободным пинам. Должно заработать.
Да, это работает. Спасибо, что помогли решить данную проблему.
IMG_20250731_132529.jpgIMG_20250731_121651.jpg

Получается, что из за конфликта библиотек невозможно использовать два разнотипных устройства на одной шине. Очень жаль, но придётся переделывать плату.
 

Bruzzer

★★★★✩✩✩
23 Май 2020
670
202
@SpyHUNTERrzn,
Я не разбираюсь в библиотеках TFT, посмотрел из интереса симуляцию в протеусе. С библиотекой <UTFT.h> работает только на других пинах, т.е. не использует аппаратный SPI. В протеусе есть встроенный пример с Adafuit библиотекой и SD.h (Bitmap drawing on TFT LCD) Оба устройства работают на аппаратном SPI.
Повторюсь, я не разбираюсь в TFT библиотеках, и не знаю, чем <UTFT.h> лучше/хуже Adafruit или может быть других библиотек.
 
  • Лойс +1
Реакции: SpyHUNTERrzn

SpyHUNTERrzn

✩✩✩✩✩✩✩
24 Июл 2025
3
0
В общем я по экспериментировал и решил остановиться на раздельном SPI, хотя для этого мне придётся плату переделывать, да и Adafruit работает бодрее. Огромное спасибо Bruzzer за помощь, тему можно закрывать.