Добавляем загрузку картинок из EEPROM в библиотеке UTFT.

Я уже писал про библиотеку UTFT и про ее функцию drawBitmap которая выводит подготовленный массив картинки на дисплей. Все это получается красиво и прикольно, но съедает очень много памяти. По этому я озадачился как же этот массив загнать во внешнюю память и выводить уже от туда.

Немного теории:

Мой любимый микроконтроллер Arduino Nano создан на базе 8 битного AVR контролера ATmega328 фирмы Atmel. Точные данные вашей платы можно посмотреть на официальном сайте Ардуино. В нем имеется  так называемая Fleesh-память объемом  32 Кб  при этом 2 Кб используются для загрузчика и ОЗУ объемом 2 Кб. Флешь-память используется для хранения исполнительного кода программы микроконтроллера. Собственно сама программа которую он выполняет, а в ОЗУ хранятся значения переменных которые используются в программе.

Библиотека UTFT использует Флешь-память для хранения массива картинки. Посмотрим на массив из примера:

Ключевое слово RROGMEM — это модификатор переменных, и его можно использовать только с теми типами данных, которые определены в библиотеке pgmspace.h. Он говорит компилятору «разместить информацию во flash-памяти», а не в SRAM, как это происходит обычно.

PROGMEM является частью библиотеки pgmspace.h .Которую надо подключить в вашем скетче. Примерно так:

#include <avr/pgmspace.h>

const dataType variableName[] PROGMEM = {data0, data1, data3…};

dataType — это тип переменной.
variableName — название массива данных.

Собственно функция  drawBitmap просто читает эти данные и отправляет их на дисплей :

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

Закончили с теорией. Кодинг-модинг:

Первым делом нам надо в EEPROM записать сам массив картинки.К сожалению я не придумал ничего лучше чем поступить тем же путем. Записать массив в флешь-память и потом оттуда считать ее в eeprom (рад буду если кто то подскажет более светлые мысли). Я набросал примерный скетч для массива который есть в  примере библиотеке:

#include <Wire.h> // для работы с I2C.
#include <avr/pgmspace.h>
#define EEPROM_ADDRESS 0x53 //адрес памяти.
const unsigned short raspberry[0x400] PROGMEM ={ //массив картинки
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF79E, 0xD69B, 0xD69B, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0010 (16)
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF7E, 0xCE5A, 0xDEDC, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0020 (32)
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xA515, 0x6B4D, 0x39C7, 0x31A5, 0x31A5, 0x4208, 0x6B2D, 0xD69A, 0xFFFF, // 0x0030 (48)
0xFFFF, 0xFFFF, 0xFFFF, 0x9CD3, 0x528B, 0x39C7, 0x2985, 0x31A6, 0x4A49, 0x8C31, 0xCE5A, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0040 (64)
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xC638, 0x18E2, 0x1980, 0x3AE1, 0x53E3, 0x64A4, 0x6484, 0x53E3, 0x32A1, 0x08A0, 0x6B2D, // 0x0050 (80)
0xFFFF, 0xD6BB, 0x18E3, 0x1960, 0x4342, 0x5C23, 0x6CC4, 0x6484, 0x4B62, 0x3281, 0x10E0, 0x528A, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0060 (96)
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x9CD4, 0x08C0, 0x7DA5, 0x7DA5, 0x7545, 0x7D65, 0x7DA5, 0x7D85, 0x7DA5, 0x7545, 0x1140, // 0x0070 (112)
0xAD56, 0x4A49, 0x3B01, 0x7DA5, 0x7DA5, 0x7DA5, 0x7DA5, 0x7545, 0x7D65, 0x85E5, 0x5C23, 0x2104, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0080 (128)
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xB576, 0x08C0, 0x7545, 0x7565, 0x6CE5, 0x5C04, 0x5C24, 0x7D65, 0x7D85, 0x7DA5, 0x6484, // 0x0090 (144)
0x1062, 0x29A2, 0x7DA5, 0x7565, 0x7DA5, 0x6CE4, 0x53E4, 0x6444, 0x7525, 0x7DA5, 0x4BA2, 0x3186, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x00A0 (160)
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF5D, 0x10C2, 0x5C43, 0x7D85, 0x7565, 0x7545, 0x53E4, 0x3AA3, 0x6444, 0x85C5, 0x7D85, // 0x00B0 (176)
0x0020, 0x3282, 0x8605, 0x7D85, 0x4B63, 0x42E3, 0x6484, 0x7D65, 0x7545, 0x7DC5, 0x2200, 0x736E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x00C0 (192)
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x62EC, 0x21C0, 0x85C5, 0x7545, 0x7545, 0x7DA5, 0x6CC4, 0x3222, 0x4B63, 0x53E4, // 0x00D0 (208)
0x0000, 0x1901, 0x6CA5, 0x3222, 0x4323, 0x7D65, 0x7D85, 0x7545, 0x7D85, 0x6D04, 0x0880, 0xD67A, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x00E0 (224)
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xE71C, 0x1082, 0x4B82, 0x85C5, 0x7544, 0x7545, 0x7D85, 0x85C5, 0x29C2, 0x0000, // 0x00F0 (240)
0x0000, 0x0000, 0x0000, 0x53C4, 0x85E5, 0x7545, 0x7545, 0x7D85, 0x7D85, 0x1980, 0x6B2D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0100 (256)
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xBDB7, 0x0861, 0x4B42, 0x7D85, 0x7DA5, 0x85C5, 0x7505, 0x1901, 0x0000, // 0x0110 (272)
0x0000, 0x0000, 0x0000, 0x3AA3, 0x7DA5, 0x85C5, 0x7DA5, 0x7525, 0x21A0, 0x4209, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0120 (288)
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xDEBB, 0x1904, 0x1140, 0x3B23, 0x2A42, 0x0880, 0x0000, 0x1821, // 0x0130 (304)
0x3822, 0x3022, 0x0000, 0x0000, 0x1121, 0x32E2, 0x2AA2, 0x08A0, 0x6B2D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0140 (320)
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xA554, 0x20C3, 0x5003, 0x8005, 0x5804, 0x0000, 0x6864, 0xB888, // 0x0150 (336)
0xC889, 0xC088, 0xA087, 0x2021, 0x3802, 0x7805, 0x5003, 0x1000, 0x4269, 0xEF5D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0160 (352)
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xAD95, 0x0800, 0xA046, 0xD889, 0xD0A9, 0x3822, 0x4043, 0xD8A9, 0xC088, // 0x0170 (368)
0xB888, 0xB888, 0xC889, 0xA887, 0x3022, 0xC088, 0xD889, 0xB088, 0x2000, 0x2985, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0180 (384)
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x2965, 0x7804, 0xD8A9, 0xB888, 0x3822, 0x0000, 0x1000, 0x9887, 0xC889, // 0x0190 (400)
0xC889, 0xC889, 0xC088, 0x7065, 0x0000, 0x1821, 0xB087, 0xD889, 0xA887, 0x0000, 0x9D14, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x01A0 (416)
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xDF1C, 0x2021, 0xC888, 0xA887, 0x2021, 0x0000, 0x2021, 0x2822, 0x0800, 0x3022, // 0x01B0 (432)
0x5043, 0x5043, 0x3022, 0x3842, 0x5043, 0x2021, 0x1000, 0x9066, 0xD8A9, 0x2800, 0x52EB, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x01C0 (448)
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xCE79, 0x1000, 0x6044, 0x0800, 0x1000, 0x9066, 0xC088, 0xC889, 0xA087, 0x1821, // 0x01D0 (464)
0x0000, 0x0000, 0x7065, 0xC889, 0xC889, 0xC088, 0x7065, 0x0000, 0x6864, 0x2000, 0x3207, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x01E0 (480)
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF5D, 0x31A6, 0x1821, 0x0000, 0x0000, 0xA087, 0xC889, 0xB888, 0xB888, 0xC889, 0x9887, // 0x01F0 (496)
0x0000, 0x4042, 0xD0A9, 0xB888, 0xB888, 0xB888, 0xD089, 0x6864, 0x0000, 0x2021, 0x0820, 0x8C71, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0200 (512)
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x3A48, 0x4801, 0xB8A8, 0x0800, 0x4843, 0xC889, 0xB888, 0xB888, 0xB888, 0xC088, 0xB888, // 0x0210 (528)
0x0800, 0x6044, 0xC889, 0xB888, 0xB888, 0xB888, 0xC088, 0xB088, 0x1821, 0xA087, 0x9046, 0x0000, 0xB5B6, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0220 (544)
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xBE38, 0x1800, 0xC088, 0xC888, 0x1821, 0x7065, 0xC889, 0xB888, 0xB888, 0xB888, 0xC088, 0xB088, // 0x0230 (560)
0x0000, 0x4843, 0xC889, 0xB888, 0xB888, 0xB888, 0xB888, 0xC088, 0x3842, 0xA087, 0xD8A9, 0x4001, 0x29C6, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0240 (576)
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x7430, 0x4801, 0xD089, 0xB888, 0x1000, 0x7065, 0xC889, 0xB888, 0xB888, 0xB888, 0xC889, 0x8065, // 0x0250 (592)
0x0000, 0x1001, 0xB888, 0xC088, 0xB888, 0xB888, 0xB888, 0xC088, 0x2821, 0x9886, 0xD089, 0x8025, 0x0061, 0xEF7D, 0xFFFF, 0xFFFF, // 0x0260 (608)
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x73EF, 0x4801, 0xD089, 0xA887, 0x0000, 0x3022, 0xC8A9, 0xC888, 0xC088, 0xC889, 0xA887, 0x0800, // 0x0270 (624)
0x0000, 0x0000, 0x3822, 0xC088, 0xC889, 0xC888, 0xD089, 0x8065, 0x0000, 0x8866, 0xD089, 0x8045, 0x0040, 0xE73C, 0xFFFF, 0xFFFF, // 0x0280 (640)
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xAD96, 0x1800, 0xD889, 0x8866, 0x0000, 0x0000, 0x4843, 0xA087, 0xA887, 0x7865, 0x2021, 0x5043, // 0x0290 (656)
0x8066, 0x8065, 0x3822, 0x2021, 0x7865, 0x9066, 0x6064, 0x0000, 0x0000, 0x5043, 0xE0AA, 0x4002, 0x1944, 0xFFFF, 0xFFFF, 0xFFFF, // 0x02A0 (672)
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0x31A6, 0x6824, 0x3022, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9086, 0xD089, // 0x02B0 (688)
0xC889, 0xC889, 0xC889, 0x6044, 0x0000, 0x0000, 0x0000, 0x0800, 0x5844, 0x3842, 0x6864, 0x0000, 0x9D14, 0xFFFF, 0xFFFF, 0xFFFF, // 0x02C0 (704)
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xC618, 0x0000, 0x3022, 0xB088, 0x9086, 0x2822, 0x0000, 0x0000, 0x6044, 0xD089, 0xB888, // 0x02D0 (720)
0xB888, 0xB888, 0xC088, 0xC8A9, 0x2822, 0x0000, 0x2821, 0xB087, 0xD8A9, 0xA087, 0x0000, 0x31C6, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x02E0 (736)
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0x10E3, 0x7024, 0xD089, 0xC889, 0xC088, 0x3842, 0x0000, 0x8866, 0xC888, 0xB888, // 0x02F0 (752)
0xB888, 0xB888, 0xB888, 0xC889, 0x4843, 0x1001, 0xB888, 0xC888, 0xB888, 0xB888, 0x0000, 0x8450, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0300 (768)
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x532B, 0x5002, 0xC889, 0xB888, 0xC088, 0xB088, 0x0800, 0x6864, 0xD089, 0xB888, // 0x0310 (784)
0xB888, 0xB888, 0xB888, 0xC889, 0x3022, 0x8065, 0xC889, 0xB888, 0xC088, 0xB888, 0x1000, 0xCEBA, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0320 (800)
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xA554, 0x1800, 0xC889, 0xB888, 0xB888, 0xC889, 0x5043, 0x1000, 0xA887, 0xD089, // 0x0330 (816)
0xC088, 0xC088, 0xD089, 0x7865, 0x1821, 0xB888, 0xB888, 0xB888, 0xC889, 0x8825, 0x1904, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0340 (832)
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7DF, 0x2145, 0x5802, 0xD0A9, 0xC088, 0xD089, 0x8065, 0x0000, 0x1801, 0x7065, // 0x0350 (848)
0x9866, 0x9066, 0x5844, 0x0000, 0x3822, 0xD089, 0xC088, 0xC889, 0xB888, 0x0800, 0x8CD2, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0360 (864)
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xD6BA, 0x10C3, 0x4001, 0xA067, 0xB888, 0x4843, 0x0000, 0x0000, 0x0000, // 0x0370 (880)
0x1821, 0x1821, 0x0000, 0x0000, 0x2021, 0xB088, 0xB888, 0x8825, 0x1000, 0x5B4C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0380 (896)
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xE73C, 0x5B2C, 0x0000, 0x0000, 0x0000, 0x3022, 0x8866, 0xA887, // 0x0390 (912)
0xB888, 0xB888, 0xA887, 0x7865, 0x0800, 0x0800, 0x0800, 0x2124, 0x9D13, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x03A0 (928)
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xBDF7, 0x2986, 0x0000, 0x6824, 0xE0AA, 0xC888, // 0x03B0 (944)
0xC088, 0xC088, 0xD089, 0xB888, 0x0800, 0x0020, 0x634D, 0xEF9E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x03C0 (960)
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xAD55, 0x18C3, 0x5002, 0xA867, // 0x03D0 (976)
0xC088, 0xB888, 0x8825, 0x1000, 0x52EB, 0xD6BA, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x03E0 (992)
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BE, 0x636D, 0x3125, // 0x03F0 (1008)
0x3883, 0x30C3, 0x31C7, 0xA555, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0400 (1024)
};
void setup() {
 // put your setup code here, to run once:
 unsigned int col;
Wire.begin(); //инициализируем интерфейс I2C 

for (int i= 0; i<(32*32); i++) // 32*32 это размер картинки в сумме дает нам 0х400 переменных.
 {
 col=pgm_read_word(&raspberry[i]); //читаем массив,& указатель адреса в флешь-памяти переменной raspberry[i] 
 Wire.beginTransmission(EEPROM_ADDRESS);
 Wire.write(i>>8);
 Wire.write(i&0xFF);
 Wire.write(col >> 8);
 Wire.endTransmission();
 delay(5); //задержка для запоминания байта памятью
 Wire.beginTransmission(EEPROM_ADDRESS);
 Wire.write(i+(32*32) >> 8); // так как переменные в массиве состоят из двух байт,записываем из байтно
 Wire.write(i+(32*32) & 0xFF); // сдвигая адреса байтов на число переменных.
 Wire.write(col & 0xFF);
 Wire.endTransmission();
 delay(5);
 
 } 
 }
void loop() {
 // put your main code here, to run repeatedly:

}

Следующим этапом нам надо добавить в библиотеку UTFT свою функцию. Которая будет читать данные с внешней памяти и посылать их в дисплей.

Библиотека для Ардуино должна иметь как минимум два файла:

  • заголовочный файл (расширение .h);
  • файл с исходным кодом (расширение .cpp).

В первом файле содержится описание самого класса, переменные, константы. Кода программы здесь нет.  А второй файл содержит программный код методов.

Открываем файл UTFT.cpp и первым делам добавляем в  начале файла  поддержку библиотеке «Wire»

Далее  добавляем нашу новую функцию :

void UTFT::eeprom(int x, int y, int sx, int sy, word adress, byte adress_eeprom )
{
 unsigned int col;
 int tx, ty, tc, tsx, tsy;
 Wire.begin();

if (orient==PORTRAIT)
 {
 cbi(P_CS, B_CS);
 setXY(x, y, x+sx-1, y+sy-1);
 for (tc=0; tc<(sx*sy); tc++)
 {
 Wire.beginTransmission(adress_eeprom);
 Wire.write((adress+tc) >> 8);
 Wire.write((adress+tc) & 0xFF);
 Wire.endTransmission();
 Wire.requestFrom(adress_eeprom, (byte)1);
 byte data = Wire.read();
 Wire.beginTransmission(adress_eeprom);
 Wire.write((adress+tc+(sx*sy))>>8);
 Wire.write((adress+tc+(sx*sy))&0xFF);
 Wire.endTransmission();
 Wire.requestFrom(adress_eeprom, (byte)1);
 byte data_1 = Wire.read();
 LCD_Write_DATA(data,data_1);
 //col=pgm_read_word(&data[tc]);
 //LCD_Write_DATA(col>>8,col & 0xff);
 }
 sbi(P_CS, B_CS);
 }
 else
 {
 cbi(P_CS, B_CS);
 for (ty=0; ty<sy; ty++)
 {
 setXY(x, y+ty, x+sx-1, y+ty);
 for (tx=sx-1; tx>=0; tx--)
 {
 Wire.beginTransmission(adress_eeprom);
 Wire.write((adress+(ty*sx)+tx) >> 8);
 Wire.write((adress+(ty*sx)+tx) & 0xFF);
 Wire.endTransmission();
 Wire.requestFrom(adress_eeprom, (byte)1);
 byte data = Wire.read();
 Wire.beginTransmission(adress_eeprom);
 Wire.write((adress+(sx*sy)+(ty*sx)+tx) >> 8);
 Wire.write((adress+(sx*sy)+(ty*sx)+tx) & 0xFF);
 Wire.endTransmission();
 Wire.requestFrom(adress_eeprom, (byte)1);
 byte data_1 = Wire.read();
 LCD_Write_DATA(data,data_1);
 //col=pgm_read_word(&data[(ty*sx)+tx]);
 //LCD_Write_DATA(col>>8,col & 0xff);
 }
 }
 sbi(P_CS, B_CS);
 } 
 
 clrXY();
}

Сохраняем файл и открываем файл UTFT.h добавляя в него описание  нашей новой функции.

void eeprom(int x, int y, int sx, int sy, word adress, byte adress_eeprom );

  • x — координаты левого угла картинки по х .
  • y — координаты по y.
  • sx — размер картинки по x.
  • sy — размер картинки по y.
  • adress — адрес в памяти откуда начинается массив картинки.
  • adress_eeprom — адрес памяти для I2C.

Ну вроде и все. Думаю дальше вы справитесь успешно. Буду рад вашим идеям и замечаниям ..Пишите в обратную связь.