Arduino, модуль Nokia 5110 LCD и любая картинка



Наверное, у меня, как и у всех Arduino-строителей, появилась какая-то бредовая идея в голове. Заказал в Китае все необходимые детали. Ждать пришлось очень долго, но тут раньше срока был доставлен клон платы Arduino Uno и LCD-дисплей Nokia 5110. Так как до этого с электроникой и программированием я был не знаком, решил не терять время зря и начал учиться выводить информацию на данный модуль.

Первым делом я загуглил и попал на публикацию «Arduino, модуль Nokia 5110 LCD и кириллица» от автора Shrim. И тут я понял, что всё, что раньше задумал, будет не так уже и просто сделать.

С кириллицей я разобрался, там все просто, не буду копипастить прошлый пост, а вот с картинками действительно проблема. Стоит задача: нужно нарисовать картинку и залить ее на дисплей. Столкнулся с первой проблемой, зашел в среду программирования Arduino я увидел, что там нет такой штуки как «Вставить — Изображения», а нужно картинку записать определенным кодом в hex системе исчисления. Нашел несколько редакторов, но не тут то было. Картинка адекватно не отображается. Я начал искать проблемы что может быть.

Методом кучей экспериментов, попыток и проб получился алгоритм которым я с вами поделюсь:

1) Нужно получить саму картинку, в черно-белом формате .bmp с расширением 84 х 48 пикселей.
Сделать это можно кучей способами почти у каждом графическом редакторе есть функция «Cохранить как» где указываем необходимые параметры.
Я делал в corelDRAW. Получаем что-то похожее. Нужно уточнить, что имя картинки обязательно должно сохранено латинской раскладкой клавиатуры, так как следующая программа ее не сможет открыть.

image

2) Если необходимо, можно отредактировать картинку в paint, как ни странно, там есть несколько простых и интересных инструментов.



3) При помощи GLCD Tools получаем hex-код картинки.

image

4) Вставляем данный код в программный код Arduino и заливаем на плату:

//      SCK  - Pin 8
//      MOSI - Pin 9
//      DC   - Pin 10
//      RST  - Pin 11
//      CS   - Pin 12
//
#include <LCD5110_Graph.h>

LCD5110 myGLCD(8,9,10,11,12);

extern uint8_t OKO[];

float y;
uint8_t* bm;
int pacy;

void setup()
{
  myGLCD.InitLCD();
}

void loop()
{
  myGLCD.clrScr();
  myGLCD.drawBitmap(0, 0, OKO, 84, 48);
  myGLCD.update();

  delay(2000);
}


#include <avr/pgmspace.h>

const uint8_t OKO[] PROGMEM={

//Скопированный hex-код  GLCD tools

};


image
Поделиться публикацией
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 17

  • НЛО прилетело и опубликовало эту надпись здесь
      +1
      Я использую «Image generate v.2.104» от Alex_EXE. В ней можно как рисовать свои, так и вставлять готовые картинки в .bmp и преобразовывать в массив hex чисел для дисплеев от 4х8 до 240х320. Тут же можно задавать контрастность и инвертировать цвета. Вообщем достаточно удобно и интуитивно все ясно.
        0
        По моему еще Gimp умеет экспортировать в HEX в виде cpp файла. Поправьте если не так.
          +3
          Это просто формат изображений такой есть — X BitMap (и более развитый цветной вариант — X PixMap), представляет собой валидный код на С. Я картинки в Ардуино именно так генерировал — создавал ч/б изображение в Paint'e, потом брал XnView и конвертировал их в XPM.
          Пример XBM
          #define x_width 58
          #define x_height 8
          static char x_bits[] = {
          0xbb, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
          0x01, 0x67, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 
          0x6c, 0x9e, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 
          0x83, 0x9f, 0x1c, 0x8e, 0xe3, 0x38, 0x86, 0xff, 
          0x28, 0x9e, 0x4c, 0x26, 0x49, 0x92, 0x24, 0xff, 
          0x01, 0x1f, 0x4e, 0xe6, 0x79, 0x92, 0x24, 0xff, 
          0x93, 0x9f, 0x4c, 0x26, 0x49, 0x92, 0x24, 0xff, 
          0xc7, 0x9f, 0x98, 0x8c, 0xe3, 0x38, 0x26, 0xff, 
          };
          
          Пример XPM
          /* XPM */
          static char *Raccoon_xpm[] = {
          /* width height num_colors chars_per_pixel */
          "    58     8        2            1",
          /* colors */
          "0 c #000000",
          "1 c #ffffff",
          /* pixels */
          "0010001000001111000000000000000000000000000000000000000000",
          "0111111100011001100000000000000000000000000000000000000000",
          "1100100110000110110000000000000000000000000000000000000000",
          "0011111000000110110001111000111000111000111000111001111000",
          "1110101110000110110011011001101101101101101101101101101100",
          "0111111100000111100011011001100001100001101101101101101100",
          "0011011000000110110011011001101101101101101101101101101100",
          "0001110000000110111001101100111000111000111000111001101100"
          };
          Отличный способ, кстати, рекомендую. Никаких проблем с именами файлов и т.д.
            0
            Спасибо!!!
          –1
          мне только кажется, или быстрее всего взять python, библиотеку чтения графики (вон, недавно pillow увеличил версию) и за пол часа написать скрипт, который сам из любых кратинок будет генерировать готовый для copy-paste исходник?

          Под «из любых», я подразумеваю, что существую библиотеки которые не только открывают всякое разнообразие растровых форматов, но еще и имеют их обрабатывать, уж resize и преобразовать в 1bit BW, проблем-то не составляет.

          Может быть, если не знакомы с python, это займет не пол часа, а целый вечер, да.
          • НЛО прилетело и опубликовало эту надпись здесь
              0
              как по мне, это имеет смысл когда не хочется разбираться с кучей всякого стороннего софта (я уж забыл даже как Corel выглядит, например), а наоборот — разобраться с новым инструментом для разработки.

              Для меня работа с растровыми изображениями — это как алфавит. Я уж не помню, рисовали мы что-то на экране «Специалист» в далёких 80-ых, но точно помню, что наверянка как и многие писал свою читалку PCX, потом GIF, и далее куда не ткнись, нужно было что-то с растровой графикой уметь сделать в программе. И если раньше это всё руками и своей головой, то теперь-то львиная доля всего просто готовая есть, в виде удобных библиотек.
                0
                Скрипт будет «в 30 строк»:
                1) вывести окно tkFileDialog.askopenfilename чтобы получить путь до открываемого файла
                2) попробовать открыть картинку
                3) изменить размер картинки, естественно центрировать
                4) изметить режим картинки на чёрнобелый (двухцветный, однобитный, кому как угодно), вроде фильтры ещё есть для более качественного преобразования
                5) выгрузить в строку hex значения цвета, если не ошибаюсь их необходимо ещё инвертировать
                6) profit
                • НЛО прилетело и опубликовало эту надпись здесь
                    +1
                    Особенно, если можно просто пользоваться графическим редактором/смотрелкой, умеющей сохранять в XBM/XPM (под Linux, по-моему, каждая первая это умеет).
                      0
                      Выучить питон и написать скрипт — будет полезнее. Вот скрипт конвертирующий любые картинки в hex код. Открываете в нём картинку/фотографию (по умолчанию jpg, но можно выбрать любой другой формат), скрипт генерирует hex код для картинки 84x48 и сохраняет его в файл — «имя картинки/фотографии.txt». Код можно загрузить в редактор иконок (он из моей статьи указанной автором) и поправить рисунок.
                      Вот например
                +1
                Такую девушку лучше отобразить в цвете. Берём цветной экранчик на базе чипа ILI9341, на нём же есть слот под карту памяти.
                Заливаем на карту фотки в формате bmp и простеньким демо скетчем из библиотеки, например adafruit tft, выводим на экран )
                  0
                  Я когда извлек такой дисплей из старой нокии тоже гадал чего бы полезного сделать и придумал сделать датчик температуры и влажности. Докупил датчик dht22 и собрал девайс, уже второй год на полочке работает. Всегда знаю когда нужно включать увлажнитель воздуха.
                    0
                    А расскажете как?
                      +1
                      В поиске хабра " arduino dht22", Одна из десятка статей про создание метеостанции: habrahabr.ru/post/240677/

                    0
                    К каким контактам подключали дисплей?

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

                    Самое читаемое