Большинство TFT-дисплеев поставляются с адаптером SD-карт, установленным на задней панели, но в некоторых случаях бывает необходимо обойтись без него. В таком случае когда вы захотите сохранить многоцветное растровое изображение в ограниченной FLASH-памяти, вы скоро превысите пределы ее размера. Даже небольшой 1,8-дюймовый дисплей предлагает разрешение 160 x 128 пикселей. Если вы выберете стандартный формат RBG, вам потребуется 61440 байт памяти.

Даже с ATmega2560 вы столкнетесь с проблемами, поскольку массивы ограничены 32768 байтами. Посмотрев даташит на стандартный дисплей, вы можете обнаружить, что для каждого пикселя используется только два байта, что дает 5 бит для красного, 6 бит для зеленого и 5 бит для синего. Таким образом, если вы преобразуете файл растрового изображения таким образом, вам еще будет нужно 40960 байт. Вот почему в таких случаях требуется более сильное сжатие. Один из вариантов – предлагаемый в данном материале формат файла.

Конечно, не существует графического программного обеспечения для преобразования данного изображения в этот формат, необходимо было написать специальное программное обеспечение. Здесь предоставлена версия на Паскале (Дельфи), вы можете легко конвертировать ее на ваш любимый язык.
procedure TForm1.Button1Click(Sender: TObject);
var f : file of byte;
h : textfile;
x, y : integer;
r, g, b, c, d : byte;
begin
if Opendialog1.Execute then
begin
AssignFile(F, OpenDialog1.FileName);
Reset(F);
seek(f,54);
AssignFile(h, 'dest_332rgb.h');
rewrite(h);
x := 0;
y := 125;
while not eof(f) do
begin
read(f, b);
read(f, g);
read(f, r);
Image1.Canvas.Pixels[x,y] := Rgb(r,g,b);
c := (r and $E0) + (g and $E0 shr 3) + (b shr 6);
write(h,c);
write(h,',');
x := x + 1;
if x> 125 then
begin
x := 0;
y := y - 1;
read(f, d);
read(f, d);
write(h,#13);
end;
end;
closefile(f);
closefile(h);
end;
end;
Ограничения были установлены для изображения в квадрате размером 126x126 пикселей. Два фиктивных считывания ближе к концу будут необходимы, так как любая строка в файле BMP имеет число, кратное четырем байтам. Целевой файл будет содержать только сжатые данные без какой-либо заголовочной информации. На стороне Arduino вы должны распаковать данные. Просто переместите файл назначения в папку Arduino и используйте этот код.
const byte cs = 10;
const byte dc = 9;
const byte rst = 8;
#include <TFT.h>
TFT tft = TFT(cs, dc, rst);
const PROGMEM unsigned char rawData[] = {
#include "dest_332rgb.h"
};
void setup() {
Serial.begin(115200);
Serial.println("\n" __FILE__);
tft.initR(2);
tft.setRotation(3);
tft.fillScreen(0);
int w = tft.width();
int h = tft.height();
const word ROT = tft.Color565(255, 0, 0);
tft.drawRect(0, 0, w, h, ROT);
int br = 126;
int ho = 126;
int x0 = (w - br) / 2;
int y0 = (h - ho) / 2;
int x = 0;
int y = ho-1;
int i = 0;
int s = sizeof rawData;
while (i < s) {
word c = pgm_read_byte(rawData + i++);
byte r = c & B11100000;
byte g = (c & B00011100) << 3;
byte b = (c & B00000011) << 6;
c = tft.Color565(r, g, b);
tft.drawPixel(x0 + x, y0 + y, c);
if (++x >= br) {
y--;
x = 0;
}
}
}
void loop() {}
В Arduino UNO он будет использовать 23 КБ FLASH и почти не будет использовать SRAM, так что у вас останется достаточно памяти для ваших основных алгоритмов. Чтобы продемонстрировать, чего вы можете ожидать, уменьшив разрешение, можно показать следующий пример.

А теперь, что на самом деле может показать 1,8-дюймовый дисплей.

© digitrode.ru