Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

BMP-afbeeldingen van SD-kaart weergeven op TFT LCD-scherm

Componenten en benodigdheden

Arduino UNO
× 1

Over dit project

Hallo, deze tutorial is een vervolg op de 2 andere over het 2,4-inch TFT LCD-schild met Arduino UNO, dus de eerste ging over interfacing en het oplossen van het probleem met de aanraakfunctie, ook omgekeerde as, en de tweede ging over het gebruik van een eenvoudige functie om verschillende vormen te tekenen en hoe je een aanraakknop maakt om sommige functies te activeren...

Interfacing en oplossen van aanraakproblemen in Arduino TFT 2.4″ LCD-schild

TFT LCD 2.4″ Touchscreen schild tutorial

Maar vandaag gaan we over het lezen van afbeeldingen van een SD-kaart en ze op het scherm tonen, vergeet niet eerst uw SD-kaart aan te sluiten op uw computer en deze te formatteren als FAT32 en breng vervolgens uw afbeeldingen over. Vergeet niet dat ze moeten worden “BMP” formaat, Bitmaps 24 !! Voor een correct beeld moeten de resoluties 240*320 zijn, weinig uitleg:

Dit is de normale oriëntatie van het scherm waarop u afbeeldingen van 240*320 kunt tonen, dit is de standaardrotatie die setRotation(0) is;

Dit is de oriëntatie van het scherm als u Rotatie(1) instelt; en nu kun je afbeeldingen van 320*240 tonen.

Je kunt dus kiezen wat bij je past:verander de schermrotatie of de beeldrotatie op je pc... onthoud of kopieer de naam van de afbeelding en dat is alles, steek je SD-kaart in het schild.

Dat is de naam van mijn bmp 24-bits afbeeldingen op een SD-kaart, zoals "Img1" noemen we het in de code door "Img1.bmp" te gebruiken.

Bibliotheek:

Dit is de bibliotheek die voor mij werkte:download hier als je deze bibliotheek gebruikt, maar als je probeert met voorbeeldcodes, krijg je een wit scherm te zien, je moet zeker de bibliotheek zoeken die bij je past.

Codes:

Dit zijn de codes die ik heb gebruikt in de video in.ino-indeling, vergeet niet de naam van de bestanden die u gebruikt te wijzigen. Vergeet niet de tutorial te bekijken voor het geval je hulp nodig hebt.

  • Code 1
  • Code 2

Code

  • TFT_Shield_SD_1.ino
  • TFT_Shield_SD_2.ino
TFT_Shield_SD_1.inoArduino
/*Deze code moet worden gebruikt met 2,4" TFT LCD-aanraakscherm, het leest bmp-afbeeldingen die zijn opgeslagen op een SD-kaart *en toont ze op het scherm *Raadpleeg SurtrTech.com voor meer details */#include  // Core grafische bibliotheek#include  // Hardwarespecifieke bibliotheek#include #include #define LCD_CS A3 // Chip Select gaat naar Analog 3#define LCD_CD A2 // Commando/Data gaat naar Analog 2#define LCD_WR A1 // LCD Write gaat naar Analog 1#define LCD_RD A0 // LCD Read gaat naar Analog 0#define SD_CS 10 //SD-kaartpin op je 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("mislukt!")); return;} }void loop(){ bmpDraw("Logo.bmp", 0, 0); //Het aanroepen van de bmpDraw-functie ("Name_of_your_image.bmp",x,y) (x,y) is de startpositie van de afbeelding drawi ng vertraging (2000); bmpDraw("Img2.bmp", 0, 0); vertraging (2000); bmpDraw("Img3.bmp", 0, 0); delay(2000);}#define BUFFPIXEL 20 //Tekensnelheid, 20 is bedoeld om de beste te zijn, maar je kunt 60 gebruiken, hoewel het veel uno's RAM kost //Tekenfunctie, het bestand van de SD-kaart leest en de //conversie en tekening, het toont ook berichten op de seriële monitor in geval van een probleem//Niet gevoelig voor deze functie:Dvoid bmpDraw (char * bestandsnaam, int x, int y) { Bestand bmpFile; int bmpBreedte, bmpHoogte; // B+H in pixels uint8_t bmpDepth; // Bitdiepte (moet momenteel 24 zijn) uint32_t bmpImageoffset; // Begin van afbeeldingsgegevens in bestand uint32_t rowSize; // Niet altijd =bmpWidth; heeft mogelijk opvulling uint8_t sdbuffer [3*BUFFPIXEL]; // pixel in buffer (R+G+B per pixel) uint16_t lcdbuffer [BUFFPIXEL]; // pixel uit buffer (16-bits per pixel) uint8_t buffidx =sizeof(sdbuffer); // Huidige positie in sdbuffer boolean goodBmp =false; // Ingesteld op true op geldige header parse boolean flip =true; // BMP wordt van onder naar boven opgeslagen int w, h, rij, col; uint8_t r, g, b; uint32_t pos =0, startTime =millis(); uint8_t lcdidx =0; boolean eerst =waar; if((x>=tft.width()) || (y>=tft.height())) return; Serieel.println(); progmemPrint(PSTR("Beeld laden '")); Serial.print(bestandsnaam); Serieel.println('\''); // Open het gevraagde bestand op SD-kaart if ((bmpFile =SD.open(bestandsnaam)) ==NULL) { progmemPrintln (PSTR ("Bestand niet gevonden")); opbrengst; } // BMP-header ontleden if (read16 (bmpFile) ==0x4D42) { // BMP-handtekening progmemPrint (PSTR ("Bestandsgrootte:")); Serial.println(read32(bmpFile)); (void)read32(bmpFile); // Lezen en negeren schepper bytes bmpImageoffset =read32 (bmpFile); // Start van beeldgegevens progmemPrint(PSTR("Image Offset:")); Serial.println(bmpImageoffset, DEC); // Lees DIB-header progmemPrint (PSTR ("Headergrootte:")); Serial.println(read32(bmpFile)); bmpWidth =read32(bmpFile); bmpHeight =read32(bmpFile); if(read16(bmpFile) ==1) { // # planes -- moet '1' zijn bmpDepth =read16(bmpFile); // bits per pixel progmemPrint (PSTR ("Bitdiepte:")); Serial.println(bmpDepth); if((bmpDepth ==24) &&(read32(bmpFile) ==0)) { // 0 =ongecomprimeerd goodBmp =true; // Ondersteund BMP-formaat -- ga verder! progmemPrint(PSTR("Afbeeldingsgrootte:")); Serial.print(bmpWidth); Serieel.print('x'); Serial.println(bmpHeight); // BMP-rijen worden opgevuld (indien nodig) tot 4-byte grens rowSize =(bmpWidth * 3 + 3) &~3; // Als bmpHeight negatief is, staat de afbeelding in de volgorde van boven naar beneden. // Dit is geen canon, maar is in het wild waargenomen. if(bmpHeight <0) { bmpHeight =-bmpHeight; omdraaien =onwaar; } // Te laden gewasgebied w =bmpWidth; h =bmpHoogte; if((x+w-1)>=tft.breedte()) w =tft.breedte() - x; if((y+h-1)>=tft.height()) h =tft.height() - y; // Stel TFT-adresvenster in op geknipte beeldgrenzen tft.setAddrWindow(x, y, x+w-1, y+h-1); for (rij=0; rij=sizeof(sdbuffer)) { // Indeed // Push LCD buffer eerst naar het scherm if (lcdidx> 0) { tft.pushColors(lcdbuffer, lcdidx, first); lcdidx =0; eerste =onwaar; } bmpFile.read(sdbuffer, sizeof(sdbuffer)); buffx =0; // Stel index in op begin} // Converteer pixel van BMP naar TFT-formaat b =sdbuffer [buffidx++]; g =sdbuffer[buffidx++]; r =sdbuffer[buffidx++]; lcdbuffer[lcdidx++] =tft.color565(r,g,b); } // end pixel } // end scanline // Schrijf alle resterende gegevens naar LCD if (lcdidx> 0) { tft.pushColors (lcdbuffer, lcdidx, first); } progmemPrint(PSTR("Geladen in")); Serial.print(millis() - startTime); Serial.println ("ms"); } // end goodBmp } } bmpFile.close(); if(!goodBmp) progmemPrintln(PSTR("BMP-formaat niet herkend."));}// Deze lezen 16- en 32-bits typen uit het SD-kaartbestand.// BMP-gegevens worden little-endian opgeslagen, Arduino is klein -endian too.// Mogelijk moet de subscriptvolgorde worden omgekeerd als u elders porteert.uint16_t read16(File f) { uint16_t result; ((uint8_t *)&result)[0] =f.lezen(); // LSB ((uint8_t *)&result)[1] =f.read(); // MSB retourneert resultaat;} uint32_t read32 (File f) { uint32_t resultaat; ((uint8_t *)&result)[0] =f.lezen(); // LSB ((uint8_t *)&result)[1] =f.read(); ((uint8_t *)&result)[2] =f.read(); ((uint8_t *)&result)[3] =f.read(); // MSB-retourresultaat;}// Kopieer string van flash naar seriële poort// Bronstring MOET in een PSTR()-declaratie staan!void progmemPrint(const char *str) { char c; while(c =pgm_read_byte(str++)) Serial.print(c);}// Hetzelfde als hierboven, met als laatste newlinevoid progmemPrintln(const char *str) { progmemPrint(str); Serieel.println();}
TFT_Shield_SD_2.inoArduino
/*Deze code is bedoeld voor het 2,4" TFT LCD-aanraakscherm met UNO-kaart * Het creëert een kleine diavoorstelling van afbeeldingen die verandert afhankelijk van waar u op het scherm drukt * De afbeeldingen worden gelezen van SD-kaart * Raadpleeg naar SurtrTech.com voor meer details */#include  // Core graphics library#include  // Hardwarespecifieke library#include #include  #include  //Aanraakschermfuncties bibliotheek#if gedefinieerd(__SAM3X8E__) #undef __FlashStringHelper::F(string_literal) #define F(string_literal) string_literal#endif//De onderstaande parameters zijn afhankelijk van uw schild, dus zorg ervoor dat de pinnen zijn correct#define YP A3 // moet een analoge pin zijn, gebruik "An"-notatie! #define XM A2 // moet een analoge pin zijn, gebruik "An"-notatie!#define YM 9 // kan een digitale pin zijn#define XP 8 // kan een digitale pin zijn//Vergeet niet als uw aanraakfunctie niet werkt, controleer dan de bovenstaande waarden (A1 A2 7 6) resp// Kalibreer de waarden die u kunt gebruiken om eerst de kalibratiecode uit te voeren en die punten in te stellen#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 // Chip Select gaat naar Analoog 3#define LCD_CD A2 // Commando/Data gaat naar Analoog 2#define LCD_WR A1 // LCD Write gaat naar Analoog 1#define LCD_RD A0 // LCD Read gaat naar Analoog 0# definieer SD_CS 10 // Stel de chipselectieregel in op wat u ook gebruiktAdafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, A4);char x[]="x1.bmp";/*Hier in deze code heb ik de namen gedeclareerd als een Array * Zodat ik aanpassingen kan doen als ik er doorheen wil scrollen * Zorg ervoor dat je afbeeldingen een nummer hebben zoals "1", zodat je het kunt verhogen of verlagen * om naar de volgende afbeelding te gaan */void setup(){ Serial.begin( 9600); tft.reset(); uint16_t identifier =tft.readID(); pinMode (10, UITGANG); digitalWrite (10, HOOG); tft.begin(identificatie); if (!SD.begin(SD_CS)) { progmemPrintln(PSTR("mislukt!")); opbrengst; } tft.setRotatie(1); // Om een ​​90-rotatie van het scherm te doen bmpDraw (x, 0, 0); // we tekenen de eerste afbeelding die x -> "x1.bmp" is zoals we verklaarden}void loop(){if(x[1]<49) //Dus we gaan niet naar enkele vreemde waarden die ik hier toevoeg een reset van de waardenx[1]=49; //Als we al op de eerste foto staan, blijven we daar, hetzelfde geldt voor de lastif(x[1]>52) //"1" in char is "49" en "4" is "52" Ik schreef ze in dit formaat zodat ik ze kan manipulerenx[1]=52; TSPoint p =ts.getPoint(); // controleren of de gebruiker het scherm heeft aangeraakt pinMode (XM, OUTPUT); pinMode (YP, UITGANG); if (pz> MINPRESSURE &&pz  0 &&py <100 ){ Serial.println("Links"); // Ik deed dit om op de seriële monitor te laten zien dat ik op links x [1]=x[1]-1 heb gedrukt; // hier veranderen we de naam van het bestand dat we willen lezen x[]="x1.bmp" en x[1] is de 1 in de naam en x[0] is x bmpDraw(x, 0, 0); //Dus wat ik doe is het gewoon verhogen om het 2 te maken of het verlagen om het 0 te maken (raadpleeg de eerste "als" om de oplossing voor dit geval te zien, aangezien 0 niet bestaat) delay(300); //Vervolgens teken ik de afbeelding die nu een andere naam heeft, afhankelijk van aan welke kant ik heb gedrukt } // Een kleine vertraging toevoegen zodat de aanraakdetectie niet anders zal stuiteren if(py>200 &&py <320){ Serial.println("Right "); x[1]=x[1]+1; bmpDraw(x, 0, 0); vertraging (300); } } }#define BUFFPIXEL 20 // Afdruksnelheid 20 is bedoeld als de beste, je kunt naar 60 gaan maar te veel RAM//tekenfunctie gebruiken is niet gevoelig :Dvoid bmpDraw(char *bestandsnaam, int x, int y) { Bestand bmpBestand; int bmpBreedte, bmpHoogte; // B+H in pixels uint8_t bmpDepth; // Bitdiepte (moet momenteel 24 zijn) uint32_t bmpImageoffset; // Begin van afbeeldingsgegevens in bestand uint32_t rowSize; // Niet altijd =bmpWidth; heeft mogelijk opvulling uint8_t sdbuffer [3*BUFFPIXEL]; // pixel in buffer (R+G+B per pixel) uint16_t lcdbuffer [BUFFPIXEL]; // pixel uit buffer (16-bits per pixel) uint8_t buffidx =sizeof(sdbuffer); // Huidige positie in sdbuffer boolean goodBmp =false; // Ingesteld op true op geldige header parse boolean flip =true; // BMP wordt van onder naar boven opgeslagen int w, h, rij, col; uint8_t r, g, b; uint32_t pos =0, startTime =millis(); uint8_t lcdidx =0; boolean eerst =waar; if((x>=tft.width()) || (y>=tft.height())) return; Serieel.println(); progmemPrint(PSTR("Beeld laden '")); Serial.print(bestandsnaam); Serieel.println('\''); // Open het gevraagde bestand op SD-kaart if ((bmpFile =SD.open(bestandsnaam)) ==NULL) { progmemPrintln (PSTR ("Bestand niet gevonden")); opbrengst; } // BMP-header ontleden if (read16 (bmpFile) ==0x4D42) { // BMP-handtekening progmemPrint (PSTR ("Bestandsgrootte:")); Serial.println(read32(bmpFile)); (void)read32(bmpFile); // Lezen en negeren schepper bytes bmpImageoffset =read32 (bmpFile); // Start van beeldgegevens progmemPrint(PSTR("Image Offset:")); Serial.println(bmpImageoffset, DEC); // Lees DIB-header progmemPrint (PSTR ("Headergrootte:")); Serial.println(read32(bmpFile)); bmpWidth =read32(bmpFile); bmpHeight =read32(bmpFile); if(read16(bmpFile) ==1) { // # planes -- moet '1' zijn bmpDepth =read16(bmpFile); // bits per pixel progmemPrint (PSTR ("Bitdiepte:")); Serial.println(bmpDepth); if((bmpDepth ==24) &&(read32(bmpFile) ==0)) { // 0 =ongecomprimeerd goodBmp =true; // Ondersteund BMP-formaat -- ga verder! progmemPrint(PSTR("Afbeeldingsgrootte:")); Serial.print(bmpWidth); Serieel.print('x'); Serial.println(bmpHeight); // BMP-rijen worden opgevuld (indien nodig) tot 4-byte grens rowSize =(bmpWidth * 3 + 3) &~3; // Als bmpHeight negatief is, staat de afbeelding in de volgorde van boven naar beneden. // Dit is geen canon, maar is in het wild waargenomen. if(bmpHeight <0) { bmpHeight =-bmpHeight; omdraaien =onwaar; } // Te laden gewasgebied w =bmpWidth; h =bmpHoogte; if((x+w-1)>=tft.breedte()) w =tft.breedte() - x; if((y+h-1)>=tft.height()) h =tft.height() - y; // Stel TFT-adresvenster in op geknipte beeldgrenzen tft.setAddrWindow(x, y, x+w-1, y+h-1); for (rij=0; rij=sizeof(sdbuffer)) { // Indeed // Push LCD buffer eerst naar het scherm if (lcdidx> 0) { tft.pushColors(lcdbuffer, lcdidx, first); lcdidx =0; eerste =onwaar; } bmpFile.read(sdbuffer, sizeof(sdbuffer)); buffx =0; // Stel index in op begin} // Converteer pixel van BMP naar TFT-formaat b =sdbuffer [buffidx++]; g =sdbuffer[buffidx++]; r =sdbuffer[buffidx++]; lcdbuffer[lcdidx++] =tft.color565(r,g,b); } // end pixel } // end scanline // Schrijf alle resterende gegevens naar LCD if (lcdidx> 0) { tft.pushColors (lcdbuffer, lcdidx, first); } progmemPrint(PSTR("Geladen in")); Serial.print(millis() - startTime); Serial.println ("ms"); } // end goodBmp } } bmpFile.close(); if(!goodBmp) progmemPrintln(PSTR("BMP-formaat niet herkend."));}// Deze lezen 16- en 32-bits typen uit het SD-kaartbestand.// BMP-gegevens worden little-endian opgeslagen, Arduino is klein -endian too.// Mogelijk moet de subscriptvolgorde worden omgekeerd als u elders porteert.uint16_t read16(File f) { uint16_t result; ((uint8_t *)&result)[0] =f.lezen(); // LSB ((uint8_t *)&result)[1] =f.read(); // MSB retourneert resultaat;} uint32_t read32 (File f) { uint32_t resultaat; ((uint8_t *)&result)[0] =f.lezen(); // LSB ((uint8_t *)&result)[1] =f.read(); ((uint8_t *)&result)[2] =f.read(); ((uint8_t *)&result)[3] =f.read(); // MSB-retourresultaat;}// Kopieer string van flash naar seriële poort// Bronstring MOET in een PSTR()-declaratie staan!void progmemPrint(const char *str) { char c; while(c =pgm_read_byte(str++)) Serial.print(c);}// Hetzelfde als hierboven, met als laatste newlinevoid progmemPrintln(const char *str) { progmemPrint(str); Serieel.println();}

Schema's

Het is een schild :D

Productieproces

  1. Wenskaart
  2. Creditcard
  3. Liquid Crystal Display (LCD)
  4. DATA MODUL:23,1-inch ultra-uitgerekt TFT-scherm met slimme bediening
  5. Distec:robuust, in zonlicht afleesbaar 7-inch TFT-scherm van Ortustech
  6. Toegang:GPU-PC verbetert prestaties van grafische kaart
  7. Expositie:The Primal Display
  8. Kuman TFT 3.5 RetroPie 2018
  9. AI genereert afbeeldingen van een voltooide maaltijd op basis van een eenvoudig op tekst gebaseerd recept
  10. Bitmap-animatie op ILI9341 TFT Touchscreen Display Shield
  11. Ontwijk de Defs!