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..
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).
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.
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!
#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:
Lì costruiscono il numero dalla data/ora ma tu puoi usare un sistema incrementale.
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: