Problema salvare dati su SD

Allora, io devo salvare sull’SD i dati (come testo) rilevati da un potenziometro ogni volta che faccio partire la registrazione tramite pulsante.
Il codice che ho sviluppato è questo:

#include <SD.h>
#define LED 2 
#define LEDREG 3
#define BUTTON 4              
 
int CS_pin = 10;
int val = 0;                    
int vecchio_val = 0;          
int stato = 0;                
int potentiometerPin = 0;  
int value = 0;

void setup() {                  
  pinMode(A0,INPUT);  
  pinMode(2,OUTPUT); 
  pinMode(3,OUTPUT);
  pinMode(BUTTON, INPUT);      
  pinMode(CS_pin, OUTPUT);
  SD.begin(CS_pin);
  Serial.begin(9600);

File myFile;
myFile = SD.open("test.txt", FILE_WRITE);
}  
  
void loop() {  
 digitalWrite(2, HIGH);
  
  val = digitalRead(BUTTON);   
  value = analogRead(potentiometerPin);
    
  if ((val == HIGH) && (vecchio_val == LOW)){  
    stato = 1 - stato;  
    delay(15);                 
  }   
  
  vecchio_val = val;             
  
    if (stato == 1) {  
   
        
File myFile;
myFile = SD.open("test.txt", FILE_WRITE);
myFile.println(value);

 digitalWrite(LEDREG, HIGH);
  }   
  else {  
    digitalWrite(LEDREG, LOW);    
} 

}

Il codice del potenziometro con tasto di registrazione è questo e funziona benissimo:
Quando premo il pulsante il led di registrazione si illumina e iniziano a scorrere i dati, quando lo premo nuovamente la luce si spegne e il flusso dati si blocca.
(i pin dei led sono diversi per adattare meglio la SD reader sull’arduino)

#define LED 13
#define LEDREG 12
#define BUTTON 7                
 

int val = 0;                   
int vecchio_val = 0;            
int stato = 0;                 
int potentiometerPin = 0;  
int value = 0;

void setup() {                  
  pinMode(A0,INPUT);  
  pinMode(13,OUTPUT); 
  pinMode(12,OUTPUT);
  pinMode(BUTTON, INPUT);     
  Serial.begin(9600);
}  
  
void loop() {  
 digitalWrite(13, HIGH);
  
  val = digitalRead(BUTTON);   
  value = analogRead(potentiometerPin);
  // controlla se è accaduto qualcosa  
  if ((val == HIGH) && (vecchio_val == LOW)){  
    stato = 1 - stato;  
    delay(15);                
  }   
  
  vecchio_val = val;            
  
    if (stato == 1) {  
   

 Serial.println(value);  
 digitalWrite(LEDREG, HIGH);
  }   
  else {  
    digitalWrite(LEDREG, LOW);    
} 

}

Quello che non riesco a fare e salvare i dati sull’SD, cosa c’è di sbagliato nel primo codice?
Sono agli inizi e mi sto scervellando…
Un grazie a qualsiasi persona mi aiuti…

Ciao, credo che sia sufficiente mettere

dataFile.close();

quando smetti di registrare i dati e credo anche sia conveniente spostare l'apertura del file quando vien premuto il pulsante di accensione in modo che lo apri una sola volta e quando premi il pulsante per smettere di registrare lo chiudi con il codice indicato sopra

Quello che non riesco a fare e salvare i dati sull'SD

Ossia? Che problemi ti ritrovi? File vuoto? Dati senza senso? File mancante?

Per quanto ti ha suggerito Fabpolli devo fare una precisazione: è giusto dire che il file andrebbe chiuso quando non si usa (per diversi motivi), ma si può forzare la scrittura dei dati sul file senza doverlo chiuderlo usando il metodo flush(), che forza la scrittura fisica dei dati sulla SD (normalmente prima passano da un buffer da cui, arbitrariamente, vengono poi riversati sulla memoria).

Ho provato cosi come credo mi hai indicato te ma non funzia ancora

#include <SD.h>
#define LED 2 
#define LEDREG 3
#define BUTTON 4              
 
int CS_pin = 10;
int val = 0;                    
int vecchio_val = 0;          
int stato = 0;                
int potentiometerPin = 0;  
int value = 0;

void setup() {                  
  pinMode(A0,INPUT);  
  pinMode(2,OUTPUT); 
  pinMode(3,OUTPUT);
  pinMode(BUTTON, INPUT);      
  pinMode(CS_pin, OUTPUT);

  Serial.begin(9600);
  SD.begin(CS_pin);
File myFile;
myFile = SD.open("test.txt", FILE_WRITE); 


}  
  
void loop() {  
 digitalWrite(2, HIGH);
          

  val = digitalRead(BUTTON);   
  value = analogRead(potentiometerPin);
    
  if ((val == HIGH) && (vecchio_val == LOW)){  
    stato = 1 - stato;  
    delay(15);                 
  }   
  
  vecchio_val = val;             
  
    if (stato == 1) {  
  File myFile;


myFile.println(value);


 digitalWrite(LEDREG, HIGH);
  }   
  else {  
    File myFile;
    myFile.close();
    digitalWrite(LEDREG, LOW);    
} 


}

In ogni caso intanto ti ringrazio…

Non hai ancora risposto:

leo72:

Quello che non riesco a fare e salvare i dati sull'SD

Ossia? Che problemi ti ritrovi? File vuoto? Dati senza senso? File mancante?

Si, scusa ho letto ora. Quando vado ad aprire il file text tramite pc si presenta completamente vuoto

Non devi istanziare una copia della classe prima di accedere al file. Nel tuo codice vedo 3 volte

File myFile;

Questa istruzione la devi mettere solo prima del setup, dove istanzi le classe del file e poi basta.

E’ vero hai assolutamente ragione…ho modificato cosi, ma ancora non va, il file rimane vuoto.

#include <SD.h>
#define LED 2 
#define LEDREG 3
#define BUTTON 4              
 
int CS_pin = 10;
int val = 0;                    
int vecchio_val = 0;          
int stato = 0;                
int potentiometerPin = 0;  
int value = 0;
File myFile;
void setup() {                  
  pinMode(A0,INPUT);  
  pinMode(2,OUTPUT); 
  pinMode(3,OUTPUT);
  pinMode(BUTTON, INPUT);      
  pinMode(CS_pin, OUTPUT);

  Serial.begin(9600);
  SD.begin(CS_pin);

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


}  
  
void loop() {  
 digitalWrite(2, HIGH);
          

  val = digitalRead(BUTTON);   
  value = analogRead(potentiometerPin);
    
  if ((val == HIGH) && (vecchio_val == LOW)){  
    stato = 1 - stato;  
    delay(15);                 
  }   
  
  vecchio_val = val;             
  
    if (stato == 1) {  



myFile.println(value);


 digitalWrite(LEDREG, HIGH);
  }   
  else {  
   
    myFile.close();
    digitalWrite(LEDREG, LOW);    
} 





}

La logica è errata. Apri il file, se il pulsante è a 1 ci scrivi, altrimenti lo richiudi. A questo punto però non puoi più scriverci, quando il file è chiuso.

Ok, come lo scriveresti te? Io non trovo la soluzione... :0 :0 :0

Perché non mettere tutto nell'unico if che scrive i dati:

if (stato == 1) { 
  myFile = SD.open("test.txt", FILE_WRITE); 
  myFile.println(value);
  digitalWrite(LEDREG, HIGH);
  myFile.flush();
  myFile.close(); 
}

ovviamente togliendo l'apertura da inizio sketch.

Ti ringrazio tantissimo...quando arrivava casa provo

Provato...Funziona!!! :D :D :D :D Grazie mille

Altro problemino (tralascio la parte del pulsante nello sketch per rendere più veloce la lettura ed ho affiancato al valore del potenziometro un riferimento temporale), come faccio a fare in modo che ad ogni registrazione venga creato un file txt con titolo “test” e poi un numero progressivo (test0, test1, test2,…)?
Lo sketch attuale funziona benissimo ed è in grado di leggere se esiste il file contenuto (test0) ed in caso sciverne uno nuovo (test1) ma non so come fare in modo che tutto ciò funzioni in maniera automatica aumentando progressivamente di volta in volta la parte numerica del titolo!
:cold_sweat:

#include <SD.h>
#define LED 2 
               
int CS_pin = 10;
int potentiometerPin = 0;  
int value = 0;
File myFile;
void setup() {                  
  pinMode(A0,INPUT);  
  pinMode(2,OUTPUT); 
  Serial.begin(9600);
  SD.begin(CS_pin);
}  
  
void loop() {  
digitalWrite(2, HIGH);
unsigned long currentMillis = millis();
 value = analogRead(potentiometerPin);
 if (SD.exists("test0.txt")){  
       
 
 myFile = SD.open("test1.txt", FILE_WRITE); 
  myFile.print(value);
  myFile.print("   ");
  myFile.println(currentMillis);  
   myFile.flush();
   myFile.close(); 
}   
 }

Dentro alle " " non si possono inserire funzioni di alcun tipo giusto? Evitando la parte "test" e dando come nome al file solo un numero forse l'operazione potrebbe risultare più facile? Forse no perchè comunque il ".txt" deve starci

Usi una variabile che incrementi man mano che crei i file text. Poi la variabile la converti in stringa e la inserisci tra "text" e ".txt". Non è facilissimo ma neanche impossibile. Una soluzione può essere questa: https://learn.adafruit.com/adafruit-data-logger-shield/using-the-real-time-clock-3

Lì costruiscono il numero dalla data/ora ma tu puoi usare un sistema incrementale.

Si, adesso stavo guardando qualcosa e pensavo di usare un metodo tipo questo:

void setup() {
Serial.begin(9600);

 String stringaDue = String(13);


 String stringaUno = String(stringaDue + " .txt");

 Serial.println(stringaUno); 
}


void loop() {
          
}

sostituendo al posto del valore 13 un valore di data e ora. Per fare ciò però dovrei acquistare un orologio immagino! Non credo di poter usare il metodo di incremento numerico perchè ogni volta che arduino verrebbe spento si resetterebbe il conteggio. Non esiste una funzione che calcola il numero di file contenuti in una cartella e ti ritorna un valore? Questa sarebbe una soluzione ma non so se percorribile

oppure, non potrei creare un file di conteggio? Mi spiego, creo un file iniziale di testo (che titolo ad esempio "time") con all'interno la cifra 1 . Dopodichè prima di scrivere il titolo nel nuovo file principale di dati gli dico di aprire il file "time", leggere il contenuto ( 1 ), usare quel contenuto per titolare il mio file di dati, ed aggiungere un altro 1 nel testo, chiudere il file "time". In questo modo i file da me creati potrebbero ad esempio chiamarsi 1.txt, 11.txt, 111.txt,...cosi potrei ordinarli cronologicamente. Metodo poco pulito ma credo efficace, che dici?

Scegli il metodo che ti piace di più, ce ne sono tante di strade. Il vantaggio di usare un file con la data contenuta all'interno del nome può aiutarti già a classificare i dati. Aprendo il file con FILE_WRITE fai in pratica un append per cui se il file esiste, viene aperto in scrittura e l'aggiunta dei dati viene fatta in fondo per cui anche in caso di più scritture giornaliere hai poi tutto catalogato per giorno/file.

Ho crecato in rete ma non ho trovato risposta…
Quando creo un file txt con

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

come faccio a sostituire al testo “prova” ad esempio un testo che sia la lettura di dati (numeri come 1234) da un file txt in modo da nominare il file ad esempio come 1234.txt ?
Ho provato ad usare le String, variabili char e tutto quello che ho scoperto ma non ne sono venuto fuori.
Cioè, come faccio a trasformare una variabile in stringa in modo da poterla inserire al posto del testo?

E poi, perche quando vado a leggere i dati 1234 sul file test.txt sull’SD e vorrei stamparli su seriale come “1234.txt”
mi esce solo “1.txt”?
il code è questo:

#include <SD.h> 
int CS_pin = 10;
 File myFile;

void setup() 

{


 
  
pinMode(CS_pin, OUTPUT); 
Serial.begin(9600); 
SD.begin(CS_pin);
myFile = SD.open("test.txt", FILE_READ);
char number = myFile.read() ;
String stringaDue = String (number);
String stringaUno = String(stringaDue + ".txt");

Serial.print(stringaUno);



myFile.close();
 

 

} 
void loop() 
{ 
}