Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Exibir imagens BMP do cartão SD no escudo LCD TFT

Componentes e suprimentos

Arduino UNO
× 1

Sobre este projeto






Olá, este tutorial é um follow up dos outros 2 sobre o 2.4 ″ TFT LCD Shield com Arduino UNO, então o primeiro foi sobre como fazer a interface e corrigir o problema da função de toque também de eixo invertido, depois o segundo foi sobre o uso de função simples desenhar formas diferentes e como criar um botão de toque para ativar algumas funções ...

Interface e correção de problema de toque no escudo LCD Arduino TFT 2.4 ″

Tutorial do escudo da tela de toque do TFT LCD de 2,4 ″

Mas hoje tratamos da leitura de imagens do cartão SD e mostrá-las na tela, primeiro não esqueça de conectar o cartão SD ao seu computador e formatar como FAT32 para depois transferir suas imagens não esqueça que elas deveriam ser Formato “BMP”, Bitmaps 24 !! Para ter uma imagem correta as resoluções devem ser 240 * 320, pouca explicação:

Esta é a orientação normal da tela, você pode mostrar imagens de 240 * 320, esta é a rotação padrão que é setRotation (0);

Esta é a orientação da tela se você definir a rotação (1); e agora você pode mostrar imagens de 320 * 240.

Então você pode escolher o que mais lhe convier, ou mudar a rotação da tela ou a rotação da imagem em seu PC ... então lembre-se ou copie o nome da imagem e pronto, conecte seu cartão SD no escudo.

Esses são os nomes das minhas imagens bmp de 24 bits no cartão SD, como “Img1”, nós o chamamos no código usando “Img1.bmp”.





Biblioteca:


Esta é a biblioteca que funcionou para mim:Baixe aqui se você usa esta biblioteca, mas ao tentar com códigos de exemplo ela mostra uma tela branca, você definitivamente deve procurar a biblioteca que mais lhe convier.





Códigos:


Aqui estão os códigos que usei no formato de vídeo in.ino, não se esqueça de mudar o nome dos arquivos que você está usando. Não se esqueça de verificar o tutorial caso precise de ajuda.
  • Código 1
  • Código 2






Código

  • TFT_Shield_SD_1.ino
  • TFT_Shield_SD_2.ino
TFT_Shield_SD_1.ino Arduino
 / * Este código deve ser usado com a proteção da tela de toque LCD TFT de 2,4 ", ele lê imagens bmp armazenadas no cartão SD * e as exibe na tela * Consulte SurtrTech.com para obter mais detalhes * / # include  // Biblioteca de gráficos principais # include  // Biblioteca específica de hardware # include  #include  #define LCD_CS A3 // Chip Select vai para Analog 3 # define LCD_CD A2 // Comando / Dados vão para Analógico 2 # define LCD_WR A1 // Gravação LCD vai para Analógico 1 # define LCD_RD A0 // Leitura LCD vai para Analógico 0 # define SD_CS 10 // Pino do cartão SD em seu shieldAdafruit_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 (identificador); if (! SD.begin (SD_CS)) {progmemPrintln (PSTR ("falhou!")); return;}} void loop () {bmpDraw ("Logo.bmp", 0, 0); // Chamar a função bmpDraw ("Name_of_your_image.bmp", x, y) (x, y) é a posição inicial do desenho da imagemi atraso ng (2000); bmpDraw ("Img2.bmp", 0, 0); atraso (2000); bmpDraw ("Img3.bmp", 0, 0); delay (2000);} # define BUFFPIXEL 20 // Velocidade de desenho, 20 pretende ser o melhor, mas você pode usar 60 embora tome muito da RAM do uno // Função de desenho, lê o arquivo do cartão SD e faz o // conversão e desenho, também mostra mensagens no monitor Serial em caso de problema // Não é sensível a esta função:Dvoid bmpDraw (char * filename, int x, int y) {File bmpFile; int bmpWidth, bmpHeight; // W + H em pixels uint8_t bmpDepth; // Profundidade de bits (atualmente deve ser 24) uint32_t bmpImageoffset; // Início dos dados da imagem no arquivo uint32_t rowSize; // Nem sempre =bmpWidth; pode ter preenchimento uint8_t sdbuffer [3 * BUFFPIXEL]; // pixel no buffer (R + G + B por pixel) uint16_t lcdbuffer [BUFFPIXEL]; // buffer de saída de pixel (16 bits por pixel) uint8_t buffidx =sizeof (sdbuffer); // Posição atual no sdbuffer boolean goodBmp =false; // Definido como verdadeiro na análise de cabeçalho válido boolean flip =true; // BMP é armazenado de baixo para cima int w, h, row, col; uint8_t r, g, b; uint32_t pos =0, startTime =millis (); uint8_t lcdidx =0; booleano primeiro =verdadeiro; if ((x> =tft.width ()) || (y> =tft.height ())) return; Serial.println (); progmemPrint (PSTR ("Carregando imagem '")); Serial.print (nome do arquivo); Serial.println ('\' '); // Abre o arquivo solicitado no cartão SD if ((bmpFile =SD.open (filename)) ==NULL) {progmemPrintln (PSTR ("Arquivo não encontrado")); Retorna; } // Analisa o cabeçalho BMP if (read16 (bmpFile) ==0x4D42) {// assinatura BMP progmemPrint (PSTR ("Tamanho do arquivo:")); Serial.println (read32 (bmpFile)); (void) read32 (bmpFile); // Ler e ignorar os bytes do criador bmpImageoffset =read32 (bmpFile); // Início dos dados da imagem progmemPrint (PSTR ("Image Offset:")); Serial.println (bmpImageoffset, DEC); // Lê o cabeçalho DIB progmemPrint (PSTR ("Tamanho do cabeçalho:")); Serial.println (read32 (bmpFile)); bmpWidth =read32 (bmpFile); bmpHeight =read32 (bmpFile); if (read16 (bmpFile) ==1) {// # planes - deve ser '1' bmpDepth =read16 (bmpFile); // bits por pixel progmemPrint (PSTR ("Bit Depth:")); Serial.println (bmpDepth); if ((bmpDepth ==24) &&(read32 (bmpFile) ==0)) {// 0 =descompactado goodBmp =true; // Formato BMP compatível - continue! progmemPrint (PSTR ("Tamanho da imagem:")); Serial.print (bmpWidth); Serial.print ('x'); Serial.println (bmpHeight); // As linhas BMP são preenchidas (se necessário) para o limite de 4 bytes rowSize =(bmpWidth * 3 + 3) &~ 3; // Se bmpHeight for negativo, a imagem está na ordem de cima para baixo. // Isso não é canônico, mas foi observado na natureza. if (bmpHeight <0) {bmpHeight =-bmpHeight; flip =false; } // Área de recorte a ser carregada w =bmpWidth; h =bmpHeight; if ((x + w-1)> =tft.width ()) w =tft.width () - x; if ((y + h-1)> =tft.height ()) h =tft.height () - y; // Define a janela de endereço TFT para limites de imagem recortada tft.setAddrWindow (x, y, x + w-1, y + h-1); for (linha =0; linha  =sizeof (sdbuffer)) {// De fato // Empurre o buffer LCD para a tela primeiro if (lcdidx> 0) {tft.pushColors (lcdbuffer, lcdidx, primeiro); lcdidx =0; primeiro =falso; } bmpFile.read (sdbuffer, sizeof (sdbuffer)); buffidx =0; // Define o índice para o início} // Converte o pixel do formato BMP para o TFT b =sdbuffer [buffidx ++]; g =sdbuffer [buffidx ++]; r =sdbuffer [buffidx ++]; lcdbuffer [lcdidx ++] =tft.color565 (r, g, b); } // final do pixel} // final da linha de varredura // Grava quaisquer dados restantes no LCD if (lcdidx> 0) {tft.pushColors (lcdbuffer, lcdidx, primeiro); } progmemPrint (PSTR ("Carregado em")); Serial.print (millis () - startTime); Serial.println ("ms"); } // fim goodBmp}} bmpFile.close (); if (! goodBmp) progmemPrintln (PSTR ("formato BMP não reconhecido."));} // Estes lêem tipos de 16 e 32 bits do arquivo do cartão SD.// Dados BMP são armazenados little-endian, Arduino é pequeno -endian too.// Pode precisar reverter a ordem do subscrito se portar para outro lugar.uint16_t read16 (Arquivo f) {uint16_t result; ((uint8_t *) &resultado) [0] =f.read (); // LSB ((uint8_t *) &resultado) [1] =f.read (); // Resultado de retorno de MSB;} uint32_t read32 (Arquivo f) {resultado de uint32_t; ((uint8_t *) &resultado) [0] =f.read (); // LSB ((uint8_t *) &resultado) [1] =f.read (); ((uint8_t *) &resultado) [2] =f.read (); ((uint8_t *) &resultado) [3] =f.read (); // MSB return result;} // Copiar string do flash para a porta serial // String de origem DEVE estar dentro de uma declaração PSTR ()! Void progmemPrint (const char * str) {char c; while (c =pgm_read_byte (str ++)) Serial.print (c);} // O mesmo que acima, com newlinevoid progmemPrintln (const char * str) {progmemPrint (str); Serial.println ();} 
TFT_Shield_SD_2.ino Arduino
 / * Este código se destina à proteção da tela de toque LCD TFT de 2,4 "com placa UNO * Cria uma pequena apresentação de slides de imagens que muda dependendo de onde você pressionou na tela * As imagens são lidas do cartão SD * Consulte para SurtrTech.com para mais detalhes * / # include  // Biblioteca de gráficos principais # include  // Biblioteca específica de hardware # include  #include  #include  // Biblioteca de funções da tela de toque # se definida (__ SAM3X8E__) #undef __FlashStringHelper ::F (string_literal) #define F (string_literal) string_literal # endif // Os parâmetros abaixo dependem do seu escudo, então certifique-se de que os pinos são correto # define YP A3 // deve ser um pino analógico, use a notação "An"! #define XM A2 // deve ser um pino analógico, use a notação "An"! #define YM 9 // pode ser um pino digital # define XP 8 // pode ser um pino digital // Não se esqueça se a função de toque não funcionar verifique os valores acima, pode ser (A1 A2 7 6) resp // Calibrar os valores que você pode usar formiga para executar o código de calibração primeiro e definir esses pontos # define TS_MINX 176 # define TS_MINY 159 # define TS_MAXX 921 # define TS_MAXY 884 # define MINPRESSURE 10 # define MAXPRESSURE 1000TouchScreen ts =TouchScreen (XP, YP, XM, YM, 300); #define LCD_CS A3 // Seleção de Chip vai para Analógico 3 # define LCD_CD A2 // Comando / Dados vai para Analógico 2 # define LCD_WR A1 // Gravação de LCD vai para Analógico 1 # define LCD_RD A0 // Leitura de LCD vai para Analógico 0 # define SD_CS 10 // Defina a linha de seleção de chip para o que quer que você useAdafruit_TFTLCD tft (LCD_CS, LCD_CD, LCD_WR, LCD_RD, A4); char x [] ="x1.bmp"; / * Aqui neste código eu declarei os nomes como um Array * Posso fazer modificações se quiser rolar * Certifique-se de que suas imagens tenham um número como "1" para que você possa aumentá-lo ou diminuí-lo * para ir para a próxima imagem * / void setup () {Serial.begin ( 9600); tft.reset (); identificador uint16_t =tft.readID (); pinMode (10, SAÍDA); digitalWrite (10, ALTO); tft.begin (identificador); if (! SD.begin (SD_CS)) {progmemPrintln (PSTR ("falhou!")); Retorna; } tft.setRotation (1); // Para fazer uma rotação de 90 da tela bmpDraw (x, 0, 0); // desenhamos a primeira imagem que é x -> "x1.bmp" conforme declaramos} void loop () {if (x [1] <49) // Portanto, não vamos para alguns valores estranhos que adicionei aqui um reset dos valores x [1] =49; // Se já estamos na primeira imagem, ficamos lá, mesmo para o lastif (x [1]> 52) // "1" em char é "49" e "4" é "52" Eu os escrevi em este formato para que eu possa manipulá-los x [1] =52; TSPoint p =ts.getPoint (); // checando se o usuário tocou na tela pinMode (XM, OUTPUT); pinMode (YP, OUTPUT); if (pz> MINPRESSURE &&pz  0 &&py <100) {Serial.println ("Esquerda"); // Fiz isso para mostrar no monitor serial que pressionei para a esquerda x [1] =x [1] -1; // aqui mudamos o nome do arquivo que queremos ler x [] ="x1.bmp" e x [1] é o 1 no nome e x [0] é x bmpDraw (x, 0, 0); // Então o que eu faço é apenas aumentá-lo para torná-lo 2 ou diminuí-lo para torná-lo 0 (consulte o primeiro "se" para ver a solução para este caso, visto que 0 não existe) delay (300); // Então eu desenho a imagem que agora tem um nome diferente dependendo de qual lado eu pressionei} // Adicionando um pequeno atraso para que a detecção de toque não salte mais if (py> 200 &&py <320) {Serial.println ("Right "); x [1] =x [1] +1; bmpDraw (x, 0, 0); atraso (300); }}} #define BUFFPIXEL 20 // A velocidade de impressão 20 é para ser a melhor, você pode ir para 60, mas usando muita RAM // função de desenho não sensível:Dvoid bmpDraw (char * filename, int x, int y) { Arquivo bmpFile; int bmpWidth, bmpHeight; // W + H em pixels uint8_t bmpDepth; // Profundidade de bits (atualmente deve ser 24) uint32_t bmpImageoffset; // Início dos dados da imagem no arquivo uint32_t rowSize; // Nem sempre =bmpWidth; pode ter preenchimento uint8_t sdbuffer [3 * BUFFPIXEL]; // pixel no buffer (R + G + B por pixel) uint16_t lcdbuffer [BUFFPIXEL]; // buffer de saída de pixel (16 bits por pixel) uint8_t buffidx =sizeof (sdbuffer); // Posição atual no sdbuffer boolean goodBmp =false; // Definido como verdadeiro na análise de cabeçalho válido boolean flip =true; // BMP é armazenado de baixo para cima int w, h, row, col; uint8_t r, g, b; uint32_t pos =0, startTime =millis (); uint8_t lcdidx =0; booleano primeiro =verdadeiro; if ((x> =tft.width ()) || (y> =tft.height ())) return; Serial.println (); progmemPrint (PSTR ("Carregando imagem '")); Serial.print (nome do arquivo); Serial.println ('\' '); // Abre o arquivo solicitado no cartão SD if ((bmpFile =SD.open (filename)) ==NULL) {progmemPrintln (PSTR ("Arquivo não encontrado")); Retorna; } // Analisa o cabeçalho BMP if (read16 (bmpFile) ==0x4D42) {// assinatura BMP progmemPrint (PSTR ("Tamanho do arquivo:")); Serial.println (read32 (bmpFile)); (void) read32 (bmpFile); // Ler e ignorar os bytes do criador bmpImageoffset =read32 (bmpFile); // Início dos dados da imagem progmemPrint (PSTR ("Image Offset:")); Serial.println (bmpImageoffset, DEC); // Lê o cabeçalho DIB progmemPrint (PSTR ("Tamanho do cabeçalho:")); Serial.println (read32 (bmpFile)); bmpWidth =read32 (bmpFile); bmpHeight =read32 (bmpFile); if (read16 (bmpFile) ==1) {// # planes - deve ser '1' bmpDepth =read16 (bmpFile); // bits por pixel progmemPrint (PSTR ("Bit Depth:")); Serial.println (bmpDepth); if ((bmpDepth ==24) &&(read32 (bmpFile) ==0)) {// 0 =descompactado goodBmp =true; // Formato BMP compatível - continue! progmemPrint (PSTR ("Tamanho da imagem:")); Serial.print (bmpWidth); Serial.print ('x'); Serial.println (bmpHeight); // As linhas BMP são preenchidas (se necessário) para o limite de 4 bytes rowSize =(bmpWidth * 3 + 3) &~ 3; // Se bmpHeight for negativo, a imagem está na ordem de cima para baixo. // Isso não é canônico, mas foi observado na natureza. if (bmpHeight <0) {bmpHeight =-bmpHeight; flip =false; } // Área de recorte a ser carregada w =bmpWidth; h =bmpHeight; if ((x + w-1)> =tft.width ()) w =tft.width () - x; if ((y + h-1)> =tft.height ()) h =tft.height () - y; // Define a janela de endereço TFT para limites de imagem recortada tft.setAddrWindow (x, y, x + w-1, y + h-1); for (linha =0; linha  =sizeof (sdbuffer)) {// De fato // Empurre o buffer LCD para a tela primeiro if (lcdidx> 0) {tft.pushColors (lcdbuffer, lcdidx, primeiro); lcdidx =0; primeiro =falso; } bmpFile.read (sdbuffer, sizeof (sdbuffer)); buffidx =0; // Define o índice para o início} // Converte o pixel do formato BMP para o TFT b =sdbuffer [buffidx ++]; g =sdbuffer [buffidx ++]; r =sdbuffer [buffidx ++]; lcdbuffer [lcdidx ++] =tft.color565 (r, g, b); } // final do pixel} // final da linha de varredura // Grava quaisquer dados restantes no LCD if (lcdidx> 0) {tft.pushColors (lcdbuffer, lcdidx, primeiro); } progmemPrint (PSTR ("Carregado em")); Serial.print (millis () - startTime); Serial.println ("ms"); } // fim goodBmp}} bmpFile.close (); if (! goodBmp) progmemPrintln (PSTR ("formato BMP não reconhecido."));} // Estes lêem tipos de 16 e 32 bits do arquivo do cartão SD.// Dados BMP são armazenados little-endian, Arduino é pequeno -endian too.// Pode precisar reverter a ordem do subscrito se portar para outro lugar.uint16_t read16 (Arquivo f) {uint16_t result; ((uint8_t *) &resultado) [0] =f.read (); // LSB ((uint8_t *) &resultado) [1] =f.read (); // Resultado de retorno de MSB;} uint32_t read32 (Arquivo f) {resultado de uint32_t; ((uint8_t *) &resultado) [0] =f.read (); // LSB ((uint8_t *) &resultado) [1] =f.read (); ((uint8_t *) &resultado) [2] =f.read (); ((uint8_t *) &resultado) [3] =f.read (); // MSB return result;} // Copiar string do flash para a porta serial // String de origem DEVE estar dentro de uma declaração PSTR ()! Void progmemPrint (const char * str) {char c; while (c =pgm_read_byte (str ++)) Serial.print (c);} // O mesmo que acima, com newlinevoid progmemPrintln (const char * str) {progmemPrint (str); Serial.println ();} 

Esquemas

É um escudo:D

Processo de manufatura

  1. Cartão de felicitações
  2. Cartão de crédito
  3. Tela de cristal líquido (LCD)
  4. MÓDULO DE DADOS:Tela TFT ultra-esticada de 23,1 ”com controle inteligente
  5. Distec:tela TFT de 7 polegadas robusta, legível à luz do sol da Ortustech
  6. Aceito:GPU-PC ganha desempenho da placa gráfica
  7. Exposição:A Tela Primária
  8. Kuman TFT 3.5 RetroPie 2018
  9. AI gera imagens de uma refeição acabada a partir de uma receita simples baseada em texto
  10. Dodge The Defs!