TFT LCD для Ардуино

B_53-7.420w
Offline
Зарегистрирован: 22.09.2017

Здравствуйте.

Недавно приобрёл сенсорный 3.95-дюймовый TFT LCD для Arduino Uno R3 (фото ниже) китайской фирмы "mcufriend" (http://www.mcufriend.com).

Установил этот шилд на плату Arduino Uno R3 (см. фото).

Перебрал кучу библиотек, но до сих пор созерцаю белый экран (фото ниже).

Не могу определить модель видеоконтроллера. При считывании ID программой LCD_ID_Reader получаю:

А graphicstest (из библиотеки "Самурай") выдаёт следующую информацию:

Пожалуйста, подскажите:

  1. Какой микроконтроллер имеет такой ID.
  2. Какая к нему подходит библиотека.
  3. Насколько хорош вышеописанный экран (возможно, кто-нибудь им пользовался).
  4. Можно ли его установить на Arduino Due.

Заранее благодарен всем откликнувшимся.

Дмитрий.

 

slider
Онлайн
Зарегистрирован: 17.06.2014

поищите в инете adafruit ili9488  , mcufriend ili9488 .

http://arduino.ru/forum/apparatnye-voprosy/arduino-i-displei-ot-sotikov-mobilnykh-telefonov?page=8#comment-290976

// напишите потом что помогло .

B_53-7.420w
Offline
Зарегистрирован: 22.09.2017

Спасибо, slider!

Вы мне очень сильно помогли. Я и раньше подозревал, что этот экранчик управляется ili9488. Но все библиотеки, которые я для него скачивал, не подходили. В том числе mcufriend ili9488 и adafruit ili9488. Хотя читал на форумах, что они кому-то подошли. Тогда я стал считывать ID. Вначале программы, названия которых указаны выше, выдавали ID = 0x0000. И я уже собирался было указать именно его. Но во время подготовки данной темы решил ещё раз проверить. Заново откомпилировал тексты программ, отсоединил экран от платы Arduino и снова его подсоединил. И...о, чудо (ID уже не 0x0000, а 0x0101)! Но на этом чудеса не закончились...

...Когда вы, slider, посоветовали мне посмотреть библиотеки, которые не подошли, я решил начать с библиотеки mcufriend ili9488. В поисковой строке Googl-а прямо так и набрал: "mcufriend ili9488". И наткнулся вот на эту ссылку: https://ruclip.com/video/VnRVbxQESnY/arduino-ili9488-480x320-tft-lcd-review.html. Перейдя по ней, я нашёл видеоинструкцию по установке и дальнейшей настройке данного экрана. А также ссылки на библиотеки. Вот они:

  1. MCU Friend kbv library:
    forum.arduino.cc/index.php?topic=366304.msg2524865#msg2524865.
  2. Adafruit-GFX-Library:
    github.com/adafruit/Adafruit-GFX-Library.
  3. Touch-Screen-Library:
    github.com/adafruit/Touch-Screen-Library.

Я скачал их и установил. Затем сделал всё так, как было показано в видео (правда, не пришлось исправлять строку в скетче (Так откомпилировался!)). Да и строка в нём, почему-то, другая! И случилось новое чудо (экран заработал):

На предыдущем фото график y = tg(x) (жёлтая линия) какой-то странный (Линия не сплошная!). Вот скетч:

Это от того, что в скетче что-то напутали или библиотеки "не совсем те, что надо"?

Вот ещё фото работающего экранчика:

И новое чудо...

...Вы только взгляните на фото ниже!

ID-то не тот, что был считан ранее!!! В связи с этим следующий вопрос...

slider
Онлайн
Зарегистрирован: 17.06.2014

эт хорошо.

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

id может лежать в разных местах и по разному , id reader-ы заточены не на все места поиска , и как они могут выдать несколько разных мест как одно итоговое? только если им известны тонкости некоторых контроллеров, но далеко не всех.

каков ответ - лог от читалки v5.3 ?  http://arduino.ru/forum/apparatnye-voprosy/arduino-i-displei-ot-sotikov-mobilnykh-telefonov?page=8#comment-290976

ID 0x6814  это контроллер RM68140 , он сродни ILI9486 , похож на ILI9488 , поэтому и команды запуска в основном подходят (разница заметна может быть начальных настройках в гамме цветности). 

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

B_53-7.420w
Offline
Зарегистрирован: 22.09.2017

..:

  1. Почему программа, полученная компиляцией скетча "Touch_shield_kbv" (см. ниже) пакета "MCUFRIEND_kbv-2.9.3", выдаёт ID 0x6814 вместо 0x9488 (или на крайний случай - 0x0101)?

Скетч "Touch_shield_kbv":

// the regular Adafruit "TouchScreen.h" library only works on AVRs

// different mcufriend shields have Touchscreen on different pins
// and rotation.
// Run the UTouch_calibr_kbv sketch for calibration of your shield

#include <Adafruit_GFX.h>    // Core graphics library
//#include <Adafruit_TFTLCD.h> // Hardware-specific library
//Adafruit_TFTLCD tft(A3, A2, A1, A0, A4);
#include <MCUFRIEND_kbv.h>
MCUFRIEND_kbv tft;       // hard-wired for UNO shields anyway.
#include <TouchScreen.h>

#if defined(__SAM3X8E__)
#undef __FlashStringHelper::F(string_literal)
#define F(string_literal) string_literal
#endif

// These are the pins for some typical shields!
// S6D0154: YP=A1, XM=A2, YM=7, XP=6
// ST7783 : YP=A2, XM=A1, YM=6, XP=7
// ILI9320: YP=A2, XM=A3, YM=8, XP=9
// ILI9325: YP=A1, XM=A2, YM=7, XP=6
// ILI9325BG: YP=A2, XM=A1, YM=6, XP=7
// ILI9341: YP=A2, XM=A1, YM=7, XP=6
// ILI9488: YP=A1, XM=A2, YM=7, XP=6
// R65109V: YP=A2, XM=A1, YM=6, XP=7

// most mcufriend shields use these pins and Portrait mode:
uint8_t YP = A1;  // must be an analog pin, use "An" notation!
uint8_t XM = A2;  // must be an analog pin, use "An" notation!
uint8_t YM = 7;   // can be a digital pin
uint8_t XP = 6;   // can be a digital pin
uint8_t SwapXY = 0;

uint16_t TS_LEFT = 920;
uint16_t TS_RT  = 150;
uint16_t TS_TOP = 940;
uint16_t TS_BOT = 120;
char *name = "Unknown controller";

// For better pressure precision, we need to know the resistance
// between X+ and X- Use any multimeter to read it
// For the one we're using, its 300 ohms across the X plate
TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);
TSPoint tp;

#define MINPRESSURE 20
#define MAXPRESSURE 1000

#define SWAP(a, b) {uint16_t tmp = a; a = b; b = tmp;}

int16_t BOXSIZE;
int16_t PENRADIUS = 3;
uint16_t identifier, oldcolor, currentcolor;
uint8_t Orientation = 0;    //PORTRAIT

// Assign human-readable names to some common 16-bit color values:
#define BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF

void show_Serial(void)
{
    Serial.print(F("Found "));
    Serial.print(name);
    Serial.println(F(" LCD driver"));
    Serial.print(F("ID=0x"));
    Serial.println(identifier, HEX);
    Serial.println("Screen is " + String(tft.width()) + "x" + String(tft.height()));
    Serial.println("Calibration is: ");
    Serial.println("LEFT = " + String(TS_LEFT) + " RT  = " + String(TS_RT));
    Serial.println("TOP  = " + String(TS_TOP)  + " BOT = " + String(TS_BOT));
    Serial.print("Wiring is: ");
    Serial.println(SwapXY ? "SWAPXY" : "PORTRAIT");
    Serial.println("YP=" + String(YP)  + " XM=" + String(XM));
    Serial.println("YM=" + String(YM)  + " XP=" + String(XP));
}

void show_tft(void)
{
    tft.setCursor(0, 0);
    tft.setTextSize(2);
    tft.print(F("Found "));
    tft.print(name);
    tft.println(F(" LCD"));
    tft.setTextSize(1);
    tft.print(F("ID=0x"));
    tft.println(identifier, HEX);
    tft.println("Screen is " + String(tft.width()) + "x" + String(tft.height()));
    tft.println("Calibration is: ");
    tft.println("LEFT = " + String(TS_LEFT) + " RT  = " + String(TS_RT));
    tft.println("TOP  = " + String(TS_TOP)  + " BOT = " + String(TS_BOT));
    tft.print("\nWiring is: ");
    if (SwapXY) {
        tft.setTextColor(CYAN);
        tft.setTextSize(2);
    }
    tft.println(SwapXY ? "SWAPXY" : "PORTRAIT");
    tft.println("YP=" + String(YP)  + " XM=" + String(XM));
    tft.println("YM=" + String(YM)  + " XP=" + String(XP));
    tft.setTextSize(2);
    tft.setTextColor(RED);
    tft.setCursor((tft.width() - 48) / 2, (tft.height() * 2) / 4);
    tft.print("EXIT");
    tft.setTextColor(YELLOW, BLACK);
    tft.setCursor(0, (tft.height() * 6) / 8);
    tft.print("Touch screen for loc");
    while (1) {
        tp = ts.getPoint();
        pinMode(XM, OUTPUT);
        pinMode(YP, OUTPUT);
        pinMode(XP, OUTPUT);
        pinMode(YM, OUTPUT);
        if (tp.z < MINPRESSURE || tp.z > MAXPRESSURE) continue;
        if (tp.x > 450 && tp.x < 570  && tp.y > 450 && tp.y < 570) break;
        tft.setCursor(0, (tft.height() * 3) / 4);
        tft.print("tp.x=" + String(tp.x) + " tp.y=" + String(tp.y) + "   ");
    }
}


void setup(void)
{
    uint16_t tmp;
    tft.begin(9600);

    tft.reset();
    identifier = tft.readID();
    //    if (identifier == 0) identifier = 0x9341;
    if (0) {
    } else if (identifier == 0x0154) {
        name = "S6D0154";
        TS_LEFT = 914; TS_RT = 181; TS_TOP = 957; TS_BOT = 208;
    } else if (identifier == 0x7783) {
        name = "ST7781";
        TS_LEFT = 865; TS_RT = 155; TS_TOP = 942; TS_BOT = 153;
        SwapXY = 1;
    } else if (identifier == 0x7789) {
        name = "ST7789V";
        YP = A2; XM = A1; YM = 7; XP = 6;
        TS_LEFT = 906; TS_RT = 169; TS_TOP = 161; TS_BOT = 919;
    } else if (identifier == 0x9320) {
        name = "ILI9320";
        YP = A3; XM = A2; YM = 9; XP = 8;
        TS_LEFT = 902; TS_RT = 137; TS_TOP = 941; TS_BOT = 134;
    } else if (identifier == 0x9325) {
        name = "ILI9325";
        TS_LEFT = 900; TS_RT = 103; TS_TOP = 96; TS_BOT = 904;
    } else if (identifier == 0x9325) {
        name = "ILI9325 Green Dog";
        TS_LEFT = 900; TS_RT = 130; TS_TOP = 940; TS_BOT = 130;
    } else if (identifier == 0x9327) {
        name = "ILI9327";
        TS_LEFT = 899; TS_RT = 135; TS_TOP = 935; TS_BOT = 79;
        SwapXY = 1;
    } else if (identifier == 0x9329) {
        name = "ILI9329";
        TS_LEFT = 143; TS_RT = 885; TS_TOP = 941; TS_BOT = 131;
        SwapXY = 1;
    } else if (identifier == 0x9341) {
        name = "ILI9341 BLUE";
        TS_LEFT = 920; TS_RT = 139; TS_TOP = 944; TS_BOT = 150;
        SwapXY = 0;
    } else if (identifier == 0) {
        name = "ILI9341 DealExtreme";
        TS_LEFT = 893; TS_RT = 145; TS_TOP = 930; TS_BOT = 135;
        SwapXY = 1;
    } else if (identifier == 0 || identifier == 0x9341) {
        name = "ILI9341";
        TS_LEFT = 128; TS_RT = 911; TS_TOP = 105; TS_BOT = 908;
        SwapXY = 1;
    } else if (identifier == 0x9486) {
        name = "ILI9486";
        TS_LEFT = 904; TS_RT = 170; TS_TOP = 950; TS_BOT = 158;
    } else if (identifier == 0x9488) {
        name = "ILI9488";
        TS_LEFT = 904; TS_RT = 170; TS_TOP = 950; TS_BOT = 158;
    } else if (identifier == 0xB509) {
        name = "R61509V";
        TS_LEFT = 889; TS_RT = 149; TS_TOP = 106; TS_BOT = 975;
        SwapXY = 1;
    } else {
        name = "unknown";
    }
    switch (Orientation) {      // adjust for different aspects
        case 0:   break;        //no change,  calibrated for PORTRAIT
        case 1:   tmp = TS_LEFT, TS_LEFT = TS_BOT, TS_BOT = TS_RT, TS_RT = TS_TOP, TS_TOP = tmp;  break;
        case 2:   SWAP(TS_LEFT, TS_RT);  SWAP(TS_TOP, TS_BOT); break;
        case 3:   tmp = TS_LEFT, TS_LEFT = TS_TOP, TS_TOP = TS_RT, TS_RT = TS_BOT, TS_BOT = tmp;  break;
    }

    Serial.begin(9600);
    ts = TouchScreen(XP, YP, XM, YM, 300);     //call the constructor AGAIN with new values.
    tft.begin(identifier);
    show_Serial();
    tft.setRotation(Orientation);
    tft.fillScreen(BLACK);
    show_tft();

    BOXSIZE = tft.width() / 6;
    tft.fillScreen(BLACK);

    tft.fillRect(0, 0, BOXSIZE, BOXSIZE, RED);
    tft.fillRect(BOXSIZE, 0, BOXSIZE, BOXSIZE, YELLOW);
    tft.fillRect(BOXSIZE * 2, 0, BOXSIZE, BOXSIZE, GREEN);
    tft.fillRect(BOXSIZE * 3, 0, BOXSIZE, BOXSIZE, CYAN);
    tft.fillRect(BOXSIZE * 4, 0, BOXSIZE, BOXSIZE, BLUE);
    tft.fillRect(BOXSIZE * 5, 0, BOXSIZE, BOXSIZE, MAGENTA);

    tft.drawRect(0, 0, BOXSIZE, BOXSIZE, WHITE);
    currentcolor = RED;
    delay(1000);
}

void loop()
{
    uint16_t xpos, ypos;  //screen coordinates
    tp = ts.getPoint();   //tp.x, tp.y are ADC values

    // if sharing pins, you'll need to fix the directions of the touchscreen pins
    pinMode(XM, OUTPUT);
    pinMode(YP, OUTPUT);
    pinMode(XP, OUTPUT);
    pinMode(YM, OUTPUT);
    //    digitalWrite(XM, HIGH);
    //    digitalWrite(YP, HIGH);
    // we have some minimum pressure we consider 'valid'
    // pressure of 0 means no pressing!

    if (tp.z > MINPRESSURE && tp.z < MAXPRESSURE) {
        // is controller wired for Landscape ? or are we oriented in Landscape?
        if (SwapXY != (Orientation & 1)) SWAP(tp.x, tp.y);
        // scale from 0->1023 to tft.width  i.e. left = 0, rt = width
        // most mcufriend have touch (with icons) that extends below the TFT
        // screens without icons need to reserve a space for "erase"
        // scale the ADC values from ts.getPoint() to screen values e.g. 0-239
        xpos = map(tp.x, TS_LEFT, TS_RT, 0, tft.width());
        ypos = map(tp.y, TS_TOP, TS_BOT, 0, tft.height());

        // are we in top color box area ?
        if (ypos < BOXSIZE) {               //draw white border on selected color box
            oldcolor = currentcolor;

            if (xpos < BOXSIZE) {
                currentcolor = RED;
                tft.drawRect(0, 0, BOXSIZE, BOXSIZE, WHITE);
            } else if (xpos < BOXSIZE * 2) {
                currentcolor = YELLOW;
                tft.drawRect(BOXSIZE, 0, BOXSIZE, BOXSIZE, WHITE);
            } else if (xpos < BOXSIZE * 3) {
                currentcolor = GREEN;
                tft.drawRect(BOXSIZE * 2, 0, BOXSIZE, BOXSIZE, WHITE);
            } else if (xpos < BOXSIZE * 4) {
                currentcolor = CYAN;
                tft.drawRect(BOXSIZE * 3, 0, BOXSIZE, BOXSIZE, WHITE);
            } else if (xpos < BOXSIZE * 5) {
                currentcolor = BLUE;
                tft.drawRect(BOXSIZE * 4, 0, BOXSIZE, BOXSIZE, WHITE);
            } else if (xpos < BOXSIZE * 6) {
                currentcolor = MAGENTA;
                tft.drawRect(BOXSIZE * 5, 0, BOXSIZE, BOXSIZE, WHITE);
            }

            if (oldcolor != currentcolor) { //rub out the previous white border
                if (oldcolor == RED) tft.fillRect(0, 0, BOXSIZE, BOXSIZE, RED);
                if (oldcolor == YELLOW) tft.fillRect(BOXSIZE, 0, BOXSIZE, BOXSIZE, YELLOW);
                if (oldcolor == GREEN) tft.fillRect(BOXSIZE * 2, 0, BOXSIZE, BOXSIZE, GREEN);
                if (oldcolor == CYAN) tft.fillRect(BOXSIZE * 3, 0, BOXSIZE, BOXSIZE, CYAN);
                if (oldcolor == BLUE) tft.fillRect(BOXSIZE * 4, 0, BOXSIZE, BOXSIZE, BLUE);
                if (oldcolor == MAGENTA) tft.fillRect(BOXSIZE * 5, 0, BOXSIZE, BOXSIZE, MAGENTA);
            }
        }
        // are we in drawing area ?
        if (((ypos - PENRADIUS) > BOXSIZE) && ((ypos + PENRADIUS) < tft.height())) {
            tft.fillCircle(xpos, ypos, PENRADIUS, currentcolor);
        }
        // are we in erase area ?
        if (ypos > tft.height() - 10) {
            // press the bottom of the screen to erase
            tft.fillRect(0, BOXSIZE, tft.width(), tft.height() - BOXSIZE, BLACK);
        }
    }
}

Вот снова LCD_ID_Reader (равно как и LCD_ID_readreg из пакета "MCUFRIEND_kbv-2.9.3") выдаёт: "ID = 0x0000".

  1. Какой всё же ID (0x6814 или 0x9488) лучше указывать в скетчах (пробовал и тот, и другой - экран, на мой взгляд, работает одинаково)?

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

Цитата:

B_53-7.420w
Offline
Зарегистрирован: 22.09.2017

Цитата:
каков ответ - лог от читалки v5.3 ?

Простите, не понял от какой именно читалки.

B_53-7.420w
Offline
Зарегистрирован: 22.09.2017

Извините, глупость написал (невнимательно посмотрел - не заметил ссылки) :)

Сейчас посмотрю.

slider
Онлайн
Зарегистрирован: 17.06.2014

1.  возможно дело в алгоритме 

170     else if (identifier == 0) {
171         name = "ILI9341 DealExtreme";
172         TS_LEFT = 893; TS_RT = 145; TS_TOP = 930; TS_BOT = 135;
173         SwapXY = 1;
174     else if (identifier == 0 || identifier == 0x9341) {
175         name = "ILI9341";
176         TS_LEFT = 128; TS_RT = 911; TS_TOP = 105; TS_BOT = 908;
177         SwapXY = 1;

выдается значение из последне считанного  регистра D3h , а почему экран запоказывал , так это от инита ILI9341 , он тоже схож.

 в других читалках по другому.

сверить какой именно контроллер сможет показать читалка v5.3 , просто запустить и заглянуть в монитор порта.

2. лучше указывать ili9486 (у ,библиотеки UTFT тож есть его поддержка, но именно с таким шилдом надо использовать пиленную либу под ili9327 и в ней заменить инит на ili9486) 

в KVB и Adafruit ,думаю можно без болезненно использовать инит от ili9488 если нет ILI9486 , включив его принудительно.  Для этого в скетче , вместо  identifier = tft.readID();  написать identifier = 0x9486;  можно еще попробовать   identifier = 0x9488;

 

 

B_53-7.420w
Offline
Зарегистрирован: 22.09.2017

Вот:

slider
Онлайн
Зарегистрирован: 17.06.2014

не скриншот, а весь лог, прочтите внимательней, там написал как приложить.

B_53-7.420w
Offline
Зарегистрирован: 22.09.2017

Хорошо прочту.

Забыл сказать, что читалка v5.3 даёт не только ответ-лог, но и выводит на экран дисплейчика различные изображения. Например, вот такие:

       

 

B_53-7.420w
Offline
Зарегистрирован: 22.09.2017

slider пишет:

2. лучше указывать ili9486 (у ,библиотеки UTFT тож есть его поддержка, но именно с таким шилдом надо использовать пиленную либу под ili9327 и в ней заменить инит на ili9486) 

в KVB и Adafruit ,думаю можно без болезненно использовать инит от ili9488 если нет ILI9486 , включив его принудительно.  Для этого в скетче , вместо  identifier = tft.readID();  написать identifier = 0x9486;  можно еще попробовать   identifier = 0x9488;

Проведя прямую инициализацию получил следующие результаты:

При "identifier = 0x9486":

При "identifier = 0x9488":

При "identifier = 0x6814":

 

К тому же заметил (уже вечером), что при такой инициализации, как на фотографии выше, изображения на экране имеют более насыщенные цвета (возможно, на нижеприведённом фото это не так заметно), да и выводятся они на экран быстрее:

А использовав подобную инициализацию в скетче

,

убедился в том, что и калибровка в этом случае происходит точнее:

  LEFT 912     RT 160     -2.35

  TOP 935     BOT 150   -1.64

Из выше сказанного, на мой взгляд, можно сделать вывод, что при инициализации правильнее использовать 0x6814.

 

B_53-7.420w
Offline
Зарегистрирован: 22.09.2017

B_53-7.420w пишет:

  LEFT 912     RT 160     -2.35

  TOP 935     BOT 150   -1.64

slider, подскажите, пожалуйста, что это за числа такие отрицательные (-2.35 и -1.64) и как их использовать в скетчах.

B_53-7.420w
Offline
Зарегистрирован: 22.09.2017

Наблюдаю следующее явление:

Загружаю в микроконтроллер платы Arduino Uno R3 скетч "GLUE_Demo_480x320". Вижу на экранчике эту картинку

,

а затем и другие. Вынимаю кабель USB из соответствующего разъёма компьютера. Снова вставляю. Вначале вижу белый экран. Затем вот этот мусор:

,

И снова эту картинку:

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

B_53-7.420w
Offline
Зарегистрирован: 22.09.2017

slider пишет:

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

Возможно, вы уже обнаружили, что это не просто читалка, а своего рода гибрид читалки ID и графического редактора. При запуске этого гибрида вначале появляется вот это:

А после клика по экрану примитивный графический редактор:

Приношу свои извинения за последнюю фотографию (Как я только ни фотографировал, но камера мобильника всё же исказила цвета).

slider
Онлайн
Зарегистрирован: 17.06.2014

"цветной мусор" это нормально, хорошо - значит дисплей исправен

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

а что его оказалось "долго" видно - это может быть такой недо инит в библиотеке, и реализация (после инита нужна очистка).

в   ините , команды очистки (если они есть для этого типа контроллера) и включения (0x29) дисплея должны стоять в самом конце. в начале инита должно выключения (0x28).

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

// вот здесь боролись с подобным https://habrahabr.ru/post/278967/

//// в читалке зайдите в Adafruit_TFTLCD.cpp 

найдите

//#define TFTWIDTH   320
//#define TFTHEIGHT  480
 
#define TFTWIDTH   240
#define TFTHEIGHT  320
 
и перезакоментируйте их на
 
#define TFTWIDTH   320
#define TFTHEIGHT  480
 
//#define TFTWIDTH   240
//#define TFTHEIGHT  320

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

B_53-7.420w
Offline
Зарегистрирован: 22.09.2017

slider пишет:

каков ответ - лог от читалки v5.3 ? 

Ответ-лог от читалки v5.3:

 v5.3 read all register + read ID + TFT LCD test
for 8bit TFT LCD UNO shield pinout Adafruit D89234567
on board Arduino UNO & Arduino MEGA
TFT size set is 480x320
include LCD drivers: ILI9325 ILI9328 HX8347G HX8347D* HX8357D ILI9341
v5.3    B0h  <- 0xFFFFFF   <- 0x040404  from  Slider
www.arduino.ru/forum/apparatnye-voprosy/arduino-i-displei-ot-sotikov-mob... 
 
reg  p1 p2 p3 p4 p5 p6 p7 p8  
00 = 0                       * 
01 = 0 
02 = 0 
03 = 0 
04 = 0                       * 
05 = 0 
06 = 0 
07 = 0 
08 = 0 
09 = 0 
0A = 08 08 08 08 08 08 08 08  
0B = 0 
0C = 66 66 66 66 66 66 66 66  
0D = 0 
0E = 0 
0F = 0 
10 = 0 
11 = 0 
12 = 0 
13 = 0 
14 = 0 
15 = 0 
16 = 0 
17 = 0 
18 = 0 
19 = 0 
1A = 0 
1B = 0 
1C = 0 
1D = 0 
1E = 0 
1F = 0 
20 = 0 
21 = 0 
22 = 0 
23 = 0 
24 = 0 
25 = 0 
26 = 0 
27 = 0 
28 = 0 
29 = 0 
2A = 00 00 00 01 3F 00 00 00  
2B = 00 00 00 01 DF 00 00 00  
2C = 0 
2D = 0 
2E = 0 
2F = 0 
30 = 00 00 00 01 DF 00 00 00  
31 = 0 
32 = 0 
33 = 00 00 00 01 E0 00 00 00  
34 = 0 
35 = 0 
36 = 0 
37 = 0 
38 = 0 
39 = 0 
3A = 66 66 66 66 66 66 66 66  
3B = 0 
3C = 0 
3D = 0 
3E = 0 
3F = 0 
40 = 0 
41 = 0 
42 = 0 
43 = 0 
44 = 0 
45 = 0 
46 = 0 
47 = 0 
48 = 0 
49 = 0 
4A = 0 
4B = 0 
4C = 0 
4D = 0 
4E = 0 
4F = 0 
50 = 0 
51 = 0 
52 = 0 
53 = 0 
54 = 0 
55 = 0 
56 = 0 
57 = 0 
58 = 0 
59 = 0 
5A = 0 
5B = 0 
5C = 0 
5D = 0 
5E = 0 
5F = 0 
60 = 0 
61 = 0 
62 = 0 
63 = 0 
64 = 0 
65 = 0 
66 = 0 
67 = 0 
68 = 0 
69 = 0 
6A = 0 
6B = 0 
6C = 0 
6D = 0 
6E = 0 
6F = 0 
70 = 0 
71 = 0 
72 = 0 
73 = 0 
74 = 0 
75 = 0 
76 = 0 
77 = 0 
78 = 0 
79 = 0 
7A = 0 
7B = 0 
7C = 0 
7D = 0 
7E = 0 
7F = 0 
80 = 0 
81 = 0 
82 = 0 
83 = 0 
84 = 0 
85 = 0 
86 = 0 
87 = 0 
88 = 0 
89 = 0 
8A = 0 
8B = 0 
8C = 0 
8D = 0 
8E = 0 
8F = 0 
90 = 0 
91 = 0 
92 = 0 
93 = 0 
94 = 0 
95 = 0 
96 = 0 
97 = 0 
98 = 0 
99 = 0 
9A = 0 
9B = 0 
9C = 0 
9D = 0 
9E = 0 
9F = 0 
A0 = 0 
A1 = 0 
A2 = 0 
A3 = 0 
A4 = 0 
A5 = 0 
A6 = 0 
A7 = 0 
A8 = 0 
A9 = 0 
AA = 94 94 94 94 94 94 94 94  
AB = 0 
AC = 0 
AD = 0 
AE = 0 
AF = 94 94 94 94 94 94 94 94  
B0 = 0 
B1 = 0 
B2 = 0 
B3 = 0 
B4 = 0 
B5 = 02 02 02 0A 04 00 00 00  
B6 = 0 
B7 = 06 06 06 06 06 06 06 06  
B8 = 0 
B9 = 0 
BA = 0 
BB = 0 
BC = 0 
BD = 0 
BE = 0 
BF = FF FF 68 14 00 FF 00 00 ***** 
C0 = 0 
C1 = 0 
C2 = 33 33 33 33 33 33 33 33  
C3 = 33 33 33 33 33 33 33 33  
C4 = 33 33 33 33 33 33 33 33  
C5 = 0 
C6 = 0 
C7 = 0 
C8 = 0 
C9 = 0 
CA = 0 
CB = 0 
CC = 0 
CD = 0 
CE = 0 
CF = 0 
D0 = 0 
D1 = 0 
D2 = 0 
D3 = 0                       * 
D4 = 0 
D5 = 0 
D6 = 0 
D7 = 0 
D8 = 0 
D9 = 0 
DA = 54 54 54 54 54 54 54 54 ***** 
DB = 80 80 80 80 80 80 80 80 ***** 
DC = 66 66 66 66 66 66 66 66 ***** 
DD = 0 
DE = 0 
DF = 0 
E0 = 00 00 54 07 44 05 08 00  
E1 = 0 
E2 = 0 
E3 = 0 
E4 = 0 
E5 = 0 
E6 = 0 
E7 = 0 
E8 = 0 
E9 = 0 
EA = 0 
EB = 0 
EC = 0 
ED = 0 
EE = 0 
EF = 0                       * 
F0 = 0 
F1 = 0 
F2 = 0 
F3 = 0 
F4 = 0 
F5 = 0 
F6 = 0 
F7 = 0 
F8 = 0 
F9 = 0 
FA = 0 
FB = 0 
FC = 0 
FD = 0 
FE = 0 
o------------------------------------o
|                                    | 
00 = 0                       *       | 
04 = 0                       *       | 
B0 = 0                               | 
BF = FF FF 68 14 00 FF 00 00 *****       | 
D3 = 0                       *       | 
DA = 54 54 54 54 54 54 54 54 *****       | 
DB = 80 80 80 80 80 80 80 80 *****       | 
DC = 66 66 66 66 66 66 66 66 *****       | 
EF = 0                       *       | 
|                                    |
o------------------------------------o
 . . . . . . . 
  writing in Manufacturer Command Access Protect  (B0h) <- 0xFFFFFF  
B0 = 8F 8F 8F 8F 8F 8F 8F 8F  
Device Code Read (BFh)  
BF = FF FF 68 14 00 FF 00 00 ***** 
 . . . 
 
reg  p1 p2 p3 p4 p5 p6 p7 p8  
B0 = 8F 8F 8F 8F 8F 8F 8F 8F  
B1 = 0 
B2 = 0 
B3 = 0 
B4 = 0 
B5 = 02 02 02 0A 04 00 00 00  
B6 = 0 
B7 = 06 06 06 06 06 06 06 06  
B8 = 0 
B9 = 0 
BA = 0 
BB = 0 
BC = 0 
BD = 0 
BE = 0 
BF = FF FF 68 14 00 FF 00 00 ***** 
C0 = 0 
C1 = 0 
C2 = 33 33 33 33 33 33 33 33  
C3 = 33 33 33 33 33 33 33 33  
C4 = 33 33 33 33 33 33 33 33  
C5 = 0 
C6 = 0 
C7 = 0 
C8 = 0 
C9 = 0 
CA = 0 
CB = 0 
CC = 0 
CD = 0 
CE = 0 
CF = 0 
D0 = 0 
D1 = 0 
D2 = 0 
D3 = 0                       * 
D4 = 0 
D5 = 0 
D6 = 0 
D7 = 0 
D8 = 0 
D9 = 0 
DA = 54 54 54 54 54 54 54 54 ***** 
DB = 80 80 80 80 80 80 80 80 ***** 
DC = 66 66 66 66 66 66 66 66 ***** 
DD = 0 
DE = 0 
DF = 0 
E0 = 00 00 54 07 44 05 08 00  
E1 = 0 
E2 = 0 
E3 = 0 
E4 = 0 
E5 = 0 
E6 = 0 
E7 = 0 
E8 = 0 
E9 = 0 
EA = 0 
EB = 0 
EC = 0 
ED = 0 
EE = 0 
EF = 0                       * 
F0 = 0 
F1 = 0 
F2 = 0 
F3 = 0 
F4 = 0 
F5 = 0 
F6 = 0 
F7 = 0 
F8 = 0 
F9 = 0 
FA = 0 
FB = 0 
FC = 0 
FD = 0 
FE = 0 
 writing in Manufacturer Command Access Protect  (B0h) <- 0x040404  
B0 = 04 04 04 04 04 04 04 04  
Device Code Read (BFh)  
BF = FF FF 68 14 00 FF 00 00 ***** 
 . . . 
 
reg  p1 p2 p3 p4 p5 p6 p7 p8  
B0 = 04 04 04 04 04 04 04 04  
B1 = 0 
B2 = 0 
B3 = 0 
B4 = 0 
B5 = 02 02 02 0A 04 00 00 00  
B6 = 0 
B7 = 06 06 06 06 06 06 06 06  
B8 = 0 
B9 = 0 
BA = 0 
BB = 0 
BC = 0 
BD = 0 
BE = 0 
BF = FF FF 68 14 00 FF 00 00 ***** 
C0 = 0 
C1 = 0 
C2 = 33 33 33 33 33 33 33 33  
C3 = 33 33 33 33 33 33 33 33  
C4 = 33 33 33 33 33 33 33 33  
C5 = 0 
C6 = 0 
C7 = 0 
C8 = 0 
C9 = 0 
CA = 0 
CB = 0 
CC = 0 
CD = 0 
CE = 0 
CF = 0 
D0 = 0 
D1 = 0 
D2 = 0 
D3 = 0                       * 
D4 = 0 
D5 = 0 
D6 = 0 
D7 = 0 
D8 = 0 
D9 = 0 
DA = 54 54 54 54 54 54 54 54 ***** 
DB = 80 80 80 80 80 80 80 80 ***** 
DC = 66 66 66 66 66 66 66 66 ***** 
DD = 0 
DE = 0 
DF = 0 
E0 = 00 00 54 07 44 05 08 00  
E1 = 0 
E2 = 0 
E3 = 0 
E4 = 0 
E5 = 0 
E6 = 0 
E7 = 0 
E8 = 0 
E9 = 0 
EA = 0 
EB = 0 
EC = 0 
ED = 0 
EE = 0 
EF = 0                       * 
F0 = 0 
F1 = 0 
F2 = 0 
F3 = 0 
F4 = 0 
F5 = 0 
F6 = 0 
F7 = 0 
F8 = 0 
F9 = 0 
FA = 0 
FB = 0 
FC = 0 
FD = 0 
FE = 0 
 
Unknown LCD driver chip: 0
***use minimal init as driver ili9341 ili9488 *** ->
Benchmark                Time (microseconds)
Screen fill              2757908
Text                     350496
Lines                    6916176
Horiz/Vert Lines         278344
Rectangles (outline)     172052
Rectangles (filled)      7668272
Circles (filled)         2427320
Circles (outline)        2944448
Triangles (outline)      1928152
Triangles (filled)       3615860
Rounded rects (outline)  916240
Rounded rects (filled)   8742004
Done!!!  ID reader v5.3

Текст в красной рамке на выше приведённом фото встречается и в некоторых других местах лога (в строках № 201, 282, 301, 368, 387).

B_53-7.420w
Offline
Зарегистрирован: 22.09.2017

slider, ещё раз спасибо за помощь в данном вопросе.

Теперь буду изучать библиотеку "MCUFRIEND_kbv-2.9.3".

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

Tashkey
Offline
Зарегистрирован: 09.09.2018

Прошу прощения за чайниковский вопрос, но впервые включаю Ардуино, с целями по теме ветки. Плата - китайская UNO R3, как на фото в старте ветки. Понадобилось погонять неизвестные LCD на предмет определения контроллера. Вопрос: можно ли эту плату переключить на 3.3В, чтобы состыковать с LCD? Как корифеи подключают? Заранее спасибо.

sadman41
Offline
Зарегистрирован: 19.10.2016

Ответ: переключить эту плату на 3.3V невозможно. Для ее "стыковки" с периферией, имеющей логические сигналы иного уровня, необходимо применить согласователь.

Tashkey
Offline
Зарегистрирован: 09.09.2018

Спасибо за ответ. Да, засада, не ожидал. Вроде и стабилизатор 3.3V есть, казалось бы - просто поставь джамперы переключения питания, как, например, на STM-овских дискавери...

Tashkey
Offline
Зарегистрирован: 09.09.2018

PS. Попробовал таки перевести UNO на 3.3V с возможностью переключения 5 - 3.3. Вроде и получилось просто - одна перерезанная дорожка и две перемычки (если просто на 3.3V). И все работает, скетчи грузятся, UART в терминал долбит, программа отрабатывает, сигналы 3.3V.  Но оказалось, что стабилизатор 3.3В вообще не тянет заявленые 50 мА. Сразу просел до 3V, а при подключении LCD (даже без подсветки) - просел еще до сбоев работы. В общем, можно, конечно, еще прилепить стабилизатор помощнее, типа 1117, но это уже такие городухи, что теряется смысл. 

sadman41
Offline
Зарегистрирован: 19.10.2016

Можете взять Pro Mini рассчитанную на 3.3V, если хотите ATMega328 и дисплей с такими уровнями срастить.

Tashkey
Offline
Зарегистрирован: 09.09.2018

Спасибо, у меня, кажется, где-то даже валялась эта Pro Mini, в запас, как говорится. А насчет стабилизатора в UNO - виноват, прогнал, все он держит, но пришлось увеличить конденсатор на выходе. Сейчас пробую с LCD, пока помолчу, а то опять, не подумав, фигню ляпну. :)

AnderSan
Offline
Зарегистрирован: 26.09.2018

Уважаемые ардуинщики! Подскажите пожалуйста, возможно ли собрать метеостанцию на дисплее 3, 95" TFT LCD и UNO. А то я чувствую взялся за непосильное... Очень слабо знакомы TFT

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

AnderSan пишет:

Уважаемые ардуинщики! Подскажите пожалуйста, возможно ли собрать метеостанцию на дисплее 3, 95" TFT LCD и UNO. А то я чувствую взялся за непосильное... Очень слабо знакомы TFT

 

Возможно. Но FPS на экране будет не ахти.

Tashkey
Offline
Зарегистрирован: 09.09.2018

Возможно или невозможно - прежде всего будет зависеть от интерфейса LCD. Если RGB (а 4 дюйма вполне может быть с RGB) - то врядли. А если MCU - то, думаю, вполне. Если я правильно представляю метеостанцию, то обновлять экран можно нечасто. Т.е. о каком-то FPS речь можно и не вести. :) В общем, нужны конкретные данные дисплея.

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

AnderSan пишет:

Уважаемые ардуинщики! Подскажите пожалуйста, возможно ли собрать метеостанцию на дисплее 3, 95" TFT LCD и UNO. А то я чувствую взялся за непосильное... Очень слабо знакомы TFT

 

Невозможно: ни одна из этих деталей (TFT LCD и UNO) не может служить датчиком ни одного из метеопараметров (температуры, давления, направления и скорости ветра).

AnderSan
Offline
Зарегистрирован: 26.09.2018

Ну не настолько я туп. Датчики тоже есть. Дисплей для вывода информации.

AnderSan
Offline
Зарегистрирован: 26.09.2018

У меня такой же дисплей о котором идёт речь на форуме. 3,95'' TFT LCD для Arduino UNO. Мне чисто тупо надо понять как их подключить и получить картинку. Использование сенсора не планируется, поэтому аналоговые выходы высвобождаются для датчиков. 

Tashkey
Offline
Зарегистрирован: 09.09.2018

AnderSan, не очень понятно, что именно у Вас не получается. Если у Вас такой же дисплей, как обсуждается здесь, то выше достаточно подробно все описано, со ссылками и прочим. Вы это пробовали? Каков результат?

AnderSan
Offline
Зарегистрирован: 26.09.2018

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

Tashkey
Offline
Зарегистрирован: 09.09.2018

AnderSan,  по порядку. :)

1. Подключение. Поскольку, как  я понял, у Вас готовый шилд под UNO, все вопросы подключения уже решены. Просто вставьте.
2. Поскольку, если верить написанному выше, с контроллером и библиотеками все ясно, вопросы инициализации и управления LCD тоже решены, просто используете готовую библиотеку.
3. Первые два пункта - это 80% черновой работы, которая уже решена за Вас. Остается прикладная задача, "разделить на несколько полей" и т.д. Это уже за Вас никто не сделает, Вам нужно разбираться с библиотекой, как залить прямоугольник, как вывести текст и т.д. и реализовать с помощью этого свой интерфейс.
4. Пишу в той последовательности, как у Вас, хотя, как по мне, этот пункт должен быть первым. Какие ноги есть у Ардуино и какие использует шилд видно, если на них посмотреть, там все написано. Это, как правило, 8 бит шины данных и 5 управляющих сигналов. Обычно шилды MCUFRIEND используют:
 

#define LCD_RST A4 //A1
#define LCD_CS A3
#define LCD_RS A2
#define LCD_WR A1
#define LCD_RD A0

#define LCD_D0 8
#define LCD_D1 9
#define LCD_D2 2 //10
#define LCD_D3 3 //11
#define LCD_D4 4
#define LCD_D5 5 //13
#define LCD_D6 6
#define LCD_D7 7
Вот и смотрите, что Вам остается (а остается немного).
 
Короткое резюме. Поскольку у Вас шилд и есть библиотека - 80% уже сделано. Просто берите и рисуйте свою метеостанцию.
andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

AnderSan пишет:

У меня такой же дисплей о котором идёт речь на форуме. 3,95'' TFT LCD для Arduino UNO. Мне чисто тупо надо понять как их подключить и получить картинку. Использование сенсора не планируется, поэтому аналоговые выходы высвобождаются для датчиков. 

Вы уверены, что что-то высвобождается?

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

AnderSan
Offline
Зарегистрирован: 26.09.2018

Поэтому я и обратился на форум. Хотелось собрать метеостанция, что бы была читабильна. Предложенные проекты в инете не устраивают размерами.

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

А форум тут при чем?

Чего Вы от форума то хотите?

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Возникла необходимость (ну так случается иногда) вывести изображение с SD карты. Для этой библиотеки ничего не нашёл готового. Нашёл для UTFT, и немного передрал. Может кому надо #вывод изображения с SD карты на экран с контроллером ili9488 и библиотекой MCUFRIEND_ili9488.

Добавляем в файл MCUFRIEND_kbv.h прототип функции:

void load(int x, int y, int sx, int sy, char *filename); //координаты (x, y, размер (sx, sy, имя файла);

В файл  MCUFRIEND_kbv.cpp включаем библиотеку SdFat-master (которая тоже должна быть)

#include "MCUFRIEND_kbv.h"  // Это не добавляем, а после него
#include <SdFat.h>                    // Включаем это
SdFile dataFile;                          // и это

Ну и собственно саму функцию:

//******************************* вывод изображения из карты памяти в .raw *******************
void MCUFRIEND_kbv::load(int x, int y, int sx, int sy, char *filename) 
{
	uint8_t buf[sx*2];
	uint16_t result;
	if (dataFile.open(filename))
	{
		result=sx;
		 setAddrWindow(x, y, x+sx-1 , y+sy-1);
		 CS_ACTIVE;
		 WriteCmd(_MW);
		for(int n=0;n<sy;n++)
		{
			result=dataFile.read(&buf,sx*2);
				for (int i=0; i<result; i+=2)
				{
				  CD_DATA;
				 write8(buf[i]);	
				 write8(buf[i+1]);				 
				}
		}
	}
	dataFile.close();
	CS_IDLE;
}
//*******************************************************************************************

Вызов функции будет выглядить так:

tft.load(70, 0, 345, 273, "OPEL.raw");

А результат примерно так:

В скетч само собой добавим:

#include "SdFat.h"
SdFat SD;
#define SD_CS_PIN SS
File myFile;

Ну и так далее.

Конвертировать в ".raw" рекомендую программкой ImageConverter565.exe, которая имеется в папке Tools библиотеки UTFT. Ссылок не даю, извините, всё легко найти.

Исходные фото рекомендую открывать в формате .bmp т.к. на выходе более качественный .raw.

Недостаток в том, что функция для вывода объявляет(хоть и локально) массив размером в два раза больше ширины картинки, а это накладывает ограничение на размер изображения по ширине. ( В моём примере это, пожалуй, предел, дальше просто на атм32 заканчивается оперативка). Было желание избавится от буфера, но пока нет времени, да и большой надобности.

Удачи.

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

hugoboss317 пишет:

Недостаток в том, что функция для вывода объявляет(хоть и локально) массив размером в два раза больше ширины картинки, а это накладывает ограничение на размер изображения по ширине. ( В моём примере это, пожалуй, предел, дальше просто на атм32 заканчивается оперативка). Было желание избавится от буфера, но пока нет времени, да и большой надобности.

Недостаток вызван исключительно тем, что в функции используется буфер, который, по сути, не нужен. Никто не мешает читать хоть побайтно прямо во внутреннем цикле вывода на экран. Естественно, при побайтном чтении скорость работы будет пониже. Но тут уж либо-либо: либо оптимизация по скорости либо по памяти.

		for(int n=0;n<sy;n++)
		{
				for (int i=0; i<sx; i++)
				{
				  CD_DATA;
				 write8(dataFile.read());	
				 write8(dataFile.read());				 
				}
		}

 

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Да, согласен, поэтому и не стал от него избавляться.

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

Ну тогда разумно выбирать размер буфера, исходя из возможностей Ардуины, а не из параметров картинки.

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Буфер сжирает память вплоть до отказа работы. Избавиться от него не получается. Даже уменьшить вдвоее размер до ширины изображения не получается. Так то изначальны вариант единственный рабочий (условно).

Это для справки.

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

hugoboss317 пишет:

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

А, собвственно, почему?

Цитата:

Даже уменьшить вдвоее размер до ширины изображения не получается. Так то изначальны вариант единственный рабочий (условно).

Это для справки.

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

И размер буфера не критичен. От слова "совсем". С точки зрения функционирования. Но, естественно, влияет на скорость. И именно поэтому вполне возможно, что окажется целесообразным делать буфер не зависящим от ширины изображения, подобрав его размер из условия баланса расходуемой памяти и скорости работы.

hugoboss317
Offline
Зарегистрирован: 21.03.2013

andriano пишет:

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

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

andriano пишет:

И размер буфера не критичен. От слова "совсем". С точки зрения функционирования. Но, естественно, влияет на скорость. И именно поэтому вполне возможно, что окажется целесообразным делать буфер не зависящим от ширины изображения, подобрав его размер из условия баланса расходуемой памяти и скорости работы.

Дело, видимо, в самой функции инициализвции буфера. Я её еле нашёл. Реализацию имею ввиду. 

Вобщем если в крации, по половнике выводить изображение, его перекашивает, а если по пикселям, вобще ....

Короче, как уже сказал, нет времени да и необходимости.  Может как то потом займусть. А это значит если не припрёт, то никогда.

slider
Онлайн
Зарегистрирован: 17.06.2014

э.... зачем буфер ?  или речь о совсем маленьких картинках?

чем это не годится:

передача уже подготовленного формата байтов для диспа записанного на microsd: 

байт с SPI microSD -> байт в дисплей  ,  без забивания всей оперативки буфером и трата тактов процессора, не Jpeg же раскодировать.

современные носители инф. имеют очень быстрый SPI , чем бы их не использовать ?  хотя для относительно медленной это не принципиально.

 

 

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Да это на каждом углу написано. А толку? Все говорят что вывести легко и никто толком не пишет как именно.

Я привел реализацию конкретно для этой библиотеки. С небольшой инструкцией ИМХО. Может кому поможет.

Есть конкретный примеры!? Всюда. Нет? Теорию мы знаем.

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

Знали бы теорию, не было бы проблем с практикой. А раз проблемы есть, значит, теорию не усвоили.

Кстати, код был в сообщении №37.

hugoboss317
Offline
Зарегистрирован: 21.03.2013

andriano пишет:

Кстати, код был в сообщении №37.

Жаль не оставил скрин от кода из сообщения №37.

Железо заряжено. На слово верьте - не работает.

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

А что пишет то? Почему не работает?

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Так с буфером:

Так, по предложенному алгоритму:

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Вот ещё вариант вместо:


	 write8(dataFile.read());	
	 write8(dataFile.read());				 

читаем так:

write16(dataFile.read());

Интересно. Чёреый цвет нормально читает, а остальные искажает сильно.

Прям "цвет настроения СИНИЙ"

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

Ну то есть dataFile.read(), оказывается, возвращает не 8-, а 16-разрядное число.

А по поводу цвета: для отладки выбран очень неудачный рисунок. Гораздо лучше было начать с цветных полос и клиньев.

И, кстати, какова вообще используемая глубина цвета?