Foto­schau mit TFT-Shield


Lese­zeit: 4 Minu­ten
Lösung

Ziel des Projekts

Es wird ein soge­nann­tes Shield ver­wen­det, es wird ein­fach auf den Ardui­no UNO R3/UNO R4 auf­ge­steckt. Das dar­auf mon­tier­te TFT ver­fügt über 320×240 Pixel.
Auf die Mini-SD-Kar­te wer­den Fotos gespei­chert, sie wer­den mit einem dazu gehö­ri­gen Text auf dem TFT angezeigt.

Das Pro­gramm funk­tio­niert nur mit einem Shield, das die Stan­dard-Pins (⇒SPI: 10 und 9 und SD-CS: 4) ver­wen­det.
Der UNO R3 ist für die­ses Shield inso­fern nur bedingt geeig­net, weil er auf­grund des limi­tier­ten Spei­chers nur eine begrenz­te Anzahl von Fotos anzei­gen kann.

Dane­ben gibt es auch TFTs mit par­al­le­lem Anschluss, sie kön­nen mit die­sem Pro­gramm nicht ver­wen­det wer­den. Für den UNO R3 sind sie aber die bes­se­re Wahl, weil sie die Fotos ein­zeln Pixel für Pixel lesen und anzei­gen.
Hier sind die Pins für den Anschluss an den Ardui­no UNO auf die ana­lo­gen Pins gelegt.

Bei­spiel­pro­gramm

Das Pro­gramm im Film

Benö­tig­te Bibliotheken

Fotos zum Download

koeln.bmpoverath_bahnhof.bmplindos.bmpbraunwald.bmpdresden_frauenkirche.bmp
chartres.bmpstrand.bmpberlin_olympia.bmpuni_bonn.bmpduenen_ibiza.bmp
st_michelle.bmpijlst.bmpmonschau.bmpgaios.bmpkoeln_deutz.bmp

Fotos erstel­len

Du benö­tigst eine Mini-SD-Kar­te, sie muss mit FAT-32 for­ma­tiert sein. Bei neu gekauf­ten SD-Kar­ten ist das in der Regel der Fall. Fotos dür­fen maxi­mal das For­mat von 320×240 Pixeln haben und müs­sen im For­mat bmp vor­lie­gen. Du kannst belie­bi­ge Fotos ska­lie­ren und ent­spre­chend abspeichern.

Ich ver­wen­de hier­zu das Pro­gramm GIMP. Beach­te die not­wen­di­gen Ein­stel­lun­gen beim Spei­chern des Bildes.

Natür­lich darf das Bild auch klei­ner als 320×240 Pixel sein. Bei der Funk­ti­on drawBMP kannst du die Start­po­si­ti­on auf der x- und y-Ach­se festlegen.

Wegen des gerin­gen Spei­chers kann der UNO R3 maxi­mal etwa 14 Bil­der anzei­gen. Die­se Beschrän­kung fällt beim UNO R4 weg.
Aller­dings führt die Kom­pi­la­ti­on hier zu einer Fehlermeldung:

fatal error: wiring_private.h: No such file or directory

Du musst im Ver­zeich­nis Arduino/libraries/Adafruit_ILI9341 mit einem Text­edi­tor die Datei Adafruit_ILI9341.cpp öff­nen.
Erset­ze die Zei­len 52-54

#ifndef RASPI
#include "wiring_private.h"
#endif

durch

#if defined(__has_include)
#if __has_include("wiring_private.h")
#include "wiring_private.h"
#endif  // __has_include("wiring_private.h")
#else  //defined(__has_include)
#include "wiring_private.h"
#endif  //defined(__has_include)

Quel­le: 🔗https://​forum​.ardui​no​.cc/​t​/​c​o​m​p​i​l​a​t​i​o​n​-​e​r​r​o​r​-​w​i​r​i​n​g​-​p​r​i​v​a​t​e​-​h​-​n​o​-​s​u​c​h​-​f​i​l​e​-​o​r​-​d​i​r​e​c​t​o​r​y​/​1​1​4​6​7​5​2/2

Das Pro­gramm

#include "Adafruit_ILI9341.h"
#include "SdFat.h"
#include "Adafruit_ImageReader.h"

// CS-Pin SD-Karte
#define SD_CS 4    

// Pins TFT
#define TFT_CS 10  
#define TFT_DC 9   

// Dateisystem SD-Karte
SdFat SD;              

// Objekt des Kartenlesers wird an das Dateisystem der SD-Karte übertragen
Adafruit_ImageReader reader(SD);

Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
Adafruit_Image Bild;  

ImageReturnCode Status;

int Intervall = 2000;

void setup() 
{
  // TFT starten
  tft.begin();

  // SD-Karte starten
  SD.begin(SD_CS);

  tft.setRotation(3);  
  tft.fillScreen(0);
  tft.setTextSize(2);
  tft.setTextColor(ILI9341_WHITE);
}

void loop() 
{
  // Bild laden
  // alle Dateien befinden sich im root-Verzeichnis /
  Status = reader.loadBMP("/koeln.bmp", Bild);

  // Bild anzeigen
  // Parameter: Dateiname, tft, StartpositionX, StartpositionY
  reader.drawBMP("koeln.bmp", tft, 0, 0);
  tft.setCursor(10, 220);
  tft.print("K");

  // ö = 0x94
  tft.write(0x94);
  tft.println("ln");
  delay(Intervall);  
  tft.fillScreen(0);

  Status = reader.loadBMP("/dresden_bruecke.bmp", Bild);
  reader.drawBMP("dresden_bruecke.bmp", tft, 0, 0);
  tft.setCursor(10, 220);
  tft.println("Dresden 'Blaues Wunder'");
  delay(Intervall);
  tft.fillScreen(0);

  Status = reader.loadBMP("/overath_Bahnhof.bmp", Bild);
  reader.drawBMP("overath_Bahnhof.bmp", tft, 0, 0);
  tft.setCursor(10, 220);
  tft.println("Overath Bahnhof");
  delay(Intervall);
  tft.fillScreen(0);

  Status = reader.loadBMP("/dresden_frauenkirche.bmp", Bild);
  reader.drawBMP("dresden_frauenkirche.bmp", tft, 0, 0);
  tft.setCursor(10, 220);
  tft.println("Dresden Frauenkirche");
  delay(Intervall);
  tft.fillScreen(0);

  Status = reader.loadBMP("/braunwald.bmp", Bild);
  reader.drawBMP("braunwald.bmp", tft, 0, 0);
  tft.setCursor(10, 220);
  tft.println("Braunwald/Schweiz");
  delay(Intervall);
  tft.fillScreen(0);

  Status = reader.loadBMP("/chartres.bmp", Bild);
  reader.drawBMP("chartres.bmp", tft, 0, 0);
  tft.setCursor(10, 220);
  tft.println("Chartres Kathedrale");
  delay(Intervall);
  tft.fillScreen(0);

  Status = reader.loadBMP("/strand.bmp", Bild);
  reader.drawBMP("strand.bmp", tft, 0, 0);
  tft.setCursor(10, 220);
  tft.println("Strand Algarve");
  delay(Intervall);
  tft.fillScreen(0);

  Status = reader.loadBMP("/duenen_ibiza.bmp", Bild);
  reader.drawBMP("duenen_ibiza.bmp", tft, 0, 0);
  tft.setCursor(10, 220);
  tft.print("D");

  // ü = 0x81
  tft.write(0x81);
  tft.print("nen Ibiza");
  delay(Intervall);
  tft.fillScreen(0);

  Status = reader.loadBMP("/lindos.bmp", Bild);
  reader.drawBMP("lindos.bmp", tft, 0, 0);
  tft.setCursor(10, 220);
  tft.print("Lindos/Rhodos");
  delay(Intervall);
  tft.fillScreen(0);

  Status = reader.loadBMP("/see.bmp", Bild);
  reader.drawBMP("see.bmp", tft, 0, 0);
  tft.setCursor(10, 220);
  tft.print("See bei Innsbruck");
  delay(Intervall);
  tft.fillScreen(0);

  Status = reader.loadBMP("/uni_bonn.bmp", Bild);
  reader.drawBMP("uni_bonn.bmp", tft, 0, 0);
  tft.setCursor(10, 220);
  tft.print("Bonn Uni");
  delay(Intervall);
  tft.fillScreen(0);

  Status = reader.loadBMP("/berlin_olympia.bmp", Bild);
  reader.drawBMP("berlin_olympia.bmp", tft, 0, 0);
  tft.setCursor(10, 220);
  tft.print("Berlin Olympiastatdion");
  delay(Intervall);
  tft.fillScreen(0);
}

Letzte Aktualisierung: März 18, 2025 @ 12:22