Mostrar imágenes BMP de la tarjeta SD en el protector TFT LCD
Componentes y suministros
| × | 1 |
Acerca de este proyecto
Hola, este tutorial es un seguimiento de los otros 2 sobre el escudo LCD TFT de 2.4 ″ con Arduino UNO, por lo que el primero fue sobre la interfaz y la solución del problema de la función táctil también con el eje invertido, luego el segundo fue sobre el uso de una función simple para dibujar diferentes formas y cómo crear un botón táctil para activar algunas funciones ...
Interfaz y solución de problemas táctiles en Arduino TFT 2.4 ″ LCD shield
Tutorial del protector de pantalla táctil TFT LCD 2.4 ″
Pero hoy nos ocupamos de leer imágenes de la tarjeta SD y mostrarlas en la pantalla, primero no olvide conectar su tarjeta SD con su computadora y formatearla como FAT32, luego transferir sus imágenes, no olvide que deben ser Formato “BMP”, Bitmaps 24 !! Para tener una imagen correcta las resoluciones deben ser 240 * 320, pequeña explicación:
Esta es la orientación normal de la pantalla, puede mostrar imágenes de 240 * 320, esta es la rotación predeterminada que es setRotation (0);
Esta es la orientación de la pantalla si estableceRotación (1); y ahora puedes mostrar imágenes de 320 * 240.
Para que pueda elegir lo que más le convenga, ya sea cambiar la rotación de la pantalla o la rotación de la imagen en su PC ... luego recuerde o copie el nombre de la imagen y listo, conecte su tarjeta SD en el protector.
Esos son el nombre de mis imágenes bmp de 24 bits en la tarjeta SD porque, como "Img1", lo llamamos en el código usando "Img1.bmp".
Biblioteca:
Esta es la biblioteca que funcionó para mí:descargue aquí si usa esta biblioteca pero cuando intenta con códigos de ejemplo le muestra una pantalla en blanco, definitivamente debe buscar la biblioteca que más le convenga.
Códigos:
Estos son los códigos que usé en el video en formato .ino, no olvide cambiar el nombre de los archivos que está usando. No olvide consultar el tutorial en caso de que necesite ayuda.
- 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 es para usar con el protector de pantalla táctil LCD TFT de 2.4 ", lee imágenes bmp almacenadas en la tarjeta SD * y las muestra en la pantalla * Consulte SurtrTech.com para obtener más detalles * / # include// La biblioteca de gráficos principal # incluye // La biblioteca específica del hardware # incluye #include #define LCD_CS A3 // La selección de chip va a Analog 3 # define LCD_CD A2 // Comando / Datos van a Analógico 2 # define LCD_WR A1 // Escritura de LCD va a Analógico 1 # define LCD_RD A0 // Lectura de LCD va a Analógico 0 # define SD_CS 10 // Pin de tarjeta SD en su escudo Adafruit_TFTLCD tft (LCD_CS, LCD_CD , LCD_WR, LCD_RD, A4); configuración vacía () {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 ("¡falló!")); return;}} void loop () {bmpDraw ("Logo.bmp", 0, 0); // Llamar a la función bmpDraw ("Name_of_your_image.bmp", x, y) (x, y) es la posición inicial del dibujo de la imagen. ng delay (2000); bmpDraw ("Img2.bmp", 0, 0); retraso (2000); bmpDraw ("Img3.bmp", 0, 0); delay (2000);} # define BUFFPIXEL 20 // La velocidad de dibujo, 20 está destinada a ser la mejor, pero puedes usar 60 aunque se necesita mucha RAM de uno // Función de dibujo, lee el archivo de la tarjeta SD y haz lo // conversión y dibujo, también muestra mensajes en el monitor Serial en caso de un problema // No es sensible a esta función:Dvoid bmpDraw (char * filename, int x, int y) {File bmpFile; int bmpWidth, bmpHeight; // W + H en píxeles uint8_t bmpDepth; // Profundidad de bits (actualmente debe ser 24) uint32_t bmpImageoffset; // Inicio de los datos de la imagen en el archivo uint32_t rowSize; // No siempre =bmpWidth; puede tener relleno uint8_t sdbuffer [3 * BUFFPIXEL]; // píxel en búfer (R + G + B por píxel) uint16_t lcdbuffer [BUFFPIXEL]; // búfer de salida de píxeles (16 bits por píxel) uint8_t buffidx =sizeof (sdbuffer); // Posición actual en sdbuffer boolean goodBmp =false; // Establecer en verdadero en un encabezado válido parse boolean flip =true; // BMP se almacena de abajo hacia arriba int w, h, row, col; uint8_t r, g, b; uint32_t pos =0, hora de inicio =milis (); uint8_t lcdidx =0; booleano primero =verdadero; if ((x> =tft.width ()) || (y> =tft.height ())) return; Serial.println (); progmemPrint (PSTR ("Cargando imagen '")); Serial.print (nombre de archivo); Serial.println ('\' '); // Abrir el archivo solicitado en la tarjeta SD if ((bmpFile =SD.open (nombre de archivo)) ==NULL) {progmemPrintln (PSTR ("Archivo no encontrado")); regreso; } // Analizar el encabezado BMP if (read16 (bmpFile) ==0x4D42) {// Firma BMP progmemPrint (PSTR ("Tamaño de archivo:")); Serial.println (read32 (bmpFile)); (vacío) read32 (bmpFile); // Leer e ignorar los bytes del creador bmpImageoffset =read32 (bmpFile); // Inicio de los datos de la imagen progmemPrint (PSTR ("Image Offset:")); Serial.println (bmpImageoffset, DEC); // Leer el encabezado DIB progmemPrint (PSTR ("Tamaño del encabezado:")); Serial.println (read32 (bmpFile)); bmpWidth =read32 (bmpFile); bmpHeight =read32 (bmpFile); if (read16 (bmpFile) ==1) {// # planos - debe ser '1' bmpDepth =read16 (bmpFile); // bits por píxel progmemPrint (PSTR ("Profundidad de bits:")); Serial.println (bmpDepth); if ((bmpDepth ==24) &&(read32 (bmpFile) ==0)) {// 0 =sin comprimir goodBmp =true; // Formato BMP admitido:¡continúe! progmemPrint (PSTR ("Tamaño de imagen:")); Serial.print (bmpWidth); Serial.print ('x'); Serial.println (bmpHeight); // Las filas BMP se rellenan (si es necesario) hasta un límite de 4 bytes. RowSize =(bmpWidth * 3 + 3) &~ 3; // Si bmpHeight es negativo, la imagen está en orden de arriba hacia abajo. // Esto no es canon pero se ha observado en la naturaleza. if (bmpHeight <0) {bmpHeight =-bmpHeight; flip =falso; } // Área de cultivo a cargar w =bmpWidth; h =bmpHeight; si ((x + w-1)> =tft.width ()) w =tft.width () - x; if ((y + h-1)> =tft.height ()) h =tft.height () - y; // Establecer la ventana de dirección TFT a los límites de la imagen recortada tft.setAddrWindow (x, y, x + w-1, y + h-1); for (fila =0; fila =sizeof (sdbuffer)) {// De hecho // Empuje el búfer LCD a la pantalla primero if (lcdidx> 0) {tft.pushColors (lcdbuffer, lcdidx, primero); lcdidx =0; primero =falso; } bmpFile.read (sdbuffer, sizeof (sdbuffer)); buffidx =0; // Establecer el índice al principio} // Convertir el píxel de formato BMP a TFT b =sdbuffer [buffidx ++]; g =sdbuffer [buffidx ++]; r =sdbuffer [buffidx ++]; lcdbuffer [lcdidx ++] =tft.color565 (r, g, b); } // finaliza el píxel} // finaliza la línea de exploración // Escribe los datos restantes en la pantalla LCD if (lcdidx> 0) {tft.pushColors (lcdbuffer, lcdidx, primero); } progmemPrint (PSTR ("Cargado en")); Serial.print (millis () - startTime); Serial.println ("ms"); } // finaliza goodBmp}} bmpFile.close (); if (! goodBmp) progmemPrintln (PSTR ("No se reconoce el formato BMP."));} // Estos leen tipos de 16 y 32 bits del archivo de la tarjeta SD .// Los datos BMP se almacenan en little-endian, Arduino es pequeño -endian too.// Puede que sea necesario invertir el orden de los subíndices si se transfiere a otra parte. uint16_t read16 (File f) {uint16_t result; ((uint8_t *) &resultado) [0] =f.read (); // LSB ((uint8_t *) &resultado) [1] =f.read (); // MSB devuelve resultado;} uint32_t read32 (Archivo f) {uint32_t result; ((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 devuelve el resultado;} // Copia la cadena de la memoria flash al puerto serie // La cadena de origen DEBE estar dentro de una declaración PSTR ()! Void progmemPrint (const char * str) {char c; while (c =pgm_read_byte (str ++)) Serial.print (c);} // Igual que el anterior, con newlinevoid final progmemPrintln (const char * str) {progmemPrint (str); Serial.println ();}
TFT_Shield_SD_2.ino Arduino
/ * Este código es para el protector de pantalla táctil LCD TFT de 2.4 "con placa UNO * Crea una pequeña presentación de diapositivas de imágenes que cambia dependiendo de dónde presiona en la pantalla * Las imágenes se leen desde la tarjeta SD * Consulte a SurtrTech.com para más detalles * / # include// Núm. de la biblioteca de gráficos principal incluye // Núm. de biblioteca específica del hardware incluye #include #include // Biblioteca de funciones de pantalla táctil # si está definida (__ SAM3X8E__) #undef __FlashStringHelper ::F (string_literal) #define F (string_literal) string_literal # endif // Los siguientes parámetros dependen de su escudo, así que asegúrese de que los pines estén correcto # definir YP A3 // debe ser un pin analógico, use la notación "An"! #define XM A2 // debe ser un pin analógico, use la notación "An"! #define YM 9 // puede ser un pin digital # definir XP 8 // puede ser un pin digital // No olvide que si su función táctil no funciona, verifique los valores anteriores que pueden ser (A1 A2 7 6) resp // Calibre los valores que puede w hormiga ejecutar el código de calibración primero y establecer esos puntos # definir TS_MINX 176 # definir TS_MINY 159 # definir TS_MAXX 921 # definir TS_MAXY 884 # definir MINPRESSURE 10 # definir MAXPRESSURE 1000TouchScreen ts =TouchScreen (XP, YP, XM, YM, 300); #define LCD_CS A3 // Chip Select va a Analog 3 # define LCD_CD A2 // Command / Data va a Analog 2 # define LCD_WR A1 // LCD Write va a Analog 1 # define LCD_RD A0 // LCD Read va a Analog 0 # define SD_CS 10 // Establece la línea de selección de chip para lo que uses Adafruit_TFTLCD tft (LCD_CS, LCD_CD, LCD_WR, LCD_RD, A4); char x [] ="x1.bmp"; / * Aquí en este código declaré los nombres como un Array * Entonces puedo hacer modificaciones si quiero desplazarme * Asegúrese de que las imágenes tengan un número como "1" para que pueda aumentarlo o disminuirlo * para ir a la siguiente imagen * / void setup () {Serial.begin ( 9600); tft.reset (); uint16_t identificador =tft.readID (); pinMode (10, SALIDA); escritura digital (10, ALTA); tft.begin (identificador); if (! SD.begin (SD_CS)) {progmemPrintln (PSTR ("¡falló!")); regreso; } tft.setRotation (1); // Para hacer una rotación de 90 de la pantalla bmpDraw (x, 0, 0); // dibujamos la primera imagen que es x -> "x1.bmp" como declaramos} void loop () {if (x [1] <49) // Entonces no vamos a algunos valores extraños que agrego aquí un reinicio de los valores x [1] =49; // Si ya estamos en la primera imagen nos quedamos ahí, lo mismo para la última si (x [1]> 52) // "1" en char es "49" y "4" es "52" Los escribí en este formato para poder manipularlos x [1] =52; TSPoint p =ts.getPoint (); // comprobando si el usuario tocó la pantalla pinMode (XM, OUTPUT); pinMode (YP, SALIDA); if (pz> MINPRESSURE &&pz 0 &&py <100) {Serial.println ("Izquierda"); // Hice esto para mostrar en el monitor serial que presioné a la izquierda x [1] =x [1] -1; // aquí cambiamos el nombre del archivo que queremos leer x [] ="x1.bmp" y x [1] es el 1 en el nombre y x [0] es x bmpDraw (x, 0, 0); // Entonces, lo que hago es simplemente aumentarlo para convertirlo en 2 o disminuirlo para convertirlo en 0 (consulte el primer "si" para ver la solución para este caso, ya que 0 no existe) delay (300); // Luego dibujo la imagen que ahora tiene un nombre diferente dependiendo de qué lado presioné} // Agregando un pequeño retraso para que la detección táctil no rebote si (py> 200 &&py <320) {Serial.println ("Derecha "); x [1] =x [1] +1; bmpDraw (x, 0, 0); retraso (300); }}} #define BUFFPIXEL 20 // La velocidad de impresión 20 está destinada a ser la mejor, puedes ir a 60 pero usando demasiada RAM // función de dibujo no delicada:Dvoid bmpDraw (char * filename, int x, int y) { File bmpFile; int bmpWidth, bmpHeight; // W + H en píxeles uint8_t bmpDepth; // Profundidad de bits (actualmente debe ser 24) uint32_t bmpImageoffset; // Inicio de los datos de la imagen en el archivo uint32_t rowSize; // No siempre =bmpWidth; puede tener relleno uint8_t sdbuffer [3 * BUFFPIXEL]; // píxel en búfer (R + G + B por píxel) uint16_t lcdbuffer [BUFFPIXEL]; // búfer de salida de píxeles (16 bits por píxel) uint8_t buffidx =sizeof (sdbuffer); // Posición actual en sdbuffer boolean goodBmp =false; // Establecer en verdadero en un encabezado válido parse boolean flip =true; // BMP se almacena de abajo hacia arriba int w, h, row, col; uint8_t r, g, b; uint32_t pos =0, hora de inicio =milis (); uint8_t lcdidx =0; booleano primero =verdadero; if ((x> =tft.width ()) || (y> =tft.height ())) return; Serial.println (); progmemPrint (PSTR ("Cargando imagen '")); Serial.print (nombre de archivo); Serial.println ('\' '); // Abrir el archivo solicitado en la tarjeta SD if ((bmpFile =SD.open (nombre de archivo)) ==NULL) {progmemPrintln (PSTR ("Archivo no encontrado")); regreso; } // Analizar el encabezado BMP if (read16 (bmpFile) ==0x4D42) {// Firma BMP progmemPrint (PSTR ("Tamaño de archivo:")); Serial.println (read32 (bmpFile)); (vacío) read32 (bmpFile); // Leer e ignorar los bytes del creador bmpImageoffset =read32 (bmpFile); // Inicio de los datos de la imagen progmemPrint (PSTR ("Image Offset:")); Serial.println (bmpImageoffset, DEC); // Leer el encabezado DIB progmemPrint (PSTR ("Tamaño del encabezado:")); Serial.println (read32 (bmpFile)); bmpWidth =read32 (bmpFile); bmpHeight =read32 (bmpFile); if (read16 (bmpFile) ==1) {// # planos - debe ser '1' bmpDepth =read16 (bmpFile); // bits por píxel progmemPrint (PSTR ("Profundidad de bits:")); Serial.println (bmpDepth); if ((bmpDepth ==24) &&(read32 (bmpFile) ==0)) {// 0 =sin comprimir goodBmp =true; // Formato BMP admitido:¡continúe! progmemPrint (PSTR ("Tamaño de imagen:")); Serial.print (bmpWidth); Serial.print ('x'); Serial.println (bmpHeight); // Las filas BMP se rellenan (si es necesario) hasta un límite de 4 bytes. RowSize =(bmpWidth * 3 + 3) &~ 3; // Si bmpHeight es negativo, la imagen está en orden de arriba hacia abajo. // Esto no es canon pero se ha observado en la naturaleza. if (bmpHeight <0) {bmpHeight =-bmpHeight; flip =falso; } // Área de cultivo a cargar w =bmpWidth; h =bmpHeight; si ((x + w-1)> =tft.width ()) w =tft.width () - x; if ((y + h-1)> =tft.height ()) h =tft.height () - y; // Establecer la ventana de dirección TFT a los límites de la imagen recortada tft.setAddrWindow (x, y, x + w-1, y + h-1); for (fila =0; fila =sizeof (sdbuffer)) {// De hecho // Empuje el búfer LCD a la pantalla primero if (lcdidx> 0) {tft.pushColors (lcdbuffer, lcdidx, primero); lcdidx =0; primero =falso; } bmpFile.read (sdbuffer, sizeof (sdbuffer)); buffidx =0; // Establecer el índice al principio} // Convertir el píxel de formato BMP a TFT b =sdbuffer [buffidx ++]; g =sdbuffer [buffidx ++]; r =sdbuffer [buffidx ++]; lcdbuffer [lcdidx ++] =tft.color565 (r, g, b); } // finaliza el píxel} // finaliza la línea de exploración // Escribe los datos restantes en la pantalla LCD if (lcdidx> 0) {tft.pushColors (lcdbuffer, lcdidx, primero); } progmemPrint (PSTR ("Cargado en")); Serial.print (millis () - startTime); Serial.println ("ms"); } // finaliza goodBmp}} bmpFile.close (); if (! goodBmp) progmemPrintln (PSTR ("No se reconoce el formato BMP."));} // Estos leen tipos de 16 y 32 bits del archivo de la tarjeta SD .// Los datos BMP se almacenan en little-endian, Arduino es pequeño -endian too.// Puede que sea necesario invertir el orden de los subíndices si se transfiere a otra parte. uint16_t read16 (File f) {uint16_t result; ((uint8_t *) &resultado) [0] =f.read (); // LSB ((uint8_t *) &resultado) [1] =f.read (); // MSB devuelve resultado;} uint32_t read32 (Archivo f) {uint32_t result; ((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 devuelve el resultado;} // Copia la cadena de la memoria flash al puerto serie // La cadena de origen DEBE estar dentro de una declaración PSTR ()! Void progmemPrint (const char * str) {char c; while (c =pgm_read_byte (str ++)) Serial.print (c);} // Igual que el anterior, con newlinevoid final progmemPrintln (const char * str) {progmemPrint (str); Serial.println ();}
Esquemas
Es un escudo:DProceso de manufactura
- Tarjeta de felicitación
- Tarjeta de crédito
- Pantalla de cristal líquido (LCD)
- MÓDULO DE DATOS:pantalla TFT ultraestirada de 23,1 ”con control inteligente
- Distec:pantalla TFT de 7 pulgadas robusta y legible a la luz del sol de Ortustech
- Acceed:GPU-PC mejora el rendimiento de la tarjeta gráfica
- Exposición:La pantalla principal
- Kuman TFT 3.5 RetroPie 2018
- AI genera imágenes de una comida terminada a partir de una receta simple basada en texto
- Animación de mapa de bits en ILI9341 TFT Touchscreen Display Shield
- ¡Esquiva las Defs!