цифровая электроника
вычислительная техника
встраиваемые системы

 

Фоторамка своими руками на основе Arduino и TFT-дисплея ST7735

Автор: Mike(admin) от 16-04-2019, 07:55

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


TFT-дисплей ST7735

В сегодняшнем примере мы создадим собственное произведение искусства – цифровую фоторамку. Фоторамки используются для демонстрации картин или фотографий и сделаны из дерева, металла и нескольких синтетических материалов. Они были созданы для размещения только одного изображения или графического объекта, но с цифровыми фоторамками вы можете хранить более одного изображения в фоторамке, переключаясь между ними с желаемыми интервалами.


Цифровые фоторамки обычно состоят из четырех основных компонентов; дисплей или экран, запоминающее устройство, микроконтроллер или микропроцессор и источник питания. В сегодняшнем уроке мы будем использовать цветной TFT-дисплей с диагональю 1,8 дюймов под названием ST7735 в качестве нашего дисплея, а Arduino nano – в качестве микроконтроллера. TFT-дисплей представляет собой 1,8-дюймовый дисплей с разрешением 128 × 160 пикселей и может отображать широкий спектр цветов (полный 18-битный цвет, 262 144 оттенка!). Дисплей использует протокол SPI для связи и имеет собственный пиксельно-адресуемый буфер кадров, что означает, что он может использоваться со всеми видами микроконтроллеров, и вам нужно только 4 вывода ввода-вывода. Модуль дисплея также поставляется с разъемом для карты SD, которое мы будем использовать в качестве устройства хранения в рамках этого проекта.


1,8-дюймовый TFT-дисплей ST7735 состоит из двух комплектов выводов. Первый в верхней части состоит из 4 контактов и используется для подключения слота для SD-карты в задней части дисплея.


TFT-дисплей ST7735

Второй набор выводов под экраном представляет контакты для управления самим дисплеем. Однако слот для SD-карты и дисплей используют протокол SPI для связи с микроконтроллером, поэтому они будут подключены к одним и тем же контактам на Arduino nano. Единственным отличием будет вывод CS/SS, так как каждый из них будет подключен к другому выводу.


Схема подключения Arduino и дисплея ST7735 следующая:


Фоторамка своими руками на основе Arduino и TFT-дисплея ST7735

Для этой схемы мы использовали Fritzing-модель 1,8-дюймового TFT-дисплея ST7735, здесь расположение выводов немного отличается от нашего дисплея. У этой модели контакты слота для SD-карты и дисплея объединены. Чтобы облегчить подключение, вот распиновка:



Arduino – Слот-SD-карты
D11 - MOSI/SI
D12 - MISO/SO
D13 - SCK
D4 - CS/SS
GND -GND
5V – VIN

Соединения для стороны дисплея TFT почти такие же.



Arduino - 1.8" TFT
D11 - MOSI
D12 - MISO/SO
D13 - SCK 
D10 - CS/SS 
D8 - RST
D9 - DC
GND -GND
5V – VIN

Изображения, которые будут отображаться на TFT, должны быть в растровом формате, поэтому перед копированием изображений на SD-карту нам необходимо преобразовать их в распознаваемую растровую форму. Для этого мы использовали бесплатное программное обеспечение Paint.net (для Windows), но вы можете использовать любое другое программное обеспечение для редактирования изображений. Загрузите изображения в программное обеспечение по одному и используйте инструмент изменения размера, чтобы уменьшить его разрешение и размер (160 × 128 пикселей).


Фоторамка своими руками на основе Arduino и TFT-дисплея ST7735

После этого сохраните изображение на SD-карту с расширением bmp.


Код для этого проекта является слегка измененной версией готового примера SPI TFT, поставляемого с библиотекой ST7735 от Adafruit. Таким образом, код для этого руководства сильно зависит от библиотек Adafruit ST7735 и GFX. В основе кода мы просто вызываем функцию bmpDraw для каждого из изображений, которые мы хотим отобразить, устанавливая подходящее время задержки между каждым из изображений. Функция bmpDraw позволяет очень легко отображать изображения на TFT. Все, что нам нужно сделать, это указать имя файла .bmp, начальные координаты, и она будет использовать эту информацию для извлечения изображения с SD-карты и отображения на экране. Вот полный код проекта показан.



#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>
#include <SPI.h>
#include <SD.h>
#define TFT_CS  10
#define TFT_RST  8
#define TFT_DC   9
#define SD_CS    4
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
void setup(void) {
  Serial.begin(9600);
  tft.initR(INITR_BLACKTAB);
  Serial.print("Initializing SD card...");
  if (!SD.begin(SD_CS)) {
    Serial.println("failed!");
    return;
  }
  Serial.println("OK!");
  tft.setRotation(1);
}
void loop() {
  bmpDraw("logo.bmp", 0, 0);
  delay(3000);
  bmpDraw("mezapos.bmp",0,0);
  delay(3000);
  bmpDraw("sparti.bmp",0,0);
  delay(3000);
  bmpDraw("mani.bmp",0,0);
  delay(3000);
  bmpDraw("lisbon.bmp",0,0);
  delay(3000);
}
#define BUFFPIXEL 20
void bmpDraw(char *filename, uint8_t x, uint8_t y) {
  File     bmpFile;
  int      bmpWidth, bmpHeight;
  uint8_t  bmpDepth
  uint32_t bmpImageoffset;
  uint32_t rowSize;
  uint8_t  sdbuffer[3*BUFFPIXEL];
  uint8_t  buffidx = sizeof(sdbuffer);
  boolean  goodBmp = false;
  boolean  flip    = true;
  int      w, h, row, col;
  uint8_t  r, g, b;
  uint32_t pos = 0, startTime = millis();
  if((x >= tft.width()) || (y >= tft.height())) return;
  Serial.println();
  Serial.print("Loading image '");
  Serial.print(filename);
  Serial.println('\'');
  if ((bmpFile = SD.open(filename)) == NULL) {
    Serial.print("File not found");
    return;
  }
  if(read16(bmpFile) == 0x4D42) {
    Serial.print("File size: "); Serial.println(read32(bmpFile));
    (void)read32(bmpFile);
    bmpImageoffset = read32(bmpFile);
    Serial.print("Image Offset: "); Serial.println(bmpImageoffset, DEC);
    Serial.print("Header size: "); Serial.println(read32(bmpFile));
    bmpWidth  = read32(bmpFile);
    bmpHeight = read32(bmpFile);
    if(read16(bmpFile) == 1) {
      bmpDepth = read16(bmpFile);
      Serial.print("Bit Depth: "); Serial.println(bmpDepth);
      if((bmpDepth == 24) && (read32(bmpFile) == 0)) {
        goodBmp = true;
        Serial.print("Image size: ");
        Serial.print(bmpWidth);
        Serial.print('x');
        Serial.println(bmpHeight);
        // BMP rows are padded (if needed) to 4-byte boundary
        rowSize = (bmpWidth * 3 + 3) & ~3;
        // If bmpHeight is negative, image is in top-down order.
        // This is not canon but has been observed in the wild.
        if(bmpHeight < 0) {
          bmpHeight = -bmpHeight;
          flip      = false;
        }
        w = bmpWidth;
        h = bmpHeight;
        if((x+w-1) >= tft.width())  w = tft.width()  - x;
        if((y+h-1) >= tft.height()) h = tft.height() - y;
        tft.setAddrWindow(x, y, x+w-1, y+h-1);
        for (row=0; row<h; row++) {
          if(flip) // Bitmap is stored bottom-to-top order (normal BMP)
            pos = bmpImageoffset + (bmpHeight - 1 - row) * rowSize;
          else     // Bitmap is stored top-to-bottom
            pos = bmpImageoffset + row * rowSize;
          if(bmpFile.position() != pos) {
            bmpFile.seek(pos);
            buffidx = sizeof(sdbuffer);
          }
          for (col=0; col<w; col++) {
            if (buffidx >= sizeof(sdbuffer)) {
              bmpFile.read(sdbuffer, sizeof(sdbuffer));
              buffidx = 0;
            }
            b = sdbuffer[buffidx++];
            g = sdbuffer[buffidx++];
            r = sdbuffer[buffidx++];
            tft.pushColor(tft.Color565(r,g,b));
          }
        }
        Serial.print("Loaded in ");
        Serial.print(millis() - startTime);
        Serial.println(" ms");
      }
    }
  }
  bmpFile.close();
  if(!goodBmp) Serial.println("BMP format not recognized.");
}
uint16_t read16(File f) {
  uint16_t result;
  ((uint8_t *)&result)[0] = f.read();
  ((uint8_t *)&result)[1] = f.read();
  return result;
}
uint32_t read32(File f) {
  uint32_t result;
  ((uint8_t *)&result)[0] = f.read();
  ((uint8_t *)&result)[1] = f.read();
  ((uint8_t *)&result)[2] = f.read();
  ((uint8_t *)&result)[3] = f.read();
  return result;
}

Убедитесь, что ваши схемные соединения верны, затем загрузите код в Arduino. Через некоторое время вы должны увидеть изображения, отображаемые как слайд-шоу на TFT-дисплее.


Фоторамка своими руками на основе Arduino и TFT-дисплея ST7735

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




© digitrode.ru


Теги: Arduino, дисплеи



   Благодарим Вас за интерес к информационному проекту digitrode.ru.
   Если Вы хотите, чтобы интересные и полезные материалы выходили чаще, и было меньше рекламы,
   Вы можее поддержать наш проект, пожертвовав любую сумму на его развитие.


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

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

Оставить комментарий