Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Afficher les images BMP de la carte SD sur l'écran LCD TFT

Composants et fournitures

Arduino UNO
× 1

À propos de ce projet

Bonjour, ce tutoriel fait suite aux 2 autres sur le Shield LCD TFT 2.4″ avec Arduino UNO, donc le premier concernait l'interfaçage et la résolution du problème de la fonction tactile également à axe inversé, puis le second concernait l'utilisation de la fonction simple pour dessiner différentes formes et comment créer un bouton tactile pour activer certaines fonctions…

Interfaçage et résolution du problème tactile dans le shield LCD Arduino TFT 2.4″

Tutoriel écran tactile TFT LCD 2.4"

Mais aujourd'hui il s'agit de lire les images de la carte SD et de les afficher à l'écran, d'abord n'oubliez pas de brancher votre carte SD avec votre ordinateur et formatez-la en FAT32 puis transférez vos images n'oubliez pas qu'elles doivent être Format « BMP », Bitmaps 24 !! Pour avoir une image correcte les résolutions doivent être de 240*320, petite explication :

C'est l'orientation normale de l'écran, vous pouvez afficher des images de 240*320, c'est la rotation par défaut qui est setRotation(0) ;

Il s'agit de l'orientation de l'écran si vous définissezRotation(1) ; et maintenant vous pouvez afficher des images de 320*240.

Vous pouvez donc choisir ce qui vous convient, soit changer la rotation de l'écran, soit la rotation de l'image sur votre PC… puis mémoriser ou copier le nom de l'image et le tour est joué, branchez votre carte SD dans le shield.

C'est le nom de mes images bmp 24 bits sur carte SD car comme « Img1 » nous l'appelons dans le code en utilisant « Img1.bmp ».

Bibliothèque :

C'est la bibliothèque qui a fonctionné pour moi :téléchargez ici si vous utilisez cette bibliothèque mais lorsque vous essayez avec des exemples de codes, un écran blanc s'affiche, vous devez absolument rechercher la bibliothèque qui vous convient.

Codes :

Voici les codes que j'ai utilisés dans la vidéo au format in.ino, n'oubliez pas de changer le nom des fichiers que vous utilisez. N'oubliez pas de consulter le didacticiel au cas où vous auriez besoin d'aide.

  • Code 1
  • Code 2

Code

  • TFT_Shield_SD_1.ino
  • TFT_Shield_SD_2.ino
TFT_Shield_SD_1.inoArduino
/*Ce code est à utiliser avec un écran tactile LCD TFT 2,4", il lit les images bmp stockées sur la carte SD * et les affiche à l'écran * Reportez-vous à SurtrTech.com pour plus de détails */#include  // Bibliothèque graphique principale#include  // Bibliothèque spécifique au matériel#include #include #define LCD_CS A3 // La sélection de puce passe à Analog 3#define LCD_CD A2 // La commande/les données vont à Analog 2#define LCD_WR A1 // L'écriture LCD va à Analog 1#define LCD_RD A0 // La lecture LCD va à Analog 0#define SD_CS 10 // La broche de la carte SD sur votre 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(identifier); if (!SD.begin(SD_CS)) { progmemPrintln(PSTR("échoué !")); return; } }boucle vide(){ bmpDraw("Logo.bmp", 0, 0); //Appel de la fonction bmpDraw ("Nom_de_votre_image.bmp",x,y) (x,y) est la position de départ du dessin de l'imagei ng retard (2000); bmpDraw("Img2.bmp", 0, 0); retard (2000); bmpDraw("Img3.bmp", 0, 0); delay(2000);}#define BUFFPIXEL 20 //Vitesse de dessin, 20 est censée être la meilleure mais vous pouvez en utiliser 60 même si cela prend beaucoup de RAM de uno //Fonction de dessin, lit le fichier de la carte SD et fait le //conversion et dessin, il affiche également des messages sur le moniteur série en cas de problème//Pas sensible à cette fonction :Dvoid bmpDraw(char *filename, int x, int y) { File bmpFile; int largeur bmp, hauteur bmp ; // L+H en pixels uint8_t bmpDepth; // Profondeur de bits (doit actuellement être de 24) uint32_t bmpImageoffset; // Début des données d'image dans le fichier uint32_t rowSize; // Pas toujours =bmpWidth; peut avoir un remplissage uint8_t sdbuffer[3*BUFFPIXEL]; // pixel dans le tampon (R+V+B par pixel) uint16_t lcdbuffer[BUFFPIXEL]; // pixel out buffer (16 bits par pixel) uint8_t buffidx =sizeof(sdbuffer); // Position actuelle dans sdbuffer booléen goodBmp =false; // Définie sur true lors de l'analyse d'en-tête valide boolean flip =true; // BMP est stocké de bas en haut int w, h, row, col; uint8_t r, g, b; uint32_t pos =0, startTime =millis(); uint8_t lcdidx =0; booléen d'abord =vrai ; if((x>=tft.width()) || (y>=tft.height())) return ; Serial.println(); progmemPrint(PSTR("Chargement de l'image '")); Serial.print(nom de fichier); Serial.println('\''); // Ouvrir le fichier demandé sur la carte SD if ((bmpFile =SD.open(filename)) ==NULL) { progmemPrintln(PSTR("File not found")); retourner; } // Analyse l'en-tête BMP if(read16(bmpFile) ==0x4D42) { // Signature BMP progmemPrint(PSTR("File size:")); Serial.println(read32(bmpFile)); (void)read32(bmpFile); // Lire et ignorer les octets du créateur bmpImageoffset =read32(bmpFile); // Début des données d'image progmemPrint(PSTR("Image Offset:")); Serial.println(bmpImageoffset, DEC); // Lecture de l'en-tête DIB progmemPrint(PSTR("Taille de l'en-tête :")); Serial.println(read32(bmpFile)); bmpWidth =read32(bmpFile); bmpHeight =read32(bmpFile); if(read16(bmpFile) ==1) { // # plans -- doit être '1' bmpDepth =read16(bmpFile); // bits par pixel progmemPrint(PSTR("Bit Depth:")); Serial.println(bmpDepth); if((bmpDepth ==24) &&(read32(bmpFile) ==0)) { // 0 =goodBmp non compressé =true; // Format BMP pris en charge -- continuez ! progmemPrint(PSTR("Taille de l'image :")); Serial.print(bmpWidth); Serial.print('x'); Serial.println(bmpHeight); // Les lignes BMP sont remplies (si nécessaire) jusqu'à la limite de 4 octets rowSize =(bmpWidth * 3 + 3) &~3; // Si bmpHeight est négatif, l'image est dans l'ordre descendant. // Ce n'est pas canon mais a été observé dans la nature. if(bmpHeight <0) { bmpHeight =-bmpHeight; flip =faux; } // Zone de recadrage à charger w =bmpWidth; h =bmpHauteur ; if((x+w-1)>=tft.width()) w =tft.width() - x; if((y+h-1)>=tft.height()) h =tft.height() - y; // Définir la fenêtre d'adresse TFT sur les limites de l'image tronquée tft.setAddrWindow(x, y, x+w-1, y+h-1); for (row=0; row=sizeof(sdbuffer)) { // Effectivement // Pousser le tampon LCD vers l'affichage en premier if(lcdidx> 0) { tft.pushColors(lcdbuffer, lcdidx, first); lcdidx =0; premier =faux ; } bmpFile.read(sdbuffer, sizeof(sdbuffer)); buffidx =0; // Définir l'index au début } // Convertir le pixel du format BMP au format TFT b =sdbuffer[buffidx++]; g =sdbuffer[buffidx++]; r =sdbuffer[buffidx++]; lcdbuffer[lcdidx++] =tft.color565(r,g,b); } // fin du pixel } // fin de la ligne de balayage // Ecrit toutes les données restantes sur l'écran LCD if(lcdidx> 0) { tft.pushColors(lcdbuffer, lcdidx, first); } progmemPrint(PSTR("Chargé dans ")); Serial.print(millis() - startTime); Serial.println("ms"); } // fin goodBmp } } bmpFile.close(); if(!goodBmp) progmemPrintln(PSTR("Format BMP non reconnu."));}// Ceux-ci lisent les types 16 et 32 ​​bits à partir du fichier de la carte SD.// Les données BMP sont stockées petit-boutiste, Arduino est petit -endian aussi.// Il peut être nécessaire d'inverser l'ordre des indices si le portage est ailleurs.uint16_t read16(File f) { uint16_t result; ((uint8_t *)&result)[0] =f.read(); // LSB ((uint8_t *)&result)[1] =f.read(); // MSB renvoie le résultat ;}uint32_t read32(File f) { uint32_t result ; ((uint8_t *)&result)[0] =f.read(); // LSB ((uint8_t *)&result)[1] =f.read(); ((uint8_t *)&result)[2] =f.read(); ((uint8_t *)&result)[3] =f.read(); // MSB renvoie le résultat ;}// Copie la chaîne de la mémoire flash vers le port série// La chaîne source DOIT être à l'intérieur d'une déclaration PSTR() ! void progmemPrint(const char *str) { char c; while(c =pgm_read_byte(str++)) Serial.print(c);}// Identique à ci-dessus, avec en fin de ligne newlinevoid progmemPrintln(const char *str) { progmemPrint(str); Serial.println();}
TFT_Shield_SD_2.inoArduino
/*Ce code est destiné à l'écran tactile LCD TFT 2,4" avec carte UNO * Il crée un petit diaporama d'images qui change en fonction de l'endroit où vous appuyez sur l'écran * Les images sont lues à partir de la carte SD * Référez-vous à SurtrTech.com pour plus de détails */#include  // Bibliothèque graphique principale#include  // Bibliothèque spécifique au matériel#include #include  #include  //Bibliothèque de fonctions d'écran tactile#ifdefined(__SAM3X8E__) #undef __FlashStringHelper::F(string_literal) #define F(string_literal) string_literal#endif//Les paramètres ci-dessous dépendent de votre bouclier, assurez-vous donc que les broches sont correct#define YP A3 // doit être une broche analogique, utilisez la notation "An" ! #define XM A2 // doit être une broche analogique, utilisez la notation "An" !#define YM 9 // peut être une broche numérique#define XP 8 // peut être une broche numérique // N'oubliez pas si votre fonction tactile ne fonctionne pas, vérifiez les valeurs ci-dessus (A1 A2 7 6) resp // Calibrez les valeurs que vous pouvez w ant pour exécuter le code d'étalonnage d'abord et définir ces points#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 // La sélection de puce passe à Analog 3#define LCD_CD A2 // La commande/les données passe à Analog 2#define LCD_WR A1 // L'écriture LCD passe à Analog 1#define LCD_RD A0 // La lecture LCD passe à Analog 0# define SD_CS 10 // Définissez la ligne de sélection de puce sur ce que vous utilisezAdafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, A4);char x[]="x1.bmp";/*Ici, dans ce code, j'ai déclaré les noms comme Array * Je peux donc faire des modifications si je veux faire défiler * Assurez-vous que vos images ont un numéro comme "1" afin que vous puissiez l'augmenter ou le diminuer * pour passer à l'image suivante */void setup(){ Serial.begin( 9600); tft.reset(); identifiant uint16_t =tft.readID(); pinMode (10, SORTIE); digitalWrite(10, HAUT); tft.begin(identifiant); if (!SD.begin(SD_CS)) { progmemPrintln(PSTR("échec !")); retourner; } tft.setRotation(1); //Pour faire une rotation de 90 de l'écran bmpDraw(x, 0, 0); //on dessine la première image qui est x -> "x1.bmp" comme on l'a déclaré}void loop(){if(x[1]<49) //Donc, nous n'allons pas à des valeurs étranges que j'ajoute ici une remise à zéro des valeursx[1]=49 ; //Si on est déjà dans la première image on y reste, idem pour le lastif(x[1]>52) //"1" dans char est "49" et "4" est "52" je les ai écrits dans ce format pour que je puisse les manipulerx[1]=52 ; TSPoint p =ts.getPoint(); //vérification si l'utilisateur a touché l'écran pinMode(XM, OUTPUT); pinMode(YP, SORTIE); if (pz> MINPRESSURE &&pz  0 &&py <100 ){ Serial.println("Gauche"); //J'ai fait cela pour montrer sur le moniteur série que j'ai appuyé à gauche sur x[1]=x[1]-1; //ici nous changeons le nom du fichier que nous voulons lire x[]="x1.bmp" et x[1] est le 1 dans le nom et x[0] est x bmpDraw(x, 0, 0); // Donc, ce que je fais, c'est simplement l'augmenter pour en faire 2 ou le diminuer pour le rendre 0 (référez-vous au premier "if" pour voir la solution pour ce cas car 0 n'existe pas) delay(300); //Ensuite, je dessine l'image qui a maintenant un nom différent selon le côté sur lequel j'ai appuyé } //Ajout d'un petit délai pour que la détection tactile ne rebondisse pas sinon if(py>200 &&py <320){ Serial.println("Droit "); x[1]=x[1]+1 ; bmpDessiner(x, 0, 0); retard (300); } } }#define BUFFPIXEL 20 //La vitesse d'impression 20 est censée être la meilleure, vous pouvez aller à 60 mais en utilisant trop de RAM // fonction de dessin pas délicate :Dvoid bmpDraw(char *filename, int x, int y) { Fichier bmpFichier ; int largeur bmp, hauteur bmp ; // L+H en pixels uint8_t bmpDepth; // Profondeur de bits (doit actuellement être de 24) uint32_t bmpImageoffset; // Début des données d'image dans le fichier uint32_t rowSize; // Pas toujours =bmpWidth; peut avoir un remplissage uint8_t sdbuffer[3*BUFFPIXEL]; // pixel dans le tampon (R+V+B par pixel) uint16_t lcdbuffer[BUFFPIXEL]; // pixel out buffer (16 bits par pixel) uint8_t buffidx =sizeof(sdbuffer); // Position actuelle dans sdbuffer booléen goodBmp =false; // Définie sur true lors de l'analyse d'en-tête valide boolean flip =true; // BMP est stocké de bas en haut int w, h, row, col; uint8_t r, g, b; uint32_t pos =0, startTime =millis(); uint8_t lcdidx =0; booléen d'abord =vrai ; if((x>=tft.width()) || (y>=tft.height())) return ; Serial.println(); progmemPrint(PSTR("Chargement de l'image '")); Serial.print(nom de fichier); Serial.println('\''); // Ouvrir le fichier demandé sur la carte SD if ((bmpFile =SD.open(filename)) ==NULL) { progmemPrintln(PSTR("File not found")); retourner; } // Analyse l'en-tête BMP if(read16(bmpFile) ==0x4D42) { // Signature BMP progmemPrint(PSTR("File size:")); Serial.println(read32(bmpFile)); (void)read32(bmpFile); // Lire et ignorer les octets du créateur bmpImageoffset =read32(bmpFile); // Début des données d'image progmemPrint(PSTR("Image Offset:")); Serial.println(bmpImageoffset, DEC); // Lecture de l'en-tête DIB progmemPrint(PSTR("Taille de l'en-tête :")); Serial.println(read32(bmpFile)); bmpWidth =read32(bmpFile); bmpHeight =read32(bmpFile); if(read16(bmpFile) ==1) { // # plans -- doit être '1' bmpDepth =read16(bmpFile); // bits par pixel progmemPrint(PSTR("Bit Depth:")); Serial.println(bmpDepth); if((bmpDepth ==24) &&(read32(bmpFile) ==0)) { // 0 =goodBmp non compressé =true; // Format BMP pris en charge -- continuez ! progmemPrint(PSTR("Taille de l'image :")); Serial.print(bmpWidth); Serial.print('x'); Serial.println(bmpHeight); // Les lignes BMP sont remplies (si nécessaire) jusqu'à la limite de 4 octets rowSize =(bmpWidth * 3 + 3) &~3; // Si bmpHeight est négatif, l'image est dans l'ordre descendant. // Ce n'est pas canon mais a été observé dans la nature. if(bmpHeight <0) { bmpHeight =-bmpHeight; flip =faux; } // Zone de recadrage à charger w =bmpWidth; h =bmpHauteur ; if((x+w-1)>=tft.width()) w =tft.width() - x; if((y+h-1)>=tft.height()) h =tft.height() - y; // Définir la fenêtre d'adresse TFT sur les limites de l'image tronquée tft.setAddrWindow(x, y, x+w-1, y+h-1); for (row=0; row=sizeof(sdbuffer)) { // Effectivement // Pousser le tampon LCD vers l'affichage en premier if(lcdidx> 0) { tft.pushColors(lcdbuffer, lcdidx, first); lcdidx =0; premier =faux ; } bmpFile.read(sdbuffer, sizeof(sdbuffer)); buffidx =0; // Définir l'index au début } // Convertir le pixel du format BMP au format TFT b =sdbuffer[buffidx++]; g =sdbuffer[buffidx++]; r =sdbuffer[buffidx++]; lcdbuffer[lcdidx++] =tft.color565(r,g,b); } // fin du pixel } // fin de la ligne de balayage // Ecrit toutes les données restantes sur l'écran LCD if(lcdidx> 0) { tft.pushColors(lcdbuffer, lcdidx, first); } progmemPrint(PSTR("Chargé dans ")); Serial.print(millis() - startTime); Serial.println("ms"); } // fin goodBmp } } bmpFile.close(); if(!goodBmp) progmemPrintln(PSTR("Format BMP non reconnu."));}// Ceux-ci lisent les types 16 et 32 ​​bits à partir du fichier de la carte SD.// Les données BMP sont stockées petit-boutiste, Arduino est petit -endian aussi.// Il peut être nécessaire d'inverser l'ordre des indices si le portage est ailleurs.uint16_t read16(File f) { uint16_t result; ((uint8_t *)&result)[0] =f.read(); // LSB ((uint8_t *)&result)[1] =f.read(); // MSB renvoie le résultat ;}uint32_t read32(File f) { uint32_t result ; ((uint8_t *)&result)[0] =f.read(); // LSB ((uint8_t *)&result)[1] =f.read(); ((uint8_t *)&result)[2] =f.read(); ((uint8_t *)&result)[3] =f.read(); // MSB renvoie le résultat ;}// Copie la chaîne de la mémoire flash vers le port série// La chaîne source DOIT être à l'intérieur d'une déclaration PSTR() ! void progmemPrint(const char *str) { char c; while(c =pgm_read_byte(str++)) Serial.print(c);}// Identique à ci-dessus, avec en fin de ligne newlinevoid progmemPrintln(const char *str) { progmemPrint(str); Serial.println();}

Schémas

C'est un bouclier :D

Processus de fabrication

  1. Carte de voeux
  2. Carte de crédit
  3. MODULE DE DONNÉES : écran TFT ultra-étiré de 23,1 pouces avec contrôle intelligent
  4. Distec :écran TFT 7 pouces robuste et lisible au soleil d'Ortustech
  5. Accéder :le GPU-PC gagne en performances grâce à la carte graphique
  6. Exhibit :The Primal Display
  7. Kuman TFT 3.5 RetroPie 2018
  8. L'IA génère des images d'un repas fini à partir d'une recette textuelle simple
  9. Esquivez les défenses !