Выводим изображение на GLCD(монох.) с SD-карты

Сегодня мы рассмотрим довольно обыденный вопрос: вывод изображения на GLCD(или чего другое) с карты памяти.

Что же нужно сделать? Для начала возьмем сам файл изображения. Самая простая структура — bmp. (Bit-map) В начале файла находится его «шапка»(имя, размер). Затем идут сами данные, в случае с монохромным дисплеем — последовательность 1 и 0. 1 — Черный пиксель, 0 — белый(пустой) пиксель. Это нам и нужно! Но что же делать с другими форматами?

Пойдем самым простым путем. В библиотеки glcd v3 — была специальная утилита для конвертации изображений в формат библиотеки.

Она как раз «вскрывает» файл изображения, добывает оттуда данные, обесцвечивая их и подгоняя под размер.

Что ж. Я использовал ее код для создания собственной утилиты. Теперь она создавала текстовый файл с «данными» изображения — вот такого типа: «0xFF 0xC7 0x56….». Затем нужно было магическим способом переделать символы ASCII в байты данным. (Или) шестнадцатеричный текст в байты данных. Это решилось на Pascal ABC 😀 Спасибо неизвестному с форума.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
program HexToTRX;
 
var
    input:text;
    output:file of byte;
    bt:byte;
    s,str:string;
    i:integer;   
 
function HexToByte(const HexStr:string):byte;
const 
    s:string='0123456789ABCDEF';
    c:array[0..15] of byte=(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15);
var
    i,j,k:integer;
    Pow16:byte;
    n:byte; 
begin
    n:=0;
    for i:=length(HexStr) downto 1 do
    begin
        for j:=0 to 15 do
        begin
            if HexStr[i]=s[j+1] then
                begin
                    Pow16:=1;
                    for k:=1 to length(HexStr)-i do Pow16:=Pow16*16;
                    n:=n+c[j]*Pow16;
                    break;
                end;
        end;
    end;
    HexToByte:=n;
end;    
 
begin
    assign(input,'untl/texture_t.trx');
    assign(output,'your_textrure_here/texture.trx');
    reset(input);
    rewrite(output);
    while not eof(input) do
    begin
        readln(input,s);
        i:=1;
        while i<=length(s)-1 do
        begin
            str:=s[i]+s[i+1];
            bt:=HexToByte(str);
            write(output,bt);
            i:=i+3;
        end;
    end;
    close(input);
    close(output);
    Erase(input); 
end.

Вот вся утилита в сборке ->/ Пользоваться просто. Возьмите любое изображение размером >= 128×64, затем перенесите его в окно. Закройте окно, и в открытой командной строке — нажмите enter.

Теперь сам скетч для Arduino. (библиотека glcd v3, если вы используете дисплей; библиотека SD)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <SD.h>
#include <glcd.h>
 
void setup() {
  GLCD.Init(); //Инициализируем дисплей
  SD.begin(SS_PIN); //и флешку
  GLCD.ClearScreen();
  File image = SD.open("texture.trx", FILE_READ); //Открываем файл texture.trx
  for(int j = 0; j < 8; j++) {
     GLCD.GotoXY(0, j*8); //Идем на новую строчку дисплея
     for(int i = 0; i < 128; i++) {
           GLCD.WriteData(image.read()); //Выводим байт данных
     }
  }
}
 
void loop() { }

После прошивки, перемещаем файл из утилиты в корень SD карты и все. Размер скетча можно уменьшить, использовав библиотеку glcd предыдущей версии.

Вы можите оставить комментарий, или поставить трэкбек со своего сайта.

3 комментария к “Выводим изображение на GLCD(монох.) с SD-карты”

  1. Андрей:

    Можно «выложить» сам файл с кодом? Если да то большое спасибо!

    • К сожалению, самого файла у меня уже нет. Однако все его содержимое представлено в последней кодовой выноске в статье, ничего больше в нем не было.

  2. Андрей:

    В любом случае огромное Спасибо за статью.

Написать комментарий

XHTML: Вы можете использовать эти теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Bug Report
Локализовано: шаблоны Wordpress