Pages: [1]   Go Down
Author Topic: Estrarre una variabile da SD  (Read 354 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Jr. Member
**
Karma: 0
Posts: 63
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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??
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


Offline Offline
Jr. Member
**
Karma: 0
Posts: 63
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged


Offline Offline
Jr. Member
**
Karma: 0
Posts: 63
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Pages: [1]   Go Up
Jump to: