помогите разобраться с выводом растрового изображения

medvedka777
Offline
Зарегистрирован: 29.06.2017

добрый день. намылился сделать бортовую систему контроля на свой авто, в проекте со временем добавить функцию отображения мгновенного и среднего расхода и вот для начала подобрал подходящий по размерам экран который можно встроить в приборную панель вместо родного и на основе ардуино уно пытаюсь заставить это все работать. Так как в программировании я мягко говоря не силен все стараюсь делать методом проб и ошибок разбивая большую задачу на маленькие, и вот на данный момент я научился выводить на экран текст перед этим собрав на макетной плате свое мега устройство) согласовав логику 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 секунды моргают лампочки а экран тупо висит, направьте на путь истинный ибо застрял в самом начале пути)

medvedka777
Offline
Зарегистрирован: 29.06.2017

ах да, схему немного изменил поставив по 2 резистора на пин, один идет на землю и ресет подключил к 3.3 вольта, только так начало работать

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

medvedka777, "изображение сформированное в различных програмках" - слишком неконкретное понятие, чтобы по нему можно было провес ти диагностику ошибки.

Наиболее вероятным представляется, то, что изображение Вы храните в PROGMEM, а читать хотите из RAM.

 

medvedka777
Offline
Зарегистрирован: 29.06.2017

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

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

medvedka777, ВЫ думаете, глядя на массив цифр, я могу восстановить, что должно быть на картинке, и как эта картинка была получена?

Давайте зайдем с другой стороны: создайте маленькую картинку, которая заведомо легко умещается в оперативной памяти, и попытайтесь вывести ее на экран. Ну, скажем, 16х16 пикселей. Без всякого PROGMEM.

medvedka777
Offline
Зарегистрирован: 29.06.2017

извините за дурацкие вопросы ибо чайник но как?

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);

в таком виде?

не работает все равно, все те же бесполезно разбросанные по уже малюсенькому прямоугольнику точки(

прогонял во всех доступных режимах конвертера

я честно говоря не знаю как еще можно в этой библиотеке что то вывести

medvedka777
Offline
Зарегистрирован: 29.06.2017

вот такая картиночка

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Что-то я не понял. Это - цветной монитор?

И что означают цифры 19 и 16 в процедуре вывода?

Если монитор - цветной, а цифры - размеры изображения, масив однозначно неправильный. Это - массив для однобитного изображения, а не цветного.

medvedka777
Offline
Зарегистрирован: 29.06.2017

само собой, мне ведь надо чтобы занимало мало места, поэтому черная заливка и красный однобитный рисунок.

я и не знаю как делать цветное) суть именно в том чтобы не выводить бмпшный файл с сд карты, а использовать внутреннюю память, поэтому и изображение растровое и оно будет не 240на320 а раза в 4 меньше а потом увеличено, судя по описанию библиотеки эта функция для растрового изображения и создана, последняя надпись и закрашивает нужным цветом

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Не знаю, может, у Вас какая-то хитрая библиотека, но обычно библиотеки для Ардуино выводят изображение один в один без преобразования. Т.е. в стандартном виде получается 16 бит (=2 байта) на пиксель, что соответствует ~150 кбайт на один экран. 

Я ведь не случйно попросил вывести маленькое изображение: 16х16 займет 512 байт в памяти, что для пробы вполне приемлемо.

Вы сами пишете о том, что нужно разбивать задачу нап более мелкие. Вот давайте и начнем с того, что добьемся выводе на экран битмапа. Для начала - с родной глубиной цвета. А дальше уже будем думать, можно ли его как-то ужать, и если можно - то как. Правда, боюсь, для этого придется серьезно переписывать библиотеку. Вы к этому готовы?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Вот файл Adafruit_ILI9341.h

/******************************************************************
  This is our library for the Adafruit ILI9341 Breakout and Shield
  ----> http://www.adafruit.com/products/1651

  Check out the links above for our tutorials and wiring diagrams
  These displays use SPI to communicate, 4 or 5 pins are required
  to interface (RST is optional)
  Adafruit invests time and resources providing this open source
  code, please support Adafruit and open-source hardware by
  purchasing products from Adafruit!

  Written by Limor Fried/Ladyada for Adafruit Industries.
  MIT license, all text above must be included in any redistribution
 *******************************************************************/

#ifndef _ADAFRUIT_ILI9341H_
#define _ADAFRUIT_ILI9341H_

#if ARDUINO >= 100
 #include "Arduino.h"
 #include "Print.h"
#else
 #include "WProgram.h"
#endif
#include <SPI.h>
#include "Adafruit_GFX.h"

#if defined(ARDUINO_STM32_FEATHER)
typedef volatile uint32 RwReg;
#endif
#if defined(ARDUINO_FEATHER52)
typedef volatile uint32_t RwReg;
#endif

#define ILI9341_TFTWIDTH   240
#define ILI9341_TFTHEIGHT  320

#define ILI9341_NOP        0x00
#define ILI9341_SWRESET    0x01
#define ILI9341_RDDID      0x04
#define ILI9341_RDDST      0x09

#define ILI9341_SLPIN      0x10
#define ILI9341_SLPOUT     0x11
#define ILI9341_PTLON      0x12
#define ILI9341_NORON      0x13

#define ILI9341_RDMODE     0x0A
#define ILI9341_RDMADCTL   0x0B
#define ILI9341_RDPIXFMT   0x0C
#define ILI9341_RDIMGFMT   0x0D
#define ILI9341_RDSELFDIAG 0x0F

#define ILI9341_INVOFF     0x20
#define ILI9341_INVON      0x21
#define ILI9341_GAMMASET   0x26
#define ILI9341_DISPOFF    0x28
#define ILI9341_DISPON     0x29

#define ILI9341_CASET      0x2A
#define ILI9341_PASET      0x2B
#define ILI9341_RAMWR      0x2C
#define ILI9341_RAMRD      0x2E

#define ILI9341_PTLAR      0x30
#define ILI9341_MADCTL     0x36
#define ILI9341_VSCRSADD   0x37
#define ILI9341_PIXFMT     0x3A

#define ILI9341_FRMCTR1    0xB1
#define ILI9341_FRMCTR2    0xB2
#define ILI9341_FRMCTR3    0xB3
#define ILI9341_INVCTR     0xB4
#define ILI9341_DFUNCTR    0xB6

#define ILI9341_PWCTR1     0xC0
#define ILI9341_PWCTR2     0xC1
#define ILI9341_PWCTR3     0xC2
#define ILI9341_PWCTR4     0xC3
#define ILI9341_PWCTR5     0xC4
#define ILI9341_VMCTR1     0xC5
#define ILI9341_VMCTR2     0xC7

#define ILI9341_RDID1      0xDA
#define ILI9341_RDID2      0xDB
#define ILI9341_RDID3      0xDC
#define ILI9341_RDID4      0xDD

#define ILI9341_GMCTRP1    0xE0
#define ILI9341_GMCTRN1    0xE1
/*
#define ILI9341_PWCTR6     0xFC

 */

// Color definitions
#define ILI9341_BLACK       0x0000      /*   0,   0,   0 */
#define ILI9341_NAVY        0x000F      /*   0,   0, 128 */
#define ILI9341_DARKGREEN   0x03E0      /*   0, 128,   0 */
#define ILI9341_DARKCYAN    0x03EF      /*   0, 128, 128 */
#define ILI9341_MAROON      0x7800      /* 128,   0,   0 */
#define ILI9341_PURPLE      0x780F      /* 128,   0, 128 */
#define ILI9341_OLIVE       0x7BE0      /* 128, 128,   0 */
#define ILI9341_LIGHTGREY   0xC618      /* 192, 192, 192 */
#define ILI9341_DARKGREY    0x7BEF      /* 128, 128, 128 */
#define ILI9341_BLUE        0x001F      /*   0,   0, 255 */
#define ILI9341_GREEN       0x07E0      /*   0, 255,   0 */
#define ILI9341_CYAN        0x07FF      /*   0, 255, 255 */
#define ILI9341_RED         0xF800      /* 255,   0,   0 */
#define ILI9341_MAGENTA     0xF81F      /* 255,   0, 255 */
#define ILI9341_YELLOW      0xFFE0      /* 255, 255,   0 */
#define ILI9341_WHITE       0xFFFF      /* 255, 255, 255 */
#define ILI9341_ORANGE      0xFD20      /* 255, 165,   0 */
#define ILI9341_GREENYELLOW 0xAFE5      /* 173, 255,  47 */
#define ILI9341_PINK        0xF81F

#if defined (__AVR__) || defined(TEENSYDUINO) || defined(ESP8266) || defined (ESP32) || defined(__arm__)
#define USE_FAST_PINIO
#endif

class Adafruit_ILI9341 : public Adafruit_GFX {
    protected:

    public:
        Adafruit_ILI9341(int8_t _CS, int8_t _DC, int8_t _MOSI, int8_t _SCLK, int8_t _RST = -1, int8_t _MISO = -1);
        Adafruit_ILI9341(int8_t _CS, int8_t _DC, int8_t _RST = -1);

#ifndef ESP32
        void      begin(uint32_t freq = 0);
#else
        void      begin(uint32_t freq = 0, SPIClass &spi=SPI);
#endif
        void      setRotation(uint8_t r);
        void      invertDisplay(boolean i);
        void      scrollTo(uint16_t y);

        // Required Non-Transaction
        void      drawPixel(int16_t x, int16_t y, uint16_t color);

        // Transaction API
        void      startWrite(void);
        void      endWrite(void);
        void      writePixel(int16_t x, int16_t y, uint16_t color);
        void      writeFillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color);
        void      writeFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color);
        void      writeFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color);

        // Transaction API not used by GFX
        void      setAddrWindow(uint16_t x, uint16_t y, uint16_t w, uint16_t h);
        void      writePixel(uint16_t color);
        void      writePixels(uint16_t * colors, uint32_t len);
        void      writeColor(uint16_t color, uint32_t len);
	void      pushColor(uint16_t color);

        // Recommended Non-Transaction
        void      drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color);
        void      drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color);
        void      fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color);

        using     Adafruit_GFX::drawRGBBitmap; // Check base class first
        void      drawRGBBitmap(int16_t x, int16_t y,
                    uint16_t *pcolors, int16_t w, int16_t h);

        uint8_t   readcommand8(uint8_t reg, uint8_t index = 0);

        uint16_t  color565(uint8_t r, uint8_t g, uint8_t b);

    private:
#ifdef ESP32
        SPIClass _spi;
#endif
        uint32_t _freq;
#if defined (__AVR__) || defined(TEENSYDUINO)
        int8_t  _cs, _dc, _rst, _sclk, _mosi, _miso;
#ifdef USE_FAST_PINIO
        volatile uint8_t *mosiport, *misoport, *clkport, *dcport, *csport;
        uint8_t  mosipinmask, misopinmask, clkpinmask, cspinmask, dcpinmask;
#endif
#elif defined (__arm__)
        int32_t  _cs, _dc, _rst, _sclk, _mosi, _miso;
#ifdef USE_FAST_PINIO
        volatile RwReg *mosiport, *misoport, *clkport, *dcport, *csport;
        uint32_t  mosipinmask, misopinmask, clkpinmask, cspinmask, dcpinmask;
#endif
#elif defined (ESP8266) || defined (ESP32)
        int8_t   _cs, _dc, _rst, _sclk, _mosi, _miso;
#ifdef USE_FAST_PINIO
        volatile uint32_t *mosiport, *misoport, *clkport, *dcport, *csport;
        uint32_t  mosipinmask, misopinmask, clkpinmask, cspinmask, dcpinmask;
#endif
#else
        int8_t      _cs, _dc, _rst, _sclk, _mosi, _miso;
#endif

        void        writeCommand(uint8_t cmd);
        void        spiWrite(uint8_t v);
        uint8_t     spiRead(void);
};

#endif

Вот встроенные цвета из этого файла 

// Color definitions
#define ILI9341_BLACK       0x0000      /*   0,   0,   0 */
#define ILI9341_NAVY        0x000F      /*   0,   0, 128 */
#define ILI9341_DARKGREEN   0x03E0      /*   0, 128,   0 */
#define ILI9341_DARKCYAN    0x03EF      /*   0, 128, 128 */
#define ILI9341_MAROON      0x7800      /* 128,   0,   0 */
#define ILI9341_PURPLE      0x780F      /* 128,   0, 128 */
#define ILI9341_OLIVE       0x7BE0      /* 128, 128,   0 */
#define ILI9341_LIGHTGREY   0xC618      /* 192, 192, 192 */
#define ILI9341_DARKGREY    0x7BEF      /* 128, 128, 128 */
#define ILI9341_BLUE        0x001F      /*   0,   0, 255 */
#define ILI9341_GREEN       0x07E0      /*   0, 255,   0 */
#define ILI9341_CYAN        0x07FF      /*   0, 255, 255 */
#define ILI9341_RED         0xF800      /* 255,   0,   0 */
#define ILI9341_MAGENTA     0xF81F      /* 255,   0, 255 */
#define ILI9341_YELLOW      0xFFE0      /* 255, 255,   0 */
#define ILI9341_WHITE       0xFFFF      /* 255, 255, 255 */
#define ILI9341_ORANGE      0xFD20      /* 255, 165,   0 */
#define ILI9341_GREENYELLOW 0xAFE5      /* 173, 255,  47 */
#define ILI9341_PINK        0xF81F

Вот принцип цветообразования.

// Pass 8-bit (each) R,G,B, get back 16-bit packed color
uint16_t Adafruit_ILI9341::color565(uint8_t r, uint8_t g, uint8_t b) {
    return ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | ((b & 0xF8) >> 3);
}

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Для работы с матрицей изображения в файле Adafruit_GFX.h ,есть 4 метода

    drawRGBBitmap(int16_t x, int16_t y, const uint16_t bitmap[],
      int16_t w, int16_t h),
    drawRGBBitmap(int16_t x, int16_t y, uint16_t *bitmap,
      int16_t w, int16_t h),
    drawRGBBitmap(int16_t x, int16_t y,
      const uint16_t bitmap[], const uint8_t mask[],
      int16_t w, int16_t h),
    drawRGBBitmap(int16_t x, int16_t y,
      uint16_t *bitmap, uint8_t *mask, int16_t w, int16_t h),

Разумеется для начала воспользуемся верхним.

// Draw a RAM-resident 16-bit image (RGB 5/6/5) at the specified (x,y)
// position.  For 16-bit display devices; no color reduction performed.
void Adafruit_GFX::drawRGBBitmap(int16_t x, int16_t y,
  uint16_t *bitmap, int16_t w, int16_t h) {
    startWrite();
    for(int16_t j=0; j<h; j++, y++) {
        for(int16_t i=0; i<w; i++ ) {
            writePixel(x+i, y, bitmap[j * w + i]);
        }
    }
    endWrite();
}

Для тех "кто в танке" сообщаяю (x,y) координаты верхнего левого угла будущей картинки на экране ,(w,h) это ширина и высота этой картинки. А вот *bitmap это указатель на массив даных этой картинки. Вот ту кучу цифр, которую суют в тему.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

И наконец для тех кто еще и "в бронепоезде". То воспользуйтесь примером pictureEmbed

medvedka777
Offline
Зарегистрирован: 29.06.2017

WILL NOT FIT ON ARDUINO UNO OR OTHER AVR BOARDS;

это что касательно примера, что касательно первого кусочка кода то хотелось бы не 16 битное изображение выводить, но хрен с ним давайте попробуем, но если не сложно расскажите как преобразовывать тот же файлик бмп в код

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

medvedka777 пишет:
WILL NOT FIT ON ARDUINO UNO OR OTHER AVR BOARDS;

Собрал в кучу Пакет здесь https://yadi.sk/d/BOoYiicV3Kearx

Головной файл такой.

// ILI9341 example with embedded color bitmaps in sketch.
// WILL NOT FIT ON ARDUINO UNO OR OTHER AVR BOARDS;
// uses large bitmap image stored in array!

// Options for converting images to the format used here include:
//   http://www.rinkydinkelectronics.com/t_imageconverter565.php
// or
//  GIMP (https://www.gimp.org/) as follows:
//    1. File -> Export As
//    2. In Export Image dialog, use 'C source code (*.c)' as filetype.
//    3. Press export to get the export options dialog.
//    4. Type the desired variable name into the 'prefixed name' box.
//    5. Uncheck 'GLIB types (guint8*)'
//    6. Check 'Save as RGB565 (16-bit)'
//    7. Press export to save your image.
//  Assuming 'image_name' was typed in the 'prefixed name' box of step 4,
//  you can have to include the c file, then using the image can be done with:
//    tft.drawRGBBitmap(0, 0, image_name.pixel_data, image_name.width, image_name.height);
//  See also https://forum.pjrc.com/threads/35575-Export-for-ILI9341_t3-with-GIMP

//#include <SPI.h>
#include "Adafruit_ILI9341.h"
#include "dragon.h"

// For the Adafruit shield, these are the default.
//#define TFT_DC 9
//#define TFT_CS 10

// Feather 32u4 or M0 with TFT FeatherWing:
#define TFT_DC 10
#define TFT_CS  9
// ESP8266:
//#define TFT_DC 15
//#define TFT_CS 0
// Other boards (including Feather boards) may have other pinouts;
// see learn.adafruit.com/adafruit-2-4-tft-touch-screen-featherwing/pinouts

Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
// If using the breakout, change pins as desired
//Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_CLK, TFT_RST, TFT_MISO);

void setup() {
  tft.begin();
}

void loop(void) {
  for(uint8_t r=0; r<4; r++) {
    tft.setRotation(r);
    tft.fillScreen(ILI9341_BLACK);
    for(uint8_t j=0; j<20; j++) {
      tft.drawRGBBitmap(
        random(-DRAGON_WIDTH , tft.width()),
        random(-DRAGON_HEIGHT, tft.height()),
#if defined(__AVR__) || defined(ESP8266)
        dragonBitmap,
#else
        // Some non-AVR MCU's have a "flat" memory model and don't
        // distinguish between flash and RAM addresses.  In this case,
        // the RAM-resident-optimized drawRGBBitmap in the ILI9341
        // library can be invoked by forcibly type-converting the
        // PROGMEM bitmap pointer to a non-const uint16_t *.
        (uint16_t *)dragonBitmap,
#endif
        DRAGON_WIDTH, DRAGON_HEIGHT);
      delay(1); // Allow ESP8266 to handle watchdog & WiFi stuff
    }
    delay(3000);
  }
}

Результат компиляции под UNO


Скетч использует 24920 байт (77%) памяти устройства. Всего доступно 32256 байт.
Глобальные переменные используют 105 байт (5%) динамической памяти, оставляя 1943 байт для локальных переменных. Максимум: 2048 байт.

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

medvedka777 пишет:

 но если не сложно расскажите как преобразовывать тот же файлик бмп в код

Вообще- то  в примере написано "на понятном не всем ангельском языке"  http://www.rinkydinkelectronics.com/t_imageconverter565.php

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

medvedka777 пишет:

WILL NOT FIT ON ARDUINO UNO OR OTHER AVR BOARDS;

это что касательно примера, что касательно первого кусочка кода то хотелось бы не 16 битное изображение выводить,

Насколько я понимаю (и фрагмены, приведеные quone это подтверждают), что другого способа вывода в данный момент просто не существует.

И, наверное, единственный способ добиться выводить изображение с меньшей глубиной цвета - это написать самому функции, реализующие эту возможность.

Цитата:

но хрен с ним давайте попробуем, но если не сложно расскажите как преобразовывать тот же файлик бмп в код

Общий алгоритм таков:

1. Изучаете формат входного файла.

2. Изучаете формат выходного файла.

3. Находите между ними точки соприкосновения и придумываете алгоритм преобразования.

4. Реализуете этот алгоритм в удобном для Вас виде.

Первая проблема, с которой Вы столкнетесь на этом пути, - существование нескольких достаточно сильно различающихся вариантов формата BMP-файла. В частноси, с индексным и непосредственным представлением цвета. Причем, варианты с малой глубиной цвета - как раз индексные, которые Ваш дисплей не поддерживает (в отличие, например, от VGA, который основан как раз на индексном представлении).

В общем, если Вас прокачка скилла программирования интересует больше, чем, собственно, изготовление устройства - этот вариант как раз для Вас.

Если же хотите "отделаться малой кровью" - замените дисплей на что-нибу типа Nextion, который умеет выполнять высокоуровневые команды, причем сам работает с SD картой без помощи Ардуино.

medvedka777
Offline
Зарегистрирован: 29.06.2017

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

пример кода что вы мне дали все равно отказывается выводить изображение...

я скопировал код и вставил его в файл примера там где уже есть драгон н, ничего не вывело

medvedka777
Offline
Зарегистрирован: 29.06.2017

разобрался, в вашем коде местами было перепутаны значения dc cs. теперь буду пробовать) спасибо огромное

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

medvedka777, еще раз: Вы пытались выводить картинку в 16-разрядной кодировке цвета (битмап 19х16 при этом должен иметь длину 608 байт) или решили поступить так, как обычно и поступают новички - делают совсем не то, что им советуют, после чего удивляются, почему ничего не работает?

medvedka777
Offline
Зарегистрирован: 29.06.2017

andriano, все заработало, я впринципе добился от Вас чего хотел, повыкидывал ненужные части кода и у меня теперь есть рабочий кусочек, попробую картинку 30на 30 и увеличу ее, так и попробую сэкономить на памяти

medvedka777
Offline
Зарегистрирован: 29.06.2017

ну и само собой предстоит много работы впереди, надо организовать приоритеты вывода картинок при подаче 0или 1, в зависимости от того что приходит от машины, масленка будет гореть всегда если на ногу не пришел 0, если пришел смотрим дальше, охлаждайка....итд, само собой низкий уровень топлива это минимальный приоритет, который хотелось впоследствии выводить в углу , выше расхода

medvedka777
Offline
Зарегистрирован: 29.06.2017

Вы не посмотрите код програмки в этой теме http://arduino.ru/forum/programmirovanie/bortovoi-kompyuter-na-audi

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