помогите разобраться с выводом растрового изображения
- Войдите на сайт для отправки комментариев
добрый день. намылился сделать бортовую систему контроля на свой авто, в проекте со временем добавить функцию отображения мгновенного и среднего расхода и вот для начала подобрал подходящий по размерам экран который можно встроить в приборную панель вместо родного и на основе ардуино уно пытаюсь заставить это все работать. Так как в программировании я мягко говоря не силен все стараюсь делать методом проб и ошибок разбивая большую задачу на маленькие, и вот на данный момент я научился выводить на экран текст перед этим собрав на макетной плате свое мега устройство) согласовав логику 3 и 5 в, но уперся в то что первичная задача моего бск, а именно дублирование\замена ламп в приборной панели на аналогичные значки на экране, упирается в то что я криворукий не могу вывести растровое изображение, перерыл и все что можно попрробовав решил написать сюда
http://www.ebay.com/itm/Useful-240x320-2-8-SPI-TFT-LCD-Serial-Port-Modul...
это вот экран, подключаю его по схеме https://www.youtube.com/watch?v=pfP4Pv3y85Y как в этом видео на 4:40, только без тач
ввожу вот такой код
#include "SPI.h"
#include "Adafruit_GFX.h"
#include "Adafruit_ILI9341.h"
// For the Adafruit shield, these are the default.
#define TFT_DC 9
#define TFT_CS 10
void setup() {
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
const unsigned char PROGMEM smileBmp[] = {
tft.begin();
tft.fillScreen(ILI9341_BLACK);
//tft.setCursor(0, 0);
//tft.setTextColor(ILI9341_WHITE); tft.setTextSize(3);
//tft.println("Hello World!");
// отрисовка изображения
tft.drawBitmap(0, 0, smileBmp, 110, 70, ILI9341_RED);
}
void loop(){
}
после скобок const unsigned char PROGMEM smileBmp[] = { ввожу изображение сформированное в различных програмках и максимум что оно мне выводит это хаотически набросанный прямоугольник, и это при условии горизонтальной разметки, при вертикальной на ардуинку 3 секунды моргают лампочки а экран тупо висит, направьте на путь истинный ибо застрял в самом начале пути)
ах да, схему немного изменил поставив по 2 резистора на пин, один идет на землю и ресет подключил к 3.3 вольта, только так начало работать
medvedka777, "изображение сформированное в различных програмках" - слишком неконкретное понятие, чтобы по нему можно было провес ти диагностику ошибки.
Наиболее вероятным представляется, то, что изображение Вы храните в PROGMEM, а читать хотите из RAM.
http://javl.github.io/image2cpp/
например одна из них. Тогда вопрос как сделать правильно? просветите если не затруднит,я вставляю бмп файл , преобразовываю и код вставляю в скобки. например на выходе такой код
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xfc,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3f, 0xff, 0xff, 0x80, 0x00, 0x80, 0x00, 0x00,
0x00, 0x38, 0x00, 0xff, 0xff, 0xff, 0xe0, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x7c, 0x03, 0xff, 0x80,
0x1f, 0xf8, 0x07, 0xe0, 0x00, 0x00, 0x00, 0xfe, 0x07, 0xf8, 0x00, 0x03, 0xfc, 0x0f, 0xf0, 0x00,
0x00, 0x00, 0xfc, 0x1f, 0xe0, 0x00, 0x00, 0xff, 0x07, 0xf0, 0x00, 0x00, 0x01, 0xfc, 0x3f, 0x80,
0x00, 0x00, 0x3f, 0x83, 0xf8, 0x00, 0x00, 0x03, 0xf8, 0x7f, 0x00, 0x00, 0x00, 0x1f, 0xc3, 0xfc,
0x00, 0x00, 0x07, 0xf0, 0xfe, 0x00, 0x3f, 0x80, 0x0f, 0xe1, 0xfe, 0x00, 0x00, 0x07, 0xe1, 0xf8,
0x00, 0x3f, 0x80, 0x03, 0xf0, 0xfe, 0x00, 0x00, 0x0f, 0xe1, 0xf0, 0x00, 0x3f, 0x80, 0x01, 0xf8,
0xff, 0x00, 0x00, 0x0f, 0xc3, 0xf0, 0x00, 0x3f, 0x80, 0x01, 0xf8, 0x7f, 0x00, 0x00, 0x1f, 0xc7,
0xe0, 0x00, 0x3f, 0x80, 0x00, 0xfc, 0x3f, 0x80, 0x00, 0x1f, 0x87, 0xc0, 0x00, 0x3f, 0x80, 0x00,
0x7c, 0x3f, 0x80, 0x00, 0x3f, 0x8f, 0x80, 0x00, 0x3f, 0x80, 0x00, 0x3e, 0x1f, 0xc0, 0x00, 0x3f,
0x1f, 0x80, 0x00, 0x3f, 0x80, 0x00, 0x3f, 0x1f, 0xc0, 0x00, 0x3f, 0x1f, 0x00, 0x00, 0x3f, 0x80,
0x00, 0x1f, 0x1f, 0xc0, 0x00, 0x7f, 0x1f, 0x00, 0x00, 0x3f, 0x80, 0x00, 0x1f, 0x0f, 0xe0, 0x00,
0x7e, 0x3e, 0x00, 0x00, 0x3f, 0x80, 0x00, 0x0f, 0x8f, 0xe0, 0x00, 0x7e, 0x3e, 0x00, 0x00, 0x3f,
0x80, 0x00, 0x0f, 0x8f, 0xe0, 0x00, 0x7e, 0x3e, 0x00, 0x00, 0x3f, 0x80, 0x00, 0x0f, 0x87, 0xe0,
0x00, 0xfe, 0x3e, 0x00, 0x00, 0x3f, 0x80, 0x00, 0x07, 0xc7, 0xf0, 0x00, 0xfc, 0x7c, 0x00, 0x00,
0x3f, 0x80, 0x00, 0x07, 0xc7, 0xf0, 0x00, 0xfc, 0x7c, 0x00, 0x00, 0x3f, 0x80, 0x00, 0x07, 0xc7,
0xf0, 0x00, 0xfc, 0x7c, 0x00, 0x00, 0x3f, 0x80, 0x00, 0x07, 0xc7, 0xf0, 0x00, 0xfc, 0x7c, 0x00,
0x00, 0x3f, 0x80, 0x00, 0x07, 0xc7, 0xf0, 0x00, 0xfc, 0x7c, 0x00, 0x00, 0x3f, 0x80, 0x00, 0x07,
0xc7, 0xf0, 0x00, 0xfc, 0x7c, 0x00, 0x00, 0x3f, 0x80, 0x00, 0x07, 0xc7, 0xf0, 0x00, 0xfc, 0x7c,
0x00, 0x00, 0x3f, 0x80, 0x00, 0x07, 0xc7, 0xf0, 0x00, 0xfc, 0x7c, 0x00, 0x00, 0x3f, 0x80, 0x00,
0x07, 0xc7, 0xf0, 0x00, 0xfc, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xc7, 0xf0, 0x00, 0xfe,
0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xc7, 0xe0, 0x00, 0x7e, 0x3e, 0x00, 0x00, 0x00, 0x00,
0x00, 0x0f, 0x8f, 0xe0, 0x00, 0x7e, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x8f, 0xe0, 0x00,
0x7e, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x8f, 0xe0, 0x00, 0x7f, 0x1f, 0x00, 0x00, 0x00,
0x00, 0x00, 0x1f, 0x0f, 0xe0, 0x00, 0x3f, 0x1f, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x1f, 0x1f, 0xc0,
0x00, 0x3f, 0x1f, 0x80, 0x00, 0x3f, 0x80, 0x00, 0x3f, 0x1f, 0xc0, 0x00, 0x3f, 0x8f, 0x80, 0x00,
0x3f, 0xc0, 0x00, 0x3e, 0x3f, 0xc0, 0x00, 0x1f, 0x87, 0xc0, 0x00, 0x3f, 0xc0, 0x00, 0x7e, 0x3f,
0x80, 0x00, 0x1f, 0xc7, 0xe0, 0x00, 0x1f, 0x00, 0x00, 0xfc, 0x7f, 0x80, 0x00, 0x0f, 0xc3, 0xf0,
0x00, 0x00, 0x00, 0x00, 0xf8, 0x7f, 0x00, 0x00, 0x0f, 0xe3, 0xf0, 0x00, 0x00, 0x00, 0x01, 0xf8,
0xff, 0x00, 0x00, 0x07, 0xe1, 0xf8, 0x00, 0x00, 0x00, 0x03, 0xf0, 0xfe, 0x00, 0x00, 0x07, 0xf0,
0xfe, 0x00, 0x00, 0x00, 0x07, 0xe1, 0xfe, 0x00, 0x00, 0x03, 0xf8, 0x7f, 0x00, 0x00, 0x00, 0x1f,
0xc3, 0xfc, 0x00, 0x00, 0x01, 0xfc, 0x3f, 0x80, 0x00, 0x00, 0x3f, 0x87, 0xf8, 0x00, 0x00, 0x00,
0xfe, 0x1f, 0xe0, 0x00, 0x00, 0xff, 0x0f, 0xf8, 0x00, 0x00, 0x00, 0xff, 0x07, 0xf8, 0x00, 0x03,
0xfe, 0x07, 0xf0, 0x00, 0x00, 0x00, 0x7e, 0x03, 0xff, 0x80, 0x3f, 0xf8, 0x03, 0xe0, 0x00, 0x00,
0x00, 0x3c, 0x00, 0xff, 0xff, 0xff, 0xe0, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x18, 0x00, 0x3f, 0xff,
0xff, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
medvedka777, ВЫ думаете, глядя на массив цифр, я могу восстановить, что должно быть на картинке, и как эта картинка была получена?
Давайте зайдем с другой стороны: создайте маленькую картинку, которая заведомо легко умещается в оперативной памяти, и попытайтесь вывести ее на экран. Ну, скажем, 16х16 пикселей. Без всякого PROGMEM.
извините за дурацкие вопросы ибо чайник но как?
const unsigned char smileBmp[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xc0, 0x0b, 0x04, 0x82, 0xc4, 0x48, 0xd0, 0x85, 0x94, 0x10,
0xb2, 0x82, 0x0a, 0x50, 0x41, 0x4a, 0x00, 0x39, 0xa1, 0x0b, 0x14, 0x03, 0x43, 0x60, 0xd8, 0x23,
0xe0, 0x00, 0x00, 0x00, 0x00, 0x00};
tft.begin();
tft.fillScreen(ILI9341_BLACK);
tft.drawBitmap(0, 0, smileBmp, 19, 16, ILI9341_RED);
в таком виде?
не работает все равно, все те же бесполезно разбросанные по уже малюсенькому прямоугольнику точки(
прогонял во всех доступных режимах конвертера
я честно говоря не знаю как еще можно в этой библиотеке что то вывести
Что-то я не понял. Это - цветной монитор?
И что означают цифры 19 и 16 в процедуре вывода?
Если монитор - цветной, а цифры - размеры изображения, масив однозначно неправильный. Это - массив для однобитного изображения, а не цветного.
само собой, мне ведь надо чтобы занимало мало места, поэтому черная заливка и красный однобитный рисунок.
я и не знаю как делать цветное) суть именно в том чтобы не выводить бмпшный файл с сд карты, а использовать внутреннюю память, поэтому и изображение растровое и оно будет не 240на320 а раза в 4 меньше а потом увеличено, судя по описанию библиотеки эта функция для растрового изображения и создана, последняя надпись и закрашивает нужным цветом
Не знаю, может, у Вас какая-то хитрая библиотека, но обычно библиотеки для Ардуино выводят изображение один в один без преобразования. Т.е. в стандартном виде получается 16 бит (=2 байта) на пиксель, что соответствует ~150 кбайт на один экран.
Я ведь не случйно попросил вывести маленькое изображение: 16х16 займет 512 байт в памяти, что для пробы вполне приемлемо.
Вы сами пишете о том, что нужно разбивать задачу нап более мелкие. Вот давайте и начнем с того, что добьемся выводе на экран битмапа. Для начала - с родной глубиной цвета. А дальше уже будем думать, можно ли его как-то ужать, и если можно - то как. Правда, боюсь, для этого придется серьезно переписывать библиотеку. Вы к этому готовы?
Вот файл Adafruit_ILI9341.h
Вот встроенные цвета из этого файла
Вот принцип цветообразования.
Для работы с матрицей изображения в файле Adafruit_GFX.h ,есть 4 метода
Разумеется для начала воспользуемся верхним.
Для тех "кто в танке" сообщаяю (x,y) координаты верхнего левого угла будущей картинки на экране ,(w,h) это ширина и высота этой картинки. А вот *bitmap это указатель на массив даных этой картинки. Вот ту кучу цифр, которую суют в тему.
И наконец для тех кто еще и "в бронепоезде". То воспользуйтесь примером pictureEmbed
WILL NOT FIT ON ARDUINO UNO OR OTHER AVR BOARDS;
это что касательно примера, что касательно первого кусочка кода то хотелось бы не 16 битное изображение выводить, но хрен с ним давайте попробуем, но если не сложно расскажите как преобразовывать тот же файлик бмп в код
Собрал в кучу Пакет здесь https://yadi.sk/d/BOoYiicV3Kearx
Головной файл такой.
Результат компиляции под UNO
но если не сложно расскажите как преобразовывать тот же файлик бмп в код
Вообще- то в примере написано "на понятном не всем ангельском языке" http://www.rinkydinkelectronics.com/t_imageconverter565.php
WILL NOT FIT ON ARDUINO UNO OR OTHER AVR BOARDS;
это что касательно примера, что касательно первого кусочка кода то хотелось бы не 16 битное изображение выводить,
Насколько я понимаю (и фрагмены, приведеные quone это подтверждают), что другого способа вывода в данный момент просто не существует.
И, наверное, единственный способ добиться выводить изображение с меньшей глубиной цвета - это написать самому функции, реализующие эту возможность.
но хрен с ним давайте попробуем, но если не сложно расскажите как преобразовывать тот же файлик бмп в код
Общий алгоритм таков:
1. Изучаете формат входного файла.
2. Изучаете формат выходного файла.
3. Находите между ними точки соприкосновения и придумываете алгоритм преобразования.
4. Реализуете этот алгоритм в удобном для Вас виде.
Первая проблема, с которой Вы столкнетесь на этом пути, - существование нескольких достаточно сильно различающихся вариантов формата BMP-файла. В частноси, с индексным и непосредственным представлением цвета. Причем, варианты с малой глубиной цвета - как раз индексные, которые Ваш дисплей не поддерживает (в отличие, например, от VGA, который основан как раз на индексном представлении).
В общем, если Вас прокачка скилла программирования интересует больше, чем, собственно, изготовление устройства - этот вариант как раз для Вас.
Если же хотите "отделаться малой кровью" - замените дисплей на что-нибу типа Nextion, который умеет выполнять высокоуровневые команды, причем сам работает с SD картой без помощи Ардуино.
мужики спасибо, буду стараться не использовать много рисунков либо буду подключать сд карту, разьем которой впринципе есть сзади экрана
пример кода что вы мне дали все равно отказывается выводить изображение...
я скопировал код и вставил его в файл примера там где уже есть драгон н, ничего не вывело
разобрался, в вашем коде местами было перепутаны значения dc cs. теперь буду пробовать) спасибо огромное
medvedka777, еще раз: Вы пытались выводить картинку в 16-разрядной кодировке цвета (битмап 19х16 при этом должен иметь длину 608 байт) или решили поступить так, как обычно и поступают новички - делают совсем не то, что им советуют, после чего удивляются, почему ничего не работает?
andriano, все заработало, я впринципе добился от Вас чего хотел, повыкидывал ненужные части кода и у меня теперь есть рабочий кусочек, попробую картинку 30на 30 и увеличу ее, так и попробую сэкономить на памяти
ну и само собой предстоит много работы впереди, надо организовать приоритеты вывода картинок при подаче 0или 1, в зависимости от того что приходит от машины, масленка будет гореть всегда если на ногу не пришел 0, если пришел смотрим дальше, охлаждайка....итд, само собой низкий уровень топлива это минимальный приоритет, который хотелось впоследствии выводить в углу , выше расхода
Вы не посмотрите код програмки в этой теме http://arduino.ru/forum/programmirovanie/bortovoi-kompyuter-na-audi
не знаю как правильно организовать вывод значений на экран и их правильное затирание и изменение, решил обойтись без растра, чисто надписями и примитивными рисунками