[ RISOLTO ] Problemi con scrittura su SD card

Non riesco ad inserire i dati in un file txt , vi posto il codice

 String FileNome = "" ;
       
 String FileCognome = "" ;
      
       for ( int a = 0 ; a < valNome - 1 ; a++ ) {
        FileNome = FileNome + strNome[a] ;
       }
       
       for ( a = 0 ; a < valCognome - 1 ; a++ ) {
        FileCognome=FileCognome + strCognome[a];
       }

 File myFile = SD.open("Ingressi.txt", FILE_WRITE);

       if (myFile) {
           myFile.print ( FileNome );
           myFile.print ( " " ) ;
           myFile.println ( FileCognome ) ;
           myFile.close () ;
        }
  
  Serial.print(FileNome);
  Serial.print(" ");
  Serial.println (FileCognome);

In pratica ho due variabili string che contengono un nome ed un cognome che devo memorizzare su SD.
Il file ingressi esiste già sulla SD .
Le stringhe vengono create in modo corretto perchè su monitor seriale vedo esattamente il nome e cognome .
Sulla SD non viene neanche scritto "CIAO" se lo metto al posto di una delle stringhe

Quel codice non dice nulla, serve il resto ...

  • librerie usate
  • setup della sd
  • tipo di scheda sd e come è stata formattata
    ciao

Il codice è un po lungo , occupa l'80% della memoria di arduino . Posto la parte che interessa la scheda SD

Scheda SD 1GB formattata in fat32

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <SPI.h>
#include <SD.h>

 LiquidCrystal_I2C lcd ( 0x27 , 16 , 2 ) ; // 0x27 è l'inidirizzo dello schermo

 File myFile ;
void setup() {
  
   Serial.begin ( 9600 ) ; // Inizializzo una comunicazione seriale ( Solo per test . Disabilitato a completamento programma )
   SPI.begin() ; //Inizializzo la comunicazione SPI
   lcd.init() ; // Inizializzo lo schermo LCD
   lcd.backlight() ; // Accendo l'illuminazione del LCD

   int error = 0 ; // Variabile errore
   const int chipSelect = 10 ; // Pin SS per SD Card
   
   // controllo se c'è la SD
   if (!SD.begin(chipSelect)) { // Apro l'if di controllo presenza SD Card , se non è presente
      lcd.clear () ;
      lcd.print ( "Controllare o" );
      lcd.setCursor ( 0 , 1 ) ;
      lcd.print ( "inserire SD card" ) ;
      return;
   }
    // Se la Card è presente
      lcd.clear () ;
      lcd.print ( "    SD card" ) ;
      lcd.setCursor ( 0, 1 ) ;
      lcd.print ( "    presente" ) ;
      delay ( 2000 ) ;
      
      // Controllo se esiste già il file sulla SD Card
       if (SD.exists("ingressi.txt")) { 
        lcd.clear () ;
        lcd.print ( "      File" ) ;
        lcd.setCursor ( 0 , 1 ) ;
        lcd.print ( "    presente" ) ;
      }
    else { // se non esiste
      lcd.clear () ;
      lcd.print ( "    File non" ) ;
      lcd.setCursor ( 0 , 1 ) ;
      lcd.print ( "    esistente" ) ;
      delay ( 2000 ) ;
      lcd.clear () ;
      lcd.print ( "    Creazione" ) ;
      lcd.setCursor ( 0 , 1 ) ;
      lcd.print ( "    File " ) ;
      myFile = SD.open("ingressi.txt", FILE_WRITE); // creo il file
      myFile.close();
        if (SD.exists("ingressi.txt")) { // Controllo se è stato creato
        delay ( 2000 ) ;
        lcd.clear () ;
        lcd.print ( "  File creato" ) ;
        lcd.setCursor ( 0 , 1 ) ;
        lcd.print ( "  con successo" ) ;
        } 
    }
}

Fino a qui tutto bene , se non c'è la carta lo dice , se c'è ma non c'è il file lo crea e fa il controllo .
Ora se subito sotto inserisco

 myFile = SD.open ( "ingressi.txt" , FILE_WRITE ) ;

    if (myFile) {
      myFile.println ( " Ciao " ) ;
      myFile.close();
    }

Nel file viene scritto " Ciao "

Il problema sorge nella funzione che dovrebbe memorizzare i dati . Ho due stringhe conteneti un nome e cognome , es : cicco bello
Le variabili valNome/valCognome contengono il numero di caratteri che formano nome e cognome .

   int valNome = 5 ;
   int valCognome = 5 ;
   char strNome [18] ;        // Contiene Ciccio
   char strCognome [18] ;   // Contiene Bello 

       String FileNome = "" ;
       
       String FileCognome = "" ;
       

       int a ;
       for ( a = 0 ; a < valNome - 1 ; a++ ) {
        FileNome = FileNome + strNome[a] ;
       }
       
       for ( a = 0 ; a < valCognome - 1 ; a++ ) {
        FileCognome=FileCognome + strCognome[a];
       }
    
    myFile = SD.open ( "ingressi.txt" , FILE_WRITE ) ;

    if (myFile) {
      myFile.println (FileNome) ;
      myFile.close();
    
    lcd.clear();
    lcd.print( "Memorizzato");
    delay(2000);
    lcd.clear();
    
  
  }
  Serial.print(FileNome);
  Serial.print(" ");
  Serial.println (FileCognome);

In questo modo non appare la scritta " Memorizzato " e non viene scritto nulla nel file , però sul monitor seriale esce scritto Ciccio Bello .

Sembra come se myFile non venisse aperto per la scrittura

P.S. il codice di scrittura si trova in una function void memo ()

Ho eliminato un pezzo di di codice alla volta e pare che il problema sia l'azzeramento delle stringhe .

Eliminando

String FileNome = "" ;
       
 String FileCognome = "" ;

il file viene scritto ma mi ritrovo con un nome che si ripete aggiungendosi ad ogni operazione

CiccioCiccioCiccio BelloBelloBello

Ho risolto togliendo le sring e mettendo un ciclo for

     for ( a = 0 ; a < valNome ; a++ ) {
      myFile.print( (char) nome[a] );