А чего это мы не делаем фоторамки?

Logik
Offline
Зарегистрирован: 05.08.2014

Очень даже оживляет экранчик.

 

#include <SD.h>
#include "TFTLCD.h"

// Color definitions
#define BLACK           0x0000
#define BLUE            0x001F
#define RED             0xF800
#define GREEN           0x07E0
#define CYAN            0x07FF
#define MAGENTA         0xF81F
#define YELLOW          0xFFE0 
#define WHITE           0xFFFF

TFTLCD tft;  //#ifdef MyNano 

File root;


struct BITMAPFILEHEADER
{
 word bfType;
 long unsigned int bfSize;
 word bfReserved1;
 word bfReserved2;
 long unsigned int bfOffBits;
};

struct BITMAPCOREHEADER
{
  long unsigned int bcSize;
  word bcWidth;
  word bcHeight;
  word bcPlanes;
  word bcBitCount;
};

struct BITMAPINFOHEADER
{
  long unsigned int biSize;
  long int biWidth;
  
  long  int  biHeight;
  word biPlanes;
  word biBitCount;
  long unsigned int biCompression;
  long unsigned int biSizeImage;
  long int biXPelsPerMeter;
  long int biYPelsPerMeter;
  long unsigned int biClrUsed;
  long unsigned int biClrImportant;
};

struct BITMAPINFO
{
  BITMAPCOREHEADER Core;
  BITMAPINFOHEADER Info;
};

struct FILE_BMP
{
  BITMAPFILEHEADER Header;
  BITMAPINFO Info;
  word Data[]; 
};


File myFile;

//-----------------------
void setup(void) {

  tft.reset();
  tft.initDisplay();
//  testtext(YELLOW);
  tft.fillScreen(BLACK);
  tft.setCursor(0, 0);
  tft.setTextColor(YELLOW);
  tft.setTextSize(1);
  
  pinMode(10, OUTPUT);
  digitalWrite(10, HIGH);

  tft.print("init...");

  if (!SD.begin(10)) 
  {
    tft.println(" failed!");
    delay(3000);
    return; 
 }
  else
  {
    tft.println(" done."); 

    root = SD.open("/");
  
    printDirectory(root, 0);
    delay(3000);
    
    root = SD.open("/");
  }
 
 
}


void printDirectory(File dir, int numTabs) 
{
  byte I=38;
   while(I--) 
   {
     
     File entry =  dir.openNextFile();
     if (! entry) {
       // no more files
       break;
     }
     for (uint8_t i=0; i<numTabs; i++) {
       tft.print(' ');
     }
     tft.print(entry.name());
     if (entry.isDirectory()) {
       tft.println("/");
       printDirectory(entry, numTabs+1);
     } else {
       // files have sizes, directories do not
       tft.print("   ");
       tft.println(entry.size(), DEC);
     }
     entry.close();
   }
}


boolean IsValideBMP(void* bmp, word len)
{
  return ((( BITMAPINFOHEADER*)bmp)->biWidth==240) &&
         ((( BITMAPINFOHEADER*)bmp)->biHeight==320) &&
         ((( BITMAPINFOHEADER*)bmp)->biBitCount==16);
}   
#define BUFER_OUT_IMG_SIZE 255  //word!!!

byte OutBMP565_callback(word* b, void* d)
{
   return ((File*)d)->read(b, BUFER_OUT_IMG_SIZE*2)/sizeof(word);
}


boolean OutBMP565(void)
{
  word buf[BUFER_OUT_IMG_SIZE];
  byte size_buf;
   
  size_buf = myFile.read(buf, sizeof(BITMAPFILEHEADER));
  if(((BITMAPFILEHEADER*)buf)->bfType!=0x4d42)
   return false;

  size_buf = myFile.read(buf, ((BITMAPFILEHEADER*)buf)->bfOffBits-size_buf);
 
  if(IsValideBMP(buf, size_buf))
  {
    tft.bulkWrite(buf, BUFER_OUT_IMG_SIZE, &OutBMP565_callback, &myFile);
    return true;
  }
  return false;
}


//===================
void loop(void) 
{
   while(true) 
   {
     
     myFile =  root.openNextFile();
     if (! myFile) {
       // no more files
        root.close();
        root = SD.open("/");
       return;
     }

     if (!myFile.isDirectory()) 
     {
       if(strstr(myFile.name(), ".BMP"))
       {
          if(OutBMP565())
              delay(3000);
       }
       
     }
     
     myFile.close();

   }
 
}

 

Logik
Offline
Зарегистрирован: 05.08.2014

Да, либку надо допилить, bulkWrite в ней не такой как надо. Будет интересно  -  поясню чё к чему.

Maverik
Offline
Зарегистрирован: 12.09.2012

в фоторамке главное - хорошая качественная матрица, желательно IPS.  ардуина тут никаким боком, у нее другие применения

Logik
Offline
Зарегистрирован: 05.08.2014

Тоже невидаль! IPS?! Он есть для Вас! http://www.dx.com/ru/p/3-2-inch-tft-ips-480-x-320-262k-color-full-angle-...

mrGoReC
Offline
Зарегистрирован: 16.06.2015

ну и что это за фоторамка 3 дюйма, под лупой смотреть как в 50х первые телевизоры????

Logik
Offline
Зарегистрирован: 05.08.2014

Ну это кому какая требуется. В продаже есть готовые и на 3 дюйма. На рабочем столе или в авто 3-4 дюйма- самое оно. Тут вобще интерес в другом. На многих шилдах LCD сразу и ридер микроSD идет. Два в одном флаконе. И если в поделке уже есть такой  LCD, то вполне логично добавить немного кода к существующему и расширить функционал. Получим, к примеру, осцилограф подрабатывающий в свободное от основной работы время фоторамкой.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Logik пишет:
Получим, к примеру, осцилограф подрабатывающий в свободное от основной работы время фоторамкой.


угу. Доктора на вас нет. Он мне за попытку сделать фоторамку из выключателя, мозг выел.

Клапауций 999
Offline
Зарегистрирован: 06.06.2015

Puhlyaviy пишет:
угу. Доктора на вас нет. Он мне за попытку сделать фоторамку из выключателя, мозг выел.

кстати, шо там с твоим выключателем-монитором?

*я бы на месте доктора заменил бы LCD на RGB-диод, что бы дети порнуху по твоему выключателю не смотрели.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Клапауций 999 пишет:

кстати, шо там с твоим выключателем-монитором?

*я бы на месте доктора заменил бы LCD на RGB-диод, что бы дети порнуху по твоему выключателю не смотрели.


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