Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

BMP-Bilder von SD-Karte auf TFT-LCD-Schild anzeigen

Komponenten und Verbrauchsmaterialien

Arduino UNO
× 1

Über dieses Projekt

Hallo, dieses Tutorial ist eine Fortsetzung der 2 anderen über das 2,4-Zoll-TFT-LCD-Schild mit Arduino UNO um verschiedene Formen zu zeichnen und wie man eine Touch-Taste erstellt, um einige Funktionen zu aktivieren…

Schnittstelle und Behebung von Berührungsproblemen in Arduino TFT 2.4″ LCD-Schild

TFT LCD 2,4″ Touchscreen-Schild-Tutorial

Aber heute geht es darum, Bilder von der SD-Karte zu lesen und auf dem Bildschirm anzuzeigen, vergessen Sie nicht, zuerst Ihre SD-Karte mit Ihrem Computer zu verbinden und als FAT32 zu formatieren, dann übertragen Sie Ihre Bilder nicht vergessen, dass sie es sein sollten „BMP“-Format, Bitmaps 24 !! Für ein korrektes Bild sollten die Auflösungen 240*320 betragen, kleine Erklärung:

Dies ist die normale Ausrichtung des Bildschirms Sie können Bilder von 240 * 320 anzeigen, dies ist die Standarddrehung, die setRotation(0) ist;

Dies ist die Ausrichtung des Bildschirms, wenn Sie setRotation(1); und jetzt können Sie Bilder von 320*240 anzeigen.

Sie können also wählen, was Ihnen gefällt, entweder die Bildschirmdrehung oder die Bilddrehung auf Ihrem PC ändern ... dann den Bildnamen merken oder kopieren und fertig, stecken Sie Ihre SD-Karte in das Schild.

Das sind die Namen meiner bmp 24-Bit-Bilder auf der SD-Karte für wie „Img1“ wir nennen es im Code mit „Img1.bmp“.

Bibliothek:

Dies ist die Bibliothek, die für mich funktioniert hat:Laden Sie hier herunter, wenn Sie diese Bibliothek verwenden, aber wenn Sie es mit Beispielcodes versuchen, zeigt sie Ihnen einen weißen Bildschirm, Sie sollten auf jeden Fall nach der Bibliothek suchen, die zu Ihnen passt.

Codes:

Hier sind die Codes, die ich im Video-in.ino-Format verwendet habe. Vergessen Sie nicht, den Namen der von Ihnen verwendeten Dateien zu ändern. Vergessen Sie nicht, das Tutorial zu lesen, falls Sie Hilfe benötigen.

  • Code 1
  • Code 2

Code

  • TFT_Shield_SD_1.ino
  • TFT_Shield_SD_2.ino
TFT_Shield_SD_1.inoArduino
/*Dieser Code ist für die Verwendung mit dem 2,4-Zoll-TFT-LCD-Touchscreen-Schild, er liest auf SD-Karte gespeicherte BMP-Bilder *und zeigt sie auf dem Bildschirm an *Weitere Informationen finden Sie auf SurtrTech.com */#include  // Kerngrafikbibliothek#include  // Hardwarespezifische Bibliothek#include #include #define LCD_CS A3 // Chip Select geht an Analog 3#define LCD_CD A2 // Command/Data geht an Analog 2#define LCD_WR A1 // LCD Write geht an Analog 1#define LCD_RD A0 // LCD Read geht an Analog 0#define SD_CS 10 //SD-Karten-Pin auf Ihrem SchildAdafruit_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("failed!")); return;} }void loop(){ bmpDraw("Logo.bmp", 0, 0); //Aufruf der bmpDraw-Funktion ("Name_of_your_image.bmp",x,y) (x,y) ist die Startposition des Bildes ng Verzögerung (2000); bmpDraw("Img2.bmp", 0, 0); Verzögerung (2000); bmpDraw("Img3.bmp", 0, 0); delay(2000);}#define BUFFPIXEL 20 //Zeichnungsgeschwindigkeit, 20 soll die beste sein, aber Sie können 60 verwenden, obwohl es viel RAM von Uno benötigt //Zeichnungsfunktion, liest die Datei von der SD-Karte und macht das // Konvertierung und Zeichnung, zeigt im Falle eines Problems auch Meldungen auf dem seriellen Monitor an // Keine Berührungsängste mit dieser Funktion :Dvoid bmpDraw(char *filename, int x, int y) { File bmpFile; int bmpWidth, bmpHeight; // W+H in Pixel uint8_t bmpDepth; // Bittiefe (muss derzeit 24 sein) uint32_t bmpImageoffset; // Beginn der Bilddaten in Datei uint32_t rowSize; // Nicht immer =bmpWidth; kann Auffüllen haben uint8_t sdbuffer[3*BUFFPIXEL]; // Pixel im Puffer (R+G+B pro Pixel) uint16_t lcdbuffer[BUFFPIXEL]; // Pixel-Out-Puffer (16-Bit pro Pixel) uint8_t buffidx =sizeof(sdbuffer); // Aktuelle Position in sdbuffer boolean goodBmp =false; // Bei gültigem Header-Parse auf true setzen boolean flip =true; // BMP wird von unten nach oben gespeichert int w, h, row, col; uint8_t r, g, b; uint32_t pos =0, startTime =millis(); uint8_t lcdidx =0; boolesch zuerst =wahr; if((x>=tft.width()) || (y>=tft.height())) zurück; Serial.println(); progmemPrint(PSTR("Bild wird geladen'")); Serial.print (Dateiname); Serial.println('\''); // Angeforderte Datei auf SD-Karte öffnen if ((bmpFile =SD.open(filename)) ==NULL) { progmemPrintln(PSTR("File not found")); Rückkehr; } // BMP-Header analysieren if(read16(bmpFile) ==0x4D42) { // BMP-Signatur progmemPrint(PSTR("Dateigröße:")); Serial.println (read32 (bmpFile)); (void)read32(bmpDatei); // Ersteller-Bytes lesen &ignorieren bmpImageoffset =read32(bmpFile); // Start der Bilddaten progmemPrint(PSTR("Image Offset:")); Serial.println (bmpImageoffset, DEC); // DIB-Header lesen progmemPrint(PSTR("Headergröße:")); Serial.println (read32 (bmpFile)); bmpWidth =read32(bmpDatei); bmpHeight =read32(bmpDatei); if(read16(bmpFile) ==1) { // # Ebenen -- muss '1' sein bmpDepth =read16(bmpFile); // Bits pro Pixel progmemPrint(PSTR("Bittiefe:")); Serial.println (bmpDepth); if((bmpDepth ==24) &&(read32(bmpFile) ==0)) {// 0 =unkomprimiert goodBmp =true; // Unterstütztes BMP-Format -- fortfahren! progmemPrint(PSTR("Bildgröße:")); Serial.print (bmpWidth); Serial.print ('x'); Serial.println (bmpHeight); // BMP-Zeilen werden (falls erforderlich) auf eine 4-Byte-Grenze aufgefüllt. rowSize =(bmpWidth * 3 + 3) &~3; // Wenn bmpHeight negativ ist, ist das Bild von oben nach unten. // Dies ist kein Kanon, wurde aber in freier Wildbahn beobachtet. if(bmpHeight <0) { bmpHeight =-bmpHeight; umdrehen =falsch; } // Zu ladender Zuschneidebereich w =bmpWidth; h =bmpHöhe; if((x+w-1)>=tft.width()) w =tft.width() - x; if((y+h-1)>=tft.height()) h =tft.height() - y; // TFT-Adressfenster auf abgeschnittene Bildgrenzen setzen tft.setAddrWindow(x, y, x+w-1, y+h-1); for (row=0; row=sizeof(sdbuffer)) {// In der Tat // Schieben Sie zuerst den LCD-Puffer auf die Anzeige if(lcdidx> 0) { tft.pushColors(lcbuffer, lcdidx, first); lcdidx =0; zuerst =falsch; } bmpFile.read(sdbuffer, sizeof(sdbuffer)); buffidx =0; // Index auf Anfang setzen } // Pixel vom BMP- in das TFT-Format konvertieren b =sdbuffer[buffidx++]; g =sdbuffer[buffidx++]; r =sdbuffer[buffidx++]; lcbuffer[lcdidx++] =tft.color565(r,g,b); } // Pixel beenden} // Scanline beenden // Alle verbleibenden Daten auf LCD schreiben if (lcdidx> 0) { tft.pushColors (lcbuffer, lcdidx, first); } progmemPrint(PSTR("Geladen in")); Serial.print (millis () - startTime); Serial.println("ms"); } // GoodBmp beenden } } bmpFile.close(); if(!goodBmp) progmemPrintln(PSTR("BMP-Format nicht erkannt."));}// Diese lesen 16- und 32-Bit-Typen aus der SD-Kartendatei.// BMP-Daten werden Little-Endian gespeichert, Arduino ist wenig -endian auch. // Muss möglicherweise die Indexreihenfolge umkehren, wenn woanders portiert wird.uint16_t read16(File f) { uint16_t result; ((uint8_t *)&result)[0] =f.read(); // LSB ((uint8_t *)&result)[1] =f.read(); // MSB Ergebnis zurückgeben;}uint32_t read32(Datei f) { uint32_t Ergebnis; ((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-Return-Ergebnis;} // String vom Flash zum seriellen Port kopieren // Quellstring MUSS innerhalb einer PSTR()-Deklaration sein!void progmemPrint(const char *str) { char c; while (c =pgm_read_byte (str++)) Serial.print (c);} // Wie oben, mit nachgestelltem newlinevoid progmemPrintln (const char *str) { progmemPrint (str); Serial.println();}
TFT_Shield_SD_2.inoArduino
/*Dieser Code ist für das 2,4-Zoll-TFT-LCD-Touchscreen-Schild mit UNO-Platine gedacht * Es wird eine kleine Diashow von Bildern erstellt, die sich ändert, je nachdem, wo Sie auf dem Bildschirm gedrückt haben * Die Bilder werden von der SD-Karte gelesen * Siehe auf SurtrTech.com für weitere Details */#include  // Kerngrafikbibliothek#include  // Hardwarespezifische Bibliothek#include #include  #include  //Touchscreen-Funktionen-Bibliothek#if define(__SAM3X8E__) #undef __FlashStringHelper::F(string_literal) #define F(string_literal) string_literal#endif//Die Parameter unten hängen von Ihrem Schild ab, also stellen Sie sicher, dass die Pins sind richtig#define YP A3 // muss ein analoger Pin sein, verwende "An"-Notation! #define XM A2 // muss ein analoger Pin sein, verwende "An"-Notation!#define YM 9 // kann ein digitaler Pin sein#define XP 8 // kann ein digitaler Pin sein // Vergessen Sie nicht, wenn Ihre Touch-Funktion nicht funktioniert, überprüfen Sie die obigen Werte (A1 A2 7 6) bzw.// Kalibrieren Sie die Werte, die Sie möglicherweise w Führen Sie zuerst den Kalibrierungscode aus und legen Sie diese Punkte fest#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 geht an Analog 3#define LCD_CD A2 // Command/Data geht an Analog 2#define LCD_WR A1 // LCD Write geht an Analog 1#define LCD_RD A0 // LCD Read geht an Analog 0# define SD_CS 10 // Setze die Chipauswahlzeile auf was auch immer du verwendestAdafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, A4);char x[]="x1.bmp";/*Hier in diesem Code habe ich die Namen als an . deklariert Array * Damit ich Änderungen vornehmen kann, wenn ich durchscrollen möchte * Stellen Sie sicher, dass Ihre Bilder eine Nummer wie "1" haben, damit Sie sie erhöhen oder verringern können * um zum nächsten Bild zu gehen */void setup () { Serial.begin ( 9600); tft.reset(); uint16_t Bezeichner =tft.readID(); pinMode (10, AUSGANG); digitalWrite (10, HOCH); tft.begin(Kennung); if (!SD.begin(SD_CS)) { progmemPrintln(PSTR("fehlgeschlagen!")); Rückkehr; } tft.setRotation(1); //Um eine 90-Drehung des Bildschirms auszuführen bmpDraw(x, 0, 0); //wir zeichnen das erste Bild, das x ist -> "x1.bmp", wie wir es deklariert haben}void loop(){if(x[1]<49) //Wir gehen also nicht zu seltsamen Werten, die ich hier hinzufüge ein Zurücksetzen der Werte x[1]=49; //Wenn wir schon im ersten Bild sind, bleiben wir dort, das gleiche gilt für das lastif(x[1]>52) //"1" in char ist "49" und "4" ist "52" Ich habe sie hineingeschrieben dieses Format, damit ich sie bearbeiten kannx[1]=52; TSPoint p =ts.getPoint(); // Überprüfen, ob der Benutzer den Bildschirm berührt hat pinMode (XM, OUTPUT); pinMode (YP, AUSGANG); if (pz> MINPRESSURE &&pz  0 &&py <100) {Serial.println("Links"); // Ich habe dies getan, um auf dem seriellen Monitor anzuzeigen, dass ich links x [1] =x [1]-1 gedrückt habe; //hier ändern wir den Namen der Datei, die wir lesen möchten x[]="x1.bmp" und x[1] ist die 1 im Namen und x[0] ist x bmpDraw(x, 0, 0); // Also, was ich mache, ist es einfach zu erhöhen, um es 2 zu machen, oder es zu verringern, um es 0 zu machen (siehe das erste "if", um die Lösung für diesen Fall zu sehen, da 0 nicht existiert) Verzögerung (300); // Dann zeichne ich das Bild, das jetzt einen anderen Namen hat, je nachdem, welche Seite ich gedrückt habe "); x[1]=x[1]+1; bmpDraw(x, 0, 0); Verzögerung (300); } } }#define BUFFPIXEL 20 //Druckgeschwindigkeit 20 soll die beste sein, Sie können bis 60 gehen, aber zu viel RAM verwenden // Zeichenfunktion nicht empfindlich :Dvoid bmpDraw(char *filename, int x, int y) { Datei bmpDatei; int bmpWidth, bmpHeight; // W+H in Pixel uint8_t bmpDepth; // Bittiefe (muss derzeit 24 sein) uint32_t bmpImageoffset; // Beginn der Bilddaten in Datei uint32_t rowSize; // Nicht immer =bmpWidth; kann Auffüllen haben uint8_t sdbuffer[3*BUFFPIXEL]; // Pixel im Puffer (R+G+B pro Pixel) uint16_t lcdbuffer[BUFFPIXEL]; // Pixel-Out-Puffer (16-Bit pro Pixel) uint8_t buffidx =sizeof(sdbuffer); // Aktuelle Position in sdbuffer boolean goodBmp =false; // Bei gültigem Header-Parse auf true setzen boolean flip =true; // BMP wird von unten nach oben gespeichert int w, h, row, col; uint8_t r, g, b; uint32_t pos =0, startTime =millis(); uint8_t lcdidx =0; boolesch zuerst =wahr; if((x>=tft.width()) || (y>=tft.height())) zurück; Serial.println(); progmemPrint(PSTR("Bild wird geladen'")); Serial.print (Dateiname); Serial.println('\''); // Angeforderte Datei auf SD-Karte öffnen if ((bmpFile =SD.open(filename)) ==NULL) { progmemPrintln(PSTR("File not found")); Rückkehr; } // BMP-Header analysieren if(read16(bmpFile) ==0x4D42) { // BMP-Signatur progmemPrint(PSTR("Dateigröße:")); Serial.println (read32 (bmpFile)); (void)read32(bmpDatei); // Ersteller-Bytes lesen &ignorieren bmpImageoffset =read32(bmpFile); // Start der Bilddaten progmemPrint(PSTR("Image Offset:")); Serial.println (bmpImageoffset, DEC); // DIB-Header lesen progmemPrint(PSTR("Headergröße:")); Serial.println (read32 (bmpFile)); bmpWidth =read32(bmpDatei); bmpHeight =read32(bmpDatei); if(read16(bmpFile) ==1) { // # Ebenen -- muss '1' sein bmpDepth =read16(bmpFile); // Bits pro Pixel progmemPrint(PSTR("Bittiefe:")); Serial.println (bmpDepth); if((bmpDepth ==24) &&(read32(bmpFile) ==0)) {// 0 =unkomprimiert goodBmp =true; // Unterstütztes BMP-Format -- fortfahren! progmemPrint(PSTR("Bildgröße:")); Serial.print (bmpWidth); Serial.print ('x'); Serial.println (bmpHeight); // BMP-Zeilen werden (falls erforderlich) auf eine 4-Byte-Grenze aufgefüllt. rowSize =(bmpWidth * 3 + 3) &~3; // Wenn bmpHeight negativ ist, ist das Bild von oben nach unten. // Dies ist kein Kanon, wurde aber in freier Wildbahn beobachtet. if(bmpHeight <0) { bmpHeight =-bmpHeight; umdrehen =falsch; } // Zu ladender Zuschneidebereich w =bmpWidth; h =bmpHöhe; if((x+w-1)>=tft.width()) w =tft.width() - x; if((y+h-1)>=tft.height()) h =tft.height() - y; // TFT-Adressfenster auf abgeschnittene Bildgrenzen setzen tft.setAddrWindow(x, y, x+w-1, y+h-1); for (row=0; row=sizeof(sdbuffer)) {// In der Tat // Schieben Sie zuerst den LCD-Puffer auf die Anzeige if(lcdidx> 0) { tft.pushColors(lcbuffer, lcdidx, first); lcdidx =0; zuerst =falsch; } bmpFile.read(sdbuffer, sizeof(sdbuffer)); buffidx =0; // Index auf Anfang setzen } // Pixel vom BMP- in das TFT-Format konvertieren b =sdbuffer[buffidx++]; g =sdbuffer[buffidx++]; r =sdbuffer[buffidx++]; lcbuffer[lcdidx++] =tft.color565(r,g,b); } // Pixel beenden} // Scanline beenden // Alle verbleibenden Daten auf LCD schreiben if (lcdidx> 0) { tft.pushColors (lcbuffer, lcdidx, first); } progmemPrint(PSTR("Geladen in")); Serial.print (millis () - startTime); Serial.println("ms"); } // GoodBmp beenden } } bmpFile.close(); if(!goodBmp) progmemPrintln(PSTR("BMP-Format nicht erkannt."));}// Diese lesen 16- und 32-Bit-Typen aus der SD-Kartendatei.// BMP-Daten werden Little-Endian gespeichert, Arduino ist wenig -endian auch. // Muss möglicherweise die Indexreihenfolge umkehren, wenn woanders portiert wird.uint16_t read16(File f) { uint16_t result; ((uint8_t *)&result)[0] =f.read(); // LSB ((uint8_t *)&result)[1] =f.read(); // MSB Ergebnis zurückgeben;}uint32_t read32(Datei f) { uint32_t Ergebnis; ((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-Return-Ergebnis;} // String vom Flash zum seriellen Port kopieren // Quellstring MUSS innerhalb einer PSTR()-Deklaration sein!void progmemPrint(const char *str) { char c; while (c =pgm_read_byte (str++)) Serial.print (c);} // Wie oben, mit nachgestelltem newlinevoid progmemPrintln (const char *str) { progmemPrint (str); Serial.println();}

Schaltpläne

Es ist ein Schild :D

Herstellungsprozess

  1. Grußkarte
  2. Kreditkarte
  3. Liquid Crystal Display (LCD)
  4. DATENMODUL:23,1-Zoll-Ultra-Stretch-TFT-Display mit intelligenter Steuerung
  5. Distec:robustes, sonnenlichttaugliches 7-Zoll-TFT-Display von Ortustech
  6. Zutritt:GPU-PC gewinnt Leistung durch Grafikkarte
  7. Ausstellung:Die Urausstellung
  8. Kuman TFT 3.5 RetroPie 2018
  9. KI erzeugt Bilder einer fertigen Mahlzeit aus einem einfachen textbasierten Rezept
  10. Weiche den Defs aus!