Lettura File e generazione a schermo lcd di stringhe

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.

Da quanto scrivi mi sembra di capire che tu metta il file di testo nella stessa cartella del tuo .ino (il file Arduino), ma NON è così che funziona ...

... Il file di testo DEVE trovarsi sulla SD Il file di testo DEVE trovarsi su una SD collegata ad Arduino ... è da li che avviene la lettura al momento dell'esecuzione, non dalla cartella dove c'è il .ino.

Se ho capito male allora spiega esattamente dove hai messo i files ... :roll_eyes:

Guglielmo

Se hai salvato il file output.txt sulla scheda SD del DFPlayerMini, non è possibile leggere il contenuto del file dall'Arduino.

... vero pure questo :grin: ... vedo che la libreria di DFRobot prevede un comando (il 0x4C) che è dichiarato come "Query current track in the micro SD card" ... ma, guardando i sorgenti, NON mi sembra ritorni il nome del file, probabilmente ritorna, come dice il nome, il NUMERO di traccia :roll_eyes:

Inoltre mi sa che ho scritto una stupidaggine, NON credo che il modulo sia in grado di seguire un file di testo con i vari brani, quindi è inutile metterlo sulla SD del player :roll_eyes:
Ho corretto il mio post #2 specificando che la SD con il file di testo deve essere collegata ad Arduino.

Guglielmo

... in pratica, si ha una SD sul player che contiene tutte le varie traccie e poi, volendo seguire un file che specifica le traccie da suonare e farle vedere su LCD, bisogna avere anche una SD collegata ad Arduino con detto file che si può quindi leggere dall'applicazione, visualizzare il titolo su LCD e ordinare la player di suonare la traccia collegata.

Guglielmo

Cerco di spiegarmi meglio. Io ho staccato la scheda dal DFPlayerMini, l' ho collegata al DFPlayerMini, ho eseguito il mio programma in Python che ha creato il file. Ho inserito la SD nel DF, poi ho eseguito grazie allo sketch il caricamento delle righe del file nella lista. Non è quindi possibile procedere con questa metodica?(Il file è inserito nella stessa cartella dello sketch, non sulla SD)

NO, il file è leggibile dal programma Arduino SOLO se risiede su un supporto esterno collegato ad esso (una SD o una memoria esterna). In particolare, per usare la gestione dei "Files" come stai facendo tu:

File file = SD.open(nomeFile);

... ci vuole ovviamente una SD collegata ad Arduino.

Guglielmo

Ma la mia metodica, cambiando codice, è fattibile?

Il lettore di schede SD nel modulo DFPlayer è controllato dall'MCU che funge da decodificatore MP3. Questo MCU comunica con l'Arduino tramite UART e riceve solo comandi di alto livello (play, pausa, stop, ...) e alcune richieste (volume, numero di file, ...). Non vi è alcun comando che permetta di leggere il contenuto di uno dei file e trasferire tale contenuto attraverso la porta seriale.

Quindi, ciò che vuoi fare è impossibile in questo modo.

Potresti generare una mappatura tra il numero del file e il nome della canzone e inserirla come codice compilato nell'applicazione, ma se cambi la scheda SD nel DFPlayer, non verranno considerate le nuove canzoni. Sarà necessario rigenerare la tabella di corrispondenza e ricompilare / ricaricare l'applicazione sul tuo Arduino.

Comunque, HIGH e LOW si usano per indicare livelli logici di ingressi e uscite. Negli altri casi si usano true e false, che valgono ugualmente 1 e 0 in Arduino, ma permettono di capire meglio il programma leggendolo.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.