Salve,
Con un programma Python sono riuscito a scrivere su un file di testo i nomi dei file contenuti su una scheda SD. Poi, dato che sto sviluppando un progetto con la scheda DFPlayerMini collegata ad uno schermo lcd, voglio generare i titoli delle canzoni sullo schermo.
#include <LiquidCrystal.h>
#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
#include <SD.h>
LiquidCrystal lcd(10, 9, 8, 7, 6, 5);
SoftwareSerial mySoftwareSerial(12, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
#define DF_Busy 6
#define bottone_next 13
#define bottone_previous 3
int i = 0;
const int num_stringhe = 10;
const char* stringheCasuali[num_stringhe];
void leggiDaFile(const char* nomeFile) {
File file = SD.open(nomeFile);
if (file) {
for (int i = 0; i < num_stringhe; ++i) {
if (file.available()) {
stringheCasuali[i] = file.readStringUntil('\n').c_str();
} else {
break;
}
}
file.close();
} else {
Serial.println("Impossibile aprire il file " + String(nomeFile));
}
}
void setup() {
lcd.begin(16, 2);
pinMode(bottone_next, INPUT_PULLUP);
pinMode(bottone_previous, INPUT_PULLUP);
mySoftwareSerial.begin(9600);
Serial.begin(9600);
Serial.println();
Serial.println(F("DFRobot DFPlayer Mini Demo"));
Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)"));
if (!myDFPlayer.begin(mySoftwareSerial)) { //Use softwareSerial to communicate with mp3.
lcd.print(F("Unable to begin:"));
delay(5000);
lcd.clear();
lcd.print(F("1.Please recheck the connection!"));
delay(5000);
lcd.clear();
lcd.print(F("2.Please insert the SD card!"));
delay(5000);
lcd.clear();
while (true);
}
Serial.println(F("DFPlayer Mini online."));
myDFPlayer.volume(25);
myDFPlayer.play(1);
// Leggi le stringhe dal file "output.txt"
leggiDaFile("output.txt");
Serial.println("Lista stringhe caricate:");
for (int i = 0; i < num_stringhe; ++i) {
Serial.println(stringheCasuali[i]);
}
}
void loop() {
lcd.setCursor(0, 0);
lcd.print(stringheCasuali[i]);
int next = digitalRead(bottone_next);
int previous = digitalRead(bottone_previous);
if (next == HIGH) {
// ...
} else {
delay(150);
if (digitalRead(bottone_next) == LOW) {
Serial.println("Pressione prolungata del pulsante next!");
} else {
lcd.clear();
lcd.print(stringheCasuali[i]);
Serial.println("Singola pressione del pulsante next!");
i++;
}
while (digitalRead(bottone_next) == LOW) {
delay(10);
}
}
if (previous == HIGH) {
// ...
} else {
delay(150);
if (digitalRead(bottone_previous) == LOW) {
Serial.println("Pressione prolungata del pulsante previous!");
lcd.clear();
} else {
lcd.clear();
lcd.print(stringheCasuali[i]);
Serial.println("Singola pressione del pulsante previous!");
i--;
}
while (digitalRead(bottone_previous) == LOW) {
delay(10);
}
}
delay(200);
}
void printDetail(uint8_t type, int value) {
switch (type) {
case TimeOut:
Serial.println(F("Time Out!"));
break;
case WrongStack:
Serial.println(F("Stack Wrong!"));
break;
case DFPlayerCardInserted:
Serial.println(F("Card Inserted!"));
break;
case DFPlayerCardRemoved:
Serial.println(F("Card Removed!"));
break;
case DFPlayerCardOnline:
Serial.println(F("Card Online!"));
break;
case DFPlayerPlayFinished:
Serial.print(F("Number:"));
Serial.print(value);
Serial.println(F(" Play Finished!"));
break;
case DFPlayerError:
Serial.print(F("DFPlayerError:"));
switch (value) {
case Busy:
Serial.println(F("Card not found"));
break;
case Sleeping:
Serial.println(F("Sleeping"));
break;
case SerialWrongStack:
Serial.println(F("Get Wrong Stack"));
break;
case CheckSumNotMatch:
Serial.println(F("Check Sum Not Match"));
break;
case FileIndexOut:
Serial.println(F("File Index Out of Bound"));
break;
case FileMismatch:
Serial.println(F("Cannot Find File"));
break;
case Advertise:
Serial.println(F("In Advertise"));
break;
default:
break;
}
break;
default:
break;
}
}
Questo è l' intero codice. In seriale mi viene stampato: "Impossibile aprire il file output.txt". Il circuito è realizzato fisicamente quindi non posso inoltrare foto. Suggerimenti? Il file di testo è nella stessa cartella del file arduino.
import os
def print_files(directory_path, output_file_path):
with open(output_file_path, 'w') as output_file:
for filename in os.listdir(directory_path):
output_file.write(filename + '\n')
def main():
periferica = "D:\\" # Percorso della scheda SD, assicurati che sia corretto
output_file_path = "output.txt" # Percorso del file di output
try:
print_files(periferica, output_file_path)
print("Nomi dei file scritti su", output_file_path)
except Exception as e:
print("Si è verificato un errore:", e)
if __name__ == "__main__":
main()
I collegamenti a livello fisico assicuro che sono giusti. Scusate per tutto ciò. Grazie per l' aiuto.