Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Отображение изображений BMP с SD-карты на ЖК-экране TFT

Компоненты и расходные материалы

Arduino UNO
× 1

Об этом проекте

Здравствуйте, это руководство является продолжением двух других, посвященных 2.4-дюймовому TFT LCD Shield с Arduino UNO, поэтому первое было посвящено взаимодействию и устранению проблемы с сенсорной функцией, а также перевернутой оси, затем второе было об использовании простой функции рисовать разные формы и как создать сенсорную кнопку для активации некоторых функций…

Сопряжение и устранение проблем с сенсорным экраном в Arduino TFT 2.4 ″ LCD Shield

Руководство по использованию сенсорного экрана TFT LCD 2,4 ″

Но сегодня мы поговорим о чтении изображений с SD-карты и отображении их на экране. Сначала не забудьте подключить SD-карту к компьютеру и отформатировать ее как FAT32, а затем перенести изображения, не забывайте, что они должны быть. Формат «BMP», растровые изображения 24 !! Чтобы изображение было правильным, разрешение должно быть 240 * 320, небольшое пояснение:

Это нормальная ориентация экрана, вы можете показывать изображения размером 240 * 320, это вращение по умолчанию, которое установлено на setRotation (0);

Это ориентация экрана, если вы установите Rotation (1); и теперь вы можете показывать изображения размером 320 * 240.

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

Так называются мои 24-битные изображения bmp на SD-карте. Например, «Img1» мы называем его в коде с помощью «Img1.bmp».

Библиотека:

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

Коды:

Вот коды, которые я использовал в видео в формате in.ino, не забудьте изменить названия файлов, которые вы используете. Не забудьте проверить руководство, если вам понадобится помощь.

  • Код 1
  • Код 2

Код

  • TFT_Shield_SD_1.ino
  • TFT_Shield_SD_2.ino
TFT_Shield_SD_1.ino Arduino
 / * Этот код предназначен для использования с сенсорным экраном TFT LCD с диагональю 2,4 дюйма, он считывает изображения в формате BMP, хранящиеся на SD-карте *, и показывает их на экране * Для получения дополнительных сведений см. SurtrTech.com * / # include  // Базовая графическая библиотека # include  // Аппаратно-зависимая библиотека # include  #include  #define LCD_CS A3 // Выбор микросхемы переходит в Analog 3 # define LCD_CD A2 // Команда / данные переходят в аналоговый 2 # define LCD_WR A1 // ЖК-запись переходит в аналоговый 1 # define LCD_RD A0 // ЖК-чтение переходит в аналоговый 0 # define SD_CS 10 // вывод SD-карты на вашем щите Adafruit_TFTLCD tft (LCD_CS, LCD_CD , LCD_WR, LCD_RD, A4); void setup () {Serial.begin (9600); tft.reset (); uint16_t identifier =tft.readID (); pinMode (10, OUTPUT); digitalWrite (10, HIGH); tft .begin (идентификатор); if (! SD.begin (SD_CS)) {progmemPrintln (PSTR ("не удалось!")); return;}} void loop () {bmpDraw ("Logo.bmp", 0, 0); // Вызов функции bmpDraw ("Name_of_your_image.bmp", x, y) (x, y) - начальная позиция отрисовки изображенияi ng delay (2000); bmpDraw ("Img2.bmp", 0, 0); задержка (2000); bmpDraw ("Img3.bmp", 0, 0); delay (2000);} # define BUFFPIXEL 20 // Скорость рисования, 20 должна быть лучшей, но вы можете использовать 60, хотя для этого потребуется много оперативной памяти uno // Функция рисования, считывает файл с SD-карты и выполняет // преобразование и отрисовка, а также показывает сообщения на последовательном мониторе в случае возникновения проблемы // Не трогайте эту функцию:Dvoid bmpDraw (char * filename, int x, int y) {File bmpFile; int bmpWidth, bmpHeight; // W + H в пикселях uint8_t bmpDepth; // Битовая глубина (в настоящее время должна быть 24) uint32_t bmpImageoffset; // Начало данных изображения в файле uint32_t rowSize; // Не всегда =bmpWidth; может иметь заполнение uint8_t sdbuffer [3 * BUFFPIXEL]; // пиксель в буфере (R + G + B на пиксель) uint16_t lcdbuffer [BUFFPIXEL]; // буфер вывода пикселей (16 бит на пиксель) uint8_t buffidx =sizeof (sdbuffer); // Текущая позиция в sdbuffer boolean goodBmp =false; // Устанавливается в true при правильном синтаксическом анализе заголовка boolean flip =true; // BMP сохраняется снизу вверх int w, h, row, col; uint8_t r, g, b; uint32_t pos =0, startTime =millis (); uint8_t lcdidx =0; логическое значение first =true; if ((x> =tft.width ()) || (y> =tft.height ())) return; Serial.println (); progmemPrint (PSTR ("Загрузка изображения '")); Serial.print (имя файла); Serial.println ('\' '); // Открыть запрошенный файл на SD-карте if ((bmpFile =SD.open (filename)) ==NULL) {progmemPrintln (PSTR ("Файл не найден")); возвращение; } // Анализировать заголовок BMP if (read16 (bmpFile) ==0x4D42) {// Подпись BMP progmemPrint (PSTR ("Размер файла:")); Serial.println (read32 (bmpFile)); (недействительно) read32 (bmpFile); // Чтение и игнорирование байтов создателя bmpImageoffset =read32 (bmpFile); // Начало данных изображения progmemPrint (PSTR ("Image Offset:")); Serial.println (bmpImageoffset, DEC); // Чтение заголовка DIB progmemPrint (PSTR ("Размер заголовка:")); Serial.println (read32 (bmpFile)); bmpWidth =read32 (bmpFile); bmpHeight =read32 (bmpFile); if (read16 (bmpFile) ==1) {// # плоскости - должно быть '1' bmpDepth =read16 (bmpFile); // бит на пиксель progmemPrint (PSTR ("Битовая глубина:")); Serial.println (bmpDepth); if ((bmpDepth ==24) &&(read32 (bmpFile) ==0)) {// 0 =несжатый goodBmp =true; // Поддерживаемый формат BMP - продолжаем! progmemPrint (PSTR ("Размер изображения:")); Serial.print (bmpWidth); Serial.print ('х'); Serial.println (bmpHeight); // Строки BMP дополняются (при необходимости) до 4-байтовой границы rowSize =(bmpWidth * 3 + 3) &~ 3; // Если bmpHeight отрицательное, изображение идет сверху вниз. // Это не канон, но наблюдалось в дикой природе. если (bmpHeight <0) {bmpHeight =-bmpHeight; flip =false; } // Обрезка загружаемой области w =bmpWidth; h =bmpHeight; if ((x + w-1)> =tft.width ()) w =tft.width () - x; если ((y + h-1)> =tft.height ()) h =tft.height () - y; // Устанавливаем адресное окно TFT на обрезанные границы изображения tft.setAddrWindow (x, y, x + w-1, y + h-1); for (row =0; row  =sizeof (sdbuffer)) {// Действительно // Сначала вставляем ЖК-буфер на дисплей if (lcdidx> 0) {tft.pushColors (lcdbuffer, lcdidx, first); lcdidx =0; первый =ложь; } bmpFile.read (sdbuffer, sizeof (sdbuffer)); buffidx =0; // Установить индекс в начало} // Преобразовать пиксель из формата BMP в формат TFT b =sdbuffer [buffidx ++]; г =SDBuffer [buffidx ++]; г =SDBuffer [buffidx ++]; lcdbuffer [lcdidx ++] =tft.color565 (r, g, b); } // конец пикселя} // конец строки развертки // Записываем все оставшиеся данные на ЖК-дисплей if (lcdidx> 0) {tft.pushColors (lcdbuffer, lcdidx, first); } progmemPrint (PSTR ("Загружен в")); Serial.print (миллис () - время начала); Serial.println ("мс"); } // конец goodBmp}} bmpFile.close (); if (! goodBmp) progmemPrintln (PSTR ("Формат BMP не распознан."));} // Эти 16- и 32-битные типы читают из файла SD-карты. // Данные BMP хранятся с прямым порядком байтов, Arduino мало -endian тоже .// Может потребоваться обратный порядок индексов при переносе в другое место. uint16_t read16 (Файл f) {uint16_t result; ((uint8_t *) &результат) [0] =f.read (); // LSB ((uint8_t *) &result) [1] =f.read (); // MSB возвращает результат;} uint32_t read32 (File f) {uint32_t result; ((uint8_t *) &результат) [0] =f.read (); // LSB ((uint8_t *) &result) [1] =f.read (); ((uint8_t *) &результат) [2] =f.read (); ((uint8_t *) &результат) [3] =f.read (); // MSB return result;} // Копирование строки из флэш-памяти в последовательный порт // Исходная строка ДОЛЖНА быть внутри объявления PSTR ()! Void progmemPrint (const char * str) {char c; while (c =pgm_read_byte (str ++)) Serial.print (c);} // То же, что и выше, с завершающей новой строкойvoid progmemPrintln (const char * str) {progmemPrint (str); Serial.println ();} 
TFT_Shield_SD_2.ino Arduino
 / * Этот код предназначен для экрана сенсорного экрана TFT LCD с диагональю 2,4 дюйма с платой UNO * Он создает небольшое слайд-шоу изображений, которое меняется в зависимости от того, где вы нажали на экране * Изображения считываются с SD-карты * См. на SurtrTech.com для получения более подробной информации * / # include  // Базовая графическая библиотека # include  // Аппаратно-зависимая библиотека # include  #include  #include  // Библиотека функций сенсорного экрана # если определено (__ SAM3X8E__) #undef __FlashStringHelper ::F (string_literal) #define F (string_literal) string_literal # endif // Параметры ниже зависят от вашего щита, поэтому убедитесь, что контакты правильно # определить YP A3 // должен быть аналоговым выводом, использовать обозначение! #define XM A2 // должно быть аналоговым выводом, использовать обозначение! #define YM 9 // может быть цифровым выводом # определить XP 8 // может быть цифровым контактом // Не забывайте, если ваша сенсорная функция не работает, проверьте значения выше, это может быть (A1 A2 7 6) или // Откалибруйте значения, которые вы можете w ant, чтобы сначала запустить код калибровки и установить эти точки # определить TS_MINX 176 # определить TS_MINY 159 # определить TS_MAXX 921 # определить TS_MAXY 884 # определить MINPRESSURE 10 # определить MAXPRESSURE 1000TouchScreen ts =TouchScreen (XP, YP, XM, YM, 300); #define LCD_CS A3 // Выбор микросхемы переходит к аналоговому 3 # define LCD_CD A2 // Команда / данные переходят к аналоговому 2 # define LCD_WR A1 // Запись ЖК-дисплея переходит к аналоговому 1 # define LCD_RD A0 // Считывание ЖК-дисплея переходит к аналоговому 0 # define SD_CS 10 // Установите строку выбора микросхемы на то, что вы используете Adafruit_TFTLCD tft (LCD_CS, LCD_CD, LCD_WR, LCD_RD, A4); char x [] ="x1.bmp"; / * Здесь в этом коде я объявил имена как Массив * Чтобы я мог вносить изменения, если хочу прокрутить * Убедитесь, что у ваших изображений есть номер типа «1», чтобы вы могли его увеличить или уменьшить *, чтобы перейти к следующему изображению * / void setup () {Serial.begin ( 9600); tft.reset (); идентификатор uint16_t =tft.readID (); pinMode (10, ВЫХОД); digitalWrite (10, ВЫСОКИЙ); tft.begin (идентификатор); если (! SD.begin (SD_CS)) {progmemPrintln (PSTR ("не удалось!")); возвращение; } tft.setRotation (1); // Повернуть экран на 90 bmpDraw (x, 0, 0); // мы рисуем первое изображение, которое является x -> "x1.bmp", как мы объявили} void loop () {if (x [1] <49) // Чтобы мы не переходили к некоторым странным значениям, которые я добавляю здесь сброс значений x [1] =49; // Если мы уже на первом изображении, мы остаемся там, то же самое для lastif (x [1]> 52) // «1» в char - это «49», а «4» - это «52» Я написал их в этот формат, чтобы я мог манипулировать ими x [1] =52; TSPoint p =ts.getPoint (); // проверка касания экрана пользователем pinMode (XM, OUTPUT); pinMode (YP, ВЫХОД); if (pz> MINPRESSURE &&pz  0 &&py <100) {Serial.println ("Влево"); // Я сделал это, чтобы показать на последовательном мониторе, что я нажал влево x [1] =x [1] -1; // здесь мы меняем имя файла, который хотим прочитать x [] ="x1.bmp" и x [1] - это 1 в имени, а x [0] - это x bmpDraw (x, 0, 0); // Итак, что я делаю, просто увеличиваю его, чтобы сделать его 2 или уменьшать, чтобы сделать его 0 (обратитесь к первому «если», чтобы увидеть решение для этого случая, поскольку 0 не существует) delay (300); // Затем я рисую изображение, которое теперь имеет другое имя в зависимости от того, на какой стороне я нажал} // Добавляем небольшую задержку, чтобы обнаружение касания не отскакивало иначе if (py> 200 &&py <320) {Serial.println ("Right "); х [1] =х [1] +1; bmpDraw (х, 0, 0); задержка (300); }}} #define BUFFPIXEL 20 // Скорость печати 20 должна быть наилучшей, вы можете перейти на 60, но используя слишком много ОЗУ // функция рисования не трогает:Dvoid bmpDraw (char * filename, int x, int y) { Файл bmpFile; int bmpWidth, bmpHeight; // W + H в пикселях uint8_t bmpDepth; // Битовая глубина (в настоящее время должна быть 24) uint32_t bmpImageoffset; // Начало данных изображения в файле uint32_t rowSize; // Не всегда =bmpWidth; может иметь заполнение uint8_t sdbuffer [3 * BUFFPIXEL]; // пиксель в буфере (R + G + B на пиксель) uint16_t lcdbuffer [BUFFPIXEL]; // буфер вывода пикселей (16 бит на пиксель) uint8_t buffidx =sizeof (sdbuffer); // Текущая позиция в sdbuffer boolean goodBmp =false; // Устанавливается в true при правильном синтаксическом анализе заголовка boolean flip =true; // BMP сохраняется снизу вверх int w, h, row, col; uint8_t r, g, b; uint32_t pos =0, startTime =millis (); uint8_t lcdidx =0; логическое значение first =true; if ((x> =tft.width ()) || (y> =tft.height ())) return; Serial.println (); progmemPrint (PSTR ("Загрузка изображения '")); Serial.print (имя файла); Serial.println ('\' '); // Открыть запрошенный файл на SD-карте if ((bmpFile =SD.open (filename)) ==NULL) {progmemPrintln (PSTR ("Файл не найден")); возвращение; } // Анализировать заголовок BMP if (read16 (bmpFile) ==0x4D42) {// Подпись BMP progmemPrint (PSTR ("Размер файла:")); Serial.println (read32 (bmpFile)); (недействительно) read32 (bmpFile); // Чтение и игнорирование байтов создателя bmpImageoffset =read32 (bmpFile); // Начало данных изображения progmemPrint (PSTR ("Image Offset:")); Serial.println (bmpImageoffset, DEC); // Чтение заголовка DIB progmemPrint (PSTR ("Размер заголовка:")); Serial.println (read32 (bmpFile)); bmpWidth =read32 (bmpFile); bmpHeight =read32 (bmpFile); if (read16 (bmpFile) ==1) {// # плоскости - должно быть '1' bmpDepth =read16 (bmpFile); // бит на пиксель progmemPrint (PSTR ("Битовая глубина:")); Serial.println (bmpDepth); if ((bmpDepth ==24) &&(read32 (bmpFile) ==0)) {// 0 =несжатый goodBmp =true; // Поддерживаемый формат BMP - продолжаем! progmemPrint (PSTR ("Размер изображения:")); Serial.print (bmpWidth); Serial.print ('х'); Serial.println (bmpHeight); // Строки BMP дополняются (при необходимости) до 4-байтовой границы rowSize =(bmpWidth * 3 + 3) &~ 3; // Если bmpHeight отрицательное, изображение идет сверху вниз. // Это не канон, но наблюдалось в дикой природе. если (bmpHeight <0) {bmpHeight =-bmpHeight; flip =false; } // Обрезка загружаемой области w =bmpWidth; h =bmpHeight; if ((x + w-1)> =tft.width ()) w =tft.width () - x; если ((y + h-1)> =tft.height ()) h =tft.height () - y; // Устанавливаем адресное окно TFT на обрезанные границы изображения tft.setAddrWindow (x, y, x + w-1, y + h-1); for (row =0; row  =sizeof (sdbuffer)) {// Действительно // Сначала вставляем ЖК-буфер на дисплей if (lcdidx> 0) {tft.pushColors (lcdbuffer, lcdidx, first); lcdidx =0; первый =ложь; } bmpFile.read (sdbuffer, sizeof (sdbuffer)); buffidx =0; // Установить индекс в начало} // Преобразовать пиксель из формата BMP в формат TFT b =sdbuffer [buffidx ++]; г =SDBuffer [buffidx ++]; г =SDBuffer [buffidx ++]; lcdbuffer [lcdidx ++] =tft.color565 (r, g, b); } // конец пикселя} // конец строки развертки // Записываем все оставшиеся данные на ЖК-дисплей if (lcdidx> 0) {tft.pushColors (lcdbuffer, lcdidx, first); } progmemPrint (PSTR ("Загружен в")); Serial.print (миллис () - время начала); Serial.println ("мс"); } // конец goodBmp}} bmpFile.close (); if (! goodBmp) progmemPrintln (PSTR ("Формат BMP не распознан."));} // Эти 16- и 32-битные типы читают из файла SD-карты. // Данные BMP хранятся с прямым порядком байтов, Arduino мало -endian тоже .// Может потребоваться обратный порядок индексов при переносе в другое место. uint16_t read16 (Файл f) {uint16_t result; ((uint8_t *) &результат) [0] =f.read (); // LSB ((uint8_t *) &result) [1] =f.read (); // MSB возвращает результат;} uint32_t read32 (File f) {uint32_t result; ((uint8_t *) &результат) [0] =f.read (); // LSB ((uint8_t *) &result) [1] =f.read (); ((uint8_t *) &результат) [2] =f.read (); ((uint8_t *) &результат) [3] =f.read (); // MSB return result;} // Копирование строки из флэш-памяти в последовательный порт // Исходная строка ДОЛЖНА быть внутри объявления PSTR ()! Void progmemPrint (const char * str) {char c; while (c =pgm_read_byte (str ++)) Serial.print (c);} // То же, что и выше, с завершающей новой строкойvoid progmemPrintln (const char * str) {progmemPrint (str); Serial.println ();} 

Схема

Это щит:D

Производственный процесс

  1. Поздравительная открытка
  2. Кредитная карта
  3. Жидкокристаллический дисплей (ЖКД)
  4. МОДУЛЬ ДАННЫХ:23,1-дюймовый ультра-растянутый TFT-дисплей с интеллектуальным управлением
  5. Distec:прочный 7-дюймовый TFT-дисплей с возможностью чтения при солнечном свете от Ortustech
  6. Acceed:GPU-PC увеличивает производительность от видеокарты
  7. Экспонат:первичный дисплей
  8. Kuman TFT 3.5 RetroPie 2018
  9. ИИ генерирует изображения готовой еды из простого текстового рецепта
  10. Уклоняйся от защиты!