Ciao ragazzi, ho un problema a caricare un array di stringhe con i nomi dei files letti da una schedina SD .
Carico l'array con i nomi dei files, usando indici diversi (prima 0 e poi 1).
Quando stampo l'array in tutti gli indici c'è sempre l'ultimo nome file!
Qualcuno mi sa dire dove sbaglio?
Questo è l'output:
Test
VS1053 found
Caricamento Array
TRACK002.MP3
TRACK001.MP3
Stampa Array
TRACK001.MP3
TRACK001.MP3
Uso Arduino UNO
grazie!
#include <SPI.h> //scheda SD
#include <Adafruit_VS1053.h> //Lettore musicale
#include <SD.h> //scheda SD
#define BREAKOUT_RESET 9 // VS1053 reset pin (output)
#define BREAKOUT_CS 10 // VS1053 chip select pin (output)
#define BREAKOUT_DCS 8 // VS1053 Data/command select pin (output)
#define SHIELD_RESET -1 // VS1053 reset pin (unused!)
#define SHIELD_CS 7 // VS1053 chip select pin (output)
#define SHIELD_DCS 6 // VS1053 Data/command select pin (output)
#define CARDCS 4 // Card chip select pin
#define DREQ 3 // VS1053 Data request, ideally an Interrupt pin
Adafruit_VS1053_FilePlayer musicPlayer = Adafruit_VS1053_FilePlayer(SHIELD_RESET, SHIELD_CS, SHIELD_DCS, DREQ, CARDCS);
char *myStrings[6];
File MyFile;
void setup() {
Serial.begin(9600);
Serial.println("Test");
if (! musicPlayer.begin()) { // initialise the music player
Serial.println(F("Couldn't find VS1053, do you have the right pins defined?"));
while (1);
}
Serial.println(F("VS1053 found"));
if (!SD.begin(CARDCS)) {
Serial.println(F("SD failed, or not present"));
while (1); // don't do anything more
}
Serial.println("Caricamento Array");
MyFile = SD.open("TRACK002.MP3", FILE_READ );
if (MyFile) {
myStrings[0] = MyFile.name();
Serial.println(myStrings[0]);
MyFile.close();
}
MyFile = SD.open("TRACK001.MP3", FILE_READ );
if (MyFile) {
myStrings[1] = MyFile.name();
Serial.println(myStrings[1]);
MyFile.close();
}
Serial.println("Stampa Array");
Serial.println(myStrings[0]);
Serial.println(myStrings[1]);
}
void loop() {
}
Buongiorno,
essendo il tuo primo post nella sezione Italiana del forum, nel rispetto del regolamento di detta sezione (… punto 13, primo capoverso), ti chiedo cortesemente di presentartiIN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzionetutto il su citato REGOLAMENTO ... Grazie.
Guglielmo
P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread, nessuno ti potrà rispondere, quindi ti consiglio di farla al più presto.
questo puntatore contiene "valori" diversi in momenti diversi ma è lo stesso spazio di memoria...quindi quando alla fine stampi il contenuto puntato dalla tua array in realtà stampi lo stesso, ultimo, contenuto del MyFile.name().
per risolvere dovresti crearti un array di stringhe; e passare il nome che in quel momento ha MyFile.name() tramite una funzione di string.h del tipo:
Ciao, grazie dei suggerimenti.
L'esempio è solo per spiegare la necessità.
Il mio scopo è caricare in un array di stringhe il contenuto di una
directory della scheda SD.
Continuo a provare
Ciao
Ciao Andrea,
adesso , basandomi sul suggerimento di Standardoil, sembra funzionare, anche se con solo due righe dell'array. Dovrò implementare un loop sulla directory per gestire tante righe.
Sarebbe ben accetto un consiglio su come caricare in un array con centinaia di nomi (vista la poca memoria di Arduino Uno).
Grazie mille
ciao
Il codice attuale funzionante quindi è il seguente:
#include <SPI.h> //scheda SD
#include <Adafruit_VS1053.h> //Lettore musicale
#include <SD.h> //scheda SD
#define BREAKOUT_RESET 9 // VS1053 reset pin (output)
#define BREAKOUT_CS 10 // VS1053 chip select pin (output)
#define BREAKOUT_DCS 8 // VS1053 Data/command select pin (output)
#define SHIELD_RESET -1 // VS1053 reset pin (unused!)
#define SHIELD_CS 7 // VS1053 chip select pin (output)
#define SHIELD_DCS 6 // VS1053 Data/command select pin (output)
#define CARDCS 4 // Card chip select pin
#define DREQ 3 // VS1053 Data request, ideally an Interrupt pin
Adafruit_VS1053_FilePlayer musicPlayer = Adafruit_VS1053_FilePlayer(SHIELD_RESET, SHIELD_CS, SHIELD_DCS, DREQ, CARDCS);
char myStrings[6][20];
File MyFile;
void setup() {
Serial.begin(9600);
Serial.println("Test");
if (! musicPlayer.begin()) { // initialise the music player
Serial.println(F("Couldn't find VS1053, do you have the right pins defined?"));
while (1);
}
Serial.println(F("VS1053 found"));
if (!SD.begin(CARDCS)) {
Serial.println(F("SD failed, or not present"));
while (1); // don't do anything more
}
Serial.println("Caricamento Array");
MyFile = SD.open("TRACK002.MP3", FILE_READ );
if (MyFile) {
strcpy (myStrings[0], MyFile.name());
Serial.println(myStrings[0]);
MyFile.close();
}
MyFile = SD.open("TRACK001.MP3", FILE_READ );
if (MyFile) {
strcpy (myStrings[1], MyFile.name());
Serial.println(myStrings[1]);
MyFile.close();
}
Serial.println("Stampa Array");
Serial.println(myStrings[0]);
Serial.println(myStrings[1]);
}
void loop() {
}
Io per uno scopo del genere ci vedrei meglio una linked list, ma capisco che per un neofita possa essere ancora più complesso rispetto ad un array multidimensionale.
Caricare un centinaio di nomi nella memoria di un ATMega328 è fuori discussione: considerando il formato da 8.3 caratteri (più terminatore di stringa '\0'), per 100 nomi sono un totale di 1300 byte!
Ciao cotestatnt,
grazie per le informazioni.
Visto il limite di memoria forse potrei caricare nell'array, invece del nome file, la sua posizione nella directory (es file numero 1, 2, 3, ecc..) e poi aprire il file usando questa posizione invece del nome.
Ma qui sto proprio lavorando di fantasia...
ciao
Secondo me ti converrebbe fin da subito scegliere una MCU che abbia più SRAM a disposizione perché immagino ci vorrai mettere anche un display, pulsanti per la selezione e cose simili!?
Non che la cosa sia impossibile da fare con un Arduino Uno per carità... anzi facendo come ti dicevo prima, ovvero selezionando una manciata di file per volta non è nemmeno cosi complicato in fondo.
Grazie cotestatnt,
avrei allora bisogno di una scheda che abbia più SRAM ma anche con la stessa piedinatura di UNO, perchè la scheda audio che ho è una Shield che si colloca sopra a Arduino
direi poca fantasia
anche solo leggere un file_name per volta come in lista e caricarlo in un array sarebbe quello che vuoi fare tu
ma si può andare ancora oltre...
quante righe della lista si possono vedere, per volta, sul display?
capisci che se fossero solo una....
ma anche due o tre, richiederebbero al massimo tre elementi stringa, di al massimo 13 caratteri
avresti memoria a sufficienza
un pochino di fantasia mentre si fanno le cose...
la sola difficoltà sarebbe il "risalire" la lista
ma con, ancora una volta, l'applicazione di pensiero creativo
io sono convinto che si possa fare tranquillamente su una UNO
a proposito
se anche usassi una MEGA2560, ha "quasi" la stessa piedinatura della UNO
MA
i pin SPI sono spostati, servono solo 4 corti (CORTI) cavetti dupont F-F e si fa
ma passare a una MEGA2560 perché non si ha fantasia....
Ti ringrazio Standardoil per le tue considerazioni.
La fantasia aiuta, e la tecnica completa l'opera
Credo che resterò con il mio UNO e farò tante belle prove.
grazie
ciao
Con un display a 4 righe, potresti caricare di volta in volta 6 titoli in altrettanti array di caratteri numerati da 0 a 5: i 4 titoli visualizzati, il precedente e il successivo. Ogni volta che scorri giù, arretri di uno gli array copiando da 1 a 0, da 2 a 1, da 3 a 2, da 4 a 3, da 5 a 4 e metti in 5 il titolo nuovo. Come sempre, visualizzi da 1 a 4.