Arduino: scrivere e leggere una variabile su una memoria SD

Dopo aver collegato la memoria SD come visto nell'ultimo post, o con uno shield, ora proviamo ad utilizzarla in qualcosa di concreto.

L'uso che voglio fare della scheda è poterci salvare dei parametri, 
per poi poterli caricare quando voglio nel mio progetto.
Inoltre posso anche mettere una SD diversa e caricare il dato contenuto in quella.

Forse non vi servirà mai, ma se costruite un progetto in cui vari utenti lo utilizzano e lo modificano a loro piacimento, ed ognuno ha la sua SD, al loro ritorno caricheranno i dati come se fossero stati gli ultimi utilizzatori.

Vediamo questo semplice esempio che ho realizzato:
una breadboard contiene il collegamento della SD, se avete uno shield dedicato usate pure quello,
mentre l'altra contiene 2 led, 2 pulsanti ed un deviatore.


Inserite una SD o microSD ed alimentate Arduino.
Se la SD sarà collegata correttamente si accenderà il led rosso.

Premendo il pulsante "S" verrà creato un file di testo nella SD chiamato "test.txt" dove verrà salvato lo stato del pin 8.
In pratica all'interno del file vi troverete un "1" se il pin era a livello alto (3.3Volt), oppure uno "0" se era a GND.

Adesso, se premete il pulsante "L", Arduino leggerà il file "test.txt" contenuto nella SD e se ci sarà scritto "1" accenderà il led "ledprova" (quello giallo), altrimenti se ci sarà scritto "0" lo spegnerà.





  1. #include <SD.h>
  2. int CS_pin = 10;
  3. int ledstato = 9;
  4. int pulsante = 8;
  5. int statopulsante;
  6. int ledprova = 7;
  7. int salva = 2;
  8. int statosalva;
  9. int leggi = 3;
  10. int statoleggi;
  11. File myFile;
  12. void setup()
  13. {
  14.   pinMode(CS_pin, OUTPUT);
  15.   pinMode(ledstato, OUTPUT);
  16.   pinMode(pulsante, INPUT);
  17.   digitalWrite(pulsante, HIGH);
  18.   pinMode(ledprova, OUTPUT);
  19.   pinMode(salva, INPUT);
  20.   digitalWrite(salva, HIGH);
  21.   pinMode(leggi, INPUT);
  22.   digitalWrite(leggi, HIGH);
  23.   //accendi il led "ledstato" se la sd è collegata
  24.   if (SD.begin(CS_pin))
  25.   {
  26.     digitalWrite (ledstato, HIGH);
  27.   }
  28.   else
  29.   {
  30.     digitalWrite (ledstato, LOW);
  31.   }
  32. }
  33. void loop()
  34. {
  35.   //se premo il pulsante "leggi" vai alla funzione "leggi_SD"
  36.   statoleggi = digitalRead (leggi);
  37.   if (statoleggi == LOW)
  38.   {
  39.     leggi_SD();
  40.   }
  41.   //se premo il pulsante "salva" vai alla funzione "salva_SD"
  42.   statosalva = digitalRead (salva);
  43.   if (statosalva == LOW)
  44.   {
  45.     salva_SD();
  46.   }
  47.   delay(100);
  48. }
  49. void salva_SD()
  50. {
  51.   //cancella il file di testo "test.txt" (se presente)
  52.   SD.remove("test.txt");
  53.   //leggi lo stato del "pulsante" e salvane lo stato nel file "test.txt"
  54.   //il file verrà creato
  55.   statopulsante = digitalRead (pulsante);
  56.   myFile = SD.open("test.txt", FILE_WRITE);
  57.   if (myFile) {
  58.     myFile.print(statopulsante);
  59.     myFile.close();
  60.   }  
  61. }
  62. void leggi_SD(){
  63.   String ReadLine;
  64.   //leggi il file di testo "test.txt" e caricane il contenuto in "Readline"
  65.   if(myFile = SD.open("test.txt", O_READ)) {
  66.     int c;
  67.     while ((c = myFile.read())>0){
  68.       ReadLine += (char)c;
  69.       if((char)c=='\n') {                
  70.         if(c > 0) ReadLine="";  
  71.       }  
  72.     }  
  73.   }
  74.   //converti il contenuto di readline in un numero intero
  75.   int i=(ReadLine[0]-'0');
  76.   //se il contenuto vale "1" accendi "ledprova" altrimenti spegnilo
  77.   if (i == 1)
  78.   {
  79.     digitalWrite (ledprova, HIGH);
  80.   }
  81.   else
  82.   {
  83.     digitalWrite (ledprova, LOW);
  84.   }
  85. }

Ecco un video dimostrativo:



Come al solito per qualunque cosa lasciate un commento qui sotto, Ciao!!

Seguimi sulle mie pagine per rimanere sempre aggiornato sui nuovi post!

7 commenti:

  1. sarebbe interessante un datalogger orario temperatura per esempio.

    RispondiElimina
  2. complimenti vivissimi , un bell'articolo in ogni caso

    RispondiElimina
    Risposte
    1. Grazie!
      Il datalogger è un bel progetto che potrei anche realizzare,
      Può essere davvero di grande utilità.
      In ogni caso la parte di salvataggio del valore è identica a quella di questo post, basta solo togliere l'attivazione con pulsante e mettere un tempo, per la lettura non saprei, ma nel mio caso andrebbe anche bene leggere i dati periodicamente da PC.
      Grazie ancora, ciao!

      Elimina
  3. Ciao Daniele, grazie per questi super tutorial! Provvedo a twittarli.
    Siccome non sono ancora forte con linguaggio e metodi, posso chiederti come si fa a salvare due o tre array (uno per ogni utente) sulla stessa microSD e poi a caricare dalla microSD l'array voluto "on demand"?
    Grazie
    Robert

    RispondiElimina
  4. P.S.: non c'è una maniera "analoga" per sfruttare la microSD come "memoria" per lo sketch (in quei casi in cui lo sketch superi i 32K), grazie per la curiosità.

    RispondiElimina
  5. Ciao! Fantastico, è quello che cercavo!
    Una domanda: esiste un modo per scrivere e leggere un txt fatto di x righe e y colonne? O in alternativa, una tabella di excel? (ebbene sì, sono un pò nuovo! ;-)
    Grazie!

    RispondiElimina

Lascia un commento qui sotto, ti risponderò il prima possibile!

Altri Post