Go Down

Topic: Estrarre una variabile da SD (Read 413 times) previous topic - next topic

nibbio99

Salve a tutti, sono nuovo nel forum e mi sto avvicinando ora al mondo di arduino. Premetto che sono in possesso di un arduino mega con la shield ethernet.
Veniamo al punto:
Ho la necessita che all'avvio, arduino controlli il valore di una variabile e lo memorizzi, per poi riscriverlo una volta cambiato.
Il circuito è semplice, si basa su un led che si accende o si spegne se premo un tasto.
le 2 variabili sono:
1) la presenza o meno di un file (vuoto) che mi serve per memorizzare l'ultimo stato del led (e qui non ci sono problemi)
2) il contatore totale degli impulsi del bottone (e qui non riesco a riprendere l'ultimo valore scritto nel file contass.txt).
Allego il codice:
Code: [Select]

#include <SD.h>


const int button = 7; //definisco
const int led = 12;
int statobottone = 0;  //definisto le variabili come interi
int vecchiostatobottone = 0;
int contatore = 0;  //definisco la variabile contatore relativo
int contass1 = 0;   //definisco la variabile contatore assoluto
File contrel; //file di conservazione ultimo stato del led
File contass; //contatore quante volte ho premuto il pulsante

void setup () {  //definisco gli input e output
  pinMode(led, OUTPUT);
  pinMode(button, INPUT);
  SD.begin(4);
  if(SD.exists("contrel.txt")) {
    digitalWrite(led, HIGH);
    contatore = 1;
  }
 
}
void loop() {
  statobottone = digitalRead(button); 
  if (statobottone != vecchiostatobottone) {
    delay(300);
    contatore++;
    contass1++;
  }
    if (contatore == 1) {  // se uguale ad 1
      digitalWrite(led, HIGH); //accendi il led
      contrel = SD.open("contrel.txt", FILE_WRITE); //apro e chiudo il file solo per crearlo
      contrel.close();
      SD.remove("contass.txt");
      contass = SD.open("contass.txt", FILE_WRITE);  //scrivo il valore di contass1 in contass.txt
      contass.println(contass1);
      contass.close();
    }

    if (contatore > 1) {
      digitalWrite(led, LOW);
      contatore = 0;
      SD.remove("contrel.txt");
      SD.remove("contass.txt");
      contass = SD.open("contass.txt", FILE_WRITE);
      contass.println(contass1);
      contass.close();
    }
  }
 

 
Il mio vero problema è che non riesco ad assegnare a contass1 il valore scritto in contass.txt se interrompo l'alimentazione o resetto la scheda.

grazie a tutti.

P.s. ma non esiste un sito dove poter leggere le guide sulle varie librerie??

leo72

Se scrivi un numero con println su un file questo viene scritto trasformandolo da numero in stringa per cui se scrivi 123 esso diventa "123". Rileggendolo non torna più come prima da solo. Devi ricostruire tu il numero.

nibbio99

...e quindi con cosa mi consigli di sostituire println, oppure come posso ricostruire la stringa??

leo72

Controlla intanto se il dato è effettivamente salvato come ti ho detto: basta aprire la scheda da un computer, leggere quel file e controllare il formato.
Se è salvato come "123" non è difficile. Ti leggi la riga, poi scorri byte per byte e converti il numero in decimale. Ogni volta che ne trovi uno nuovo, moltiplichi per 10 la precedente somma e poi aggiundi l'ultimo letto.

Esempio 123:
totale = 0
leggi il primo carattere: 1
(totale * 10) + 1 = (0 * 10) + 1 = 1
leggi il secondo carattere: 2
(totale * 10) + 2 = (1 * 10) + 2 = 12
leggi il terzo carattere: 3
(totale * 10) + 3 = (12 * 10) + 3 = 123


ti fa un semplice

nibbio99


Controlla intanto se il dato è effettivamente salvato come ti ho detto: basta aprire la scheda da un computer, leggere quel file e controllare il formato.
Se è salvato come "123" non è difficile.


Il file esiste, ma il mio problema è leggere il testo nel file x poi convertirlo. Infatti nel codice che ho postato manca nel set-up la porzione di codice di lettura del file.

Go Up