Caricamento file da SD ….. Adafruit 2.8 tft shield

Salve, ringrazio in anticipo tutti quelli che con pazienza mi aiuteranno a risolvere il mio problema e chiedo venia per la mia incompetenza ma sono proprio alle prime armi con arduino.

Mediante lo shield Adafruit TFT 2.8, vorrei creare uno slide di foto, le immagini sono salvate all'interno della SD presente già nello shield e hanno tutta la stessa base come nome es…. foto1.bmp, foto2.bmp, foto3,bmp, ecc ecc se scrivo l'istruzione base tutto funziona bene:

…..
 bmpDraw("foto1.bmp", 0, 0);
}

#define BUFFPIXEL 20
void bmpDraw(char *filename, uint8_t x, uint16_t y) {
  File     bmpFile;
  int      bmpWidth, bmpHeight;   // W+H in pixels
  uint8_t  bmpDepth;              // Bit depth (currently must be 24)
  uint32_t bmpImageoffset;        // Start of image data in file
  uint32_t rowSize;               // Not always = bmpWidth; may have padding
  uint8_t  sdbuffer[3*BUFFPIXEL]; // pixel buffer (R+G+B per pixel)
  uint8_t  buffidx = sizeof(sdbuffer); // Current position in sdbuffer
 ecc ecc…

Le foto dovrebbero caricarsi in sequenza avanti o indietro per esempio premendo due pulsati.. allora ho pensato di creare una variabile numerica che aumenta o diminuisce il suo valore a seconda del pulsante premuto e successivamente creare una variabile che si compone e forma una variabile con il nome del file da caricare:

String nomebase = "foto";                
int numero =  1;            // questa varia al premere dei pulsanti
String tipofile =  ".bmp";    
String nomefile =  nomebase + numero + tipofile;      // compongo il file da caricare

 bmpDraw(nomefile, 0, 0);
}

il problema è che l'istruzione dopo:

void bmpDraw(char *filename, uint8_t x, uint16_t y) {

non funziona e mi da errore e non so come risolverlo……

Spero di essere stato chiaro, grazie a tutti e buon lavoro…. Ciao Marco

ps: questo è il prodotto adafruit montato su arduino one http://www.adafruit.com/product/1651

Hai già seguito questo tutorial → Overview | Adafruit 2.8" TFT Touch Shield v2 - Capacitive or Resistive | Adafruit Learning System ?

ho letto quel documento e ho cerca anche su internet ma non ho trovato nulla…
Il problema non è se nell’istruzione
bmpDraw(“foto1.bmp”, 0, 0);

dichiaro il nome del file, dopo funziona tutto bene il problema è quando sostituisco la stringa
“foto1.bmp” con la mia variabile nomefile che l’istruzione dopo
void bmpDraw(char *filename, uint8_t x, uint16_t y) {
mi da errore e si blocca tutto……

Forse perché i due tipi di dati non sono compatibili. :sweat_smile:

marchino283: Salve,

Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni e a leggere il regolamento: Regolamento - qui una serie di schede by xxxPighi per i collegamenti elettronici vari: ABC - Arduino Basic Connections - qui le pinout delle varie schede by xxxPighi: Pinout - qui una serie di link [u]generali[/u] utili: Link Utili

Il codice deve essere racchiuso nei tag code, vedi sezione 7 del regolamento, spiega bene come fare, altrimenti parte del codice può essere visualizzato male o in maniera parziale.

Come detto da @PaoloP, leggi bene cosa vuole l'istruzione:

void bmpDraw(char *filename, ...

Vuole un puntatore a vettore/array di caratteri terminato da carattere null '\0' ovvero una stringa classica del C. Tu invece stai usando String che è un oggetto tipico del C++ e non sono compatibili.

chiedo scusa per la presentazione che avevo fatto effettivamente non avevo scritto nulla sulle mie "non" competenze provvederò a implemetarla… provo a studiarmi il link che mi hai inviato….

Usa la funzione snprintf(), serve per "stampare" non a video ma dentro a un array di char:

int numero=1;
char nomefile[21];   // numero caratteri validi + 1 char fine stringa '\0'
....
snprintf(nomefile,sizeof(nomefile),"foto%d.bmp",numero);
drawBitmap(nomefile,0,0);

Quindi la snprintf() stampa dentro a nomefile "foto1.bmp" quando numero=1 Se vuoi fare una cosa migliore, chiama le foto con progressivo di 3 cifre, tipo: foto001.bmp, foto002,bmp, foto003.bmp. Allora la snprintf diventa:

snprintf(nomefile,sizeof(nomefile),"foto%03d.bmp",numero);

grazie mille, ho provato velocemente ma dovrei avere fatto un errore di sintassi oppure mi sono dimenticato qualcosa…

provaimage:11: error: expected constructor, destructor, or type conversion before '(' token provaimage.ino: In function 'void loop()': provaimage:28: error: 'drawBitmap' was not declared in this scope

ma ci studio sopra….

int numero =  1;            
char nomefile[21];   // numero caratteri validi + 1 char fine stringa '\0'
snprintf(nomefile,sizeof(nomefile),"foto%03d.bmp",numero);
void setup(void) {
  Serial.begin(9600);
  tft.begin();
  tft.fillScreen(ILI9341_WHITE);
  Serial.print(F("Initializing SD card..."));
  if (!SD.begin(SD_CS)) {
    Serial.println(F("failed!"));
  }
  Serial.println(F("OK!"));
  Serial.println(nomefile);
}
void loop() {

  drawBitmap(nomefile,0,0);

Controlla maiuscole e minuscole nel nome della funzione. Il C è molto sensibile a questo aspetto. bitMap e bitmap sono considerati due elementi diversi.

ho guardato e riguardato la sintassi è giusta forse manca qualcosa…. prima dell’istruzione snprintf

#include <Adafruit_GFX.h>    // Core graphics library
#include "Adafruit_ILI9341.h" // Hardware-specific library
#include <SPI.h>
#include <SD.h>
#define TFT_DC 9
#define TFT_CS 10
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
#define SD_CS 4
int numero =  1;            
char nomefile[21];   // numero caratteri validi + 1 char fine stringa '\0'
snprintf(nomefile, sizeof(nomefile),"foto%03d.bmp", numero);
void setup(void) {
  Serial.begin(9600);
  tft.begin();
  tft.fillScreen(ILI9341_WHITE);
  Serial.print(F("Initializing SD card..."));
  if (!SD.begin(SD_CS)) {
    Serial.println(F("failed!"));
  }
  Serial.println(F("OK!"));
  Serial.println(nomefile);
  
}
void loop() {

  drawBitmap(nomefile,0,0);

Si chiama bmpDraw("foto1.bmp", 0, 0); e non drawBitmap("foto1.bmp", 0, 0); Ti ho fuorviato io :D

purtroppo l'errore è prima:

snprintf(nomefile, sizeof(nomefile),"foto%03d.bmp", numero);

ho provato ma sempre uguale e some sintassi di quella riga è giusta perché ho cercato i riferimenti….

Beh, la snprintf() è una istruzione, non puoi metterla fuori da setup() oppure fuori da loop()

Fuori ci possono stare solo le dichiarazioni delle variabili.

FUNZIONA….. grazie mille, lo avevo pure letto in una guida la questione della variabili….

Fermi mi sono sbagliato… il nome del file lo creare benissimo ma non trova il file, chiaramente il file c'è e viene caricato regolarmente se scritto tra virgolette….

Fai una bella Serial.println(nomefile); per verificare il nome del file sia creato giusto. Dall'ultimo codice il file deve essere foto001.bmp e non foto1.bmp sicuro di come è il file ?

Si ho provato e il nome file viene visualizzato giusto nel monitor seriale. Solo per curiosità ho provato a creare una array tipo:

 char* imageList[] = {"foto001.bmp", "foto002.bmp",ecc ecc

e così funziona ma dato che non so quante sono le foto la cosa non mi ispirava molto...

Prova ad aggiungere al fondo del nome file un fine stringa

snprintf(nomefile,sizeof(nomefile),"foto%03d.bmp\0",numero);

Se questa sintassi non gli piace, allora

snprintf(nomefile,sizeof(nomefile),"foto%03d.bmp%c",numero,'\0');

Purtroppo nulla in nessuno dei 2 modi….