Input da file su microSD per il comando di led.

Buonasera a tutti,

ho intenzione di creare un semplice programma che legga dati contenuti su file, li salvi su di un vettore che viene poi usato per comandare i led.
Per realizzarlo utilizzo una ethernet shield in cui è inserita una microSD.
Al momento mi sono limitato a scrivere il codice riguardante l'acquisizione di dati da file, visto che è la parte "più complicata". Il file è del tipo:

110
001
000
....

Ho pensato quindi di creare un vettore di tipo char che memorizzi di volta in volta una riga di file e la usi per il comando dei led. Il problema è sorto proprio nella fase di lettura. Vorrei che all'inizio della funzione loop il vettore acquisisca una riga di codice, la utilizzi per comandare i led e riprenda dalla riga successiva all'inizio del prossimo loop. Tuttavia non riesco a formulare in termini di codice il fatto che riprenda dalla riga successiva, ho pensato di contare gli "/n" e memorizzarli in un contatore in modo da tenere conto delle righe, ma non mi sembra la soluzione ottimale. Il codice relativo alla lettura è:

#include <SD.h>

const unsigned int pinSD = 4;  // pin di default della ethernet shield
File myFile;
char comando[4];

void setup() {
  
  Serial.begin(9600);
   
  // On the Ethernet Shield, CS is pin 4. It's set as an output by default.
  // Note that even if it's not used as the CS pin, the hardware SS pin 
  // (10 on most Arduino boards, 53 on the Mega) must be left as an output 
  // or the SD library functions will not work. 
   pinMode(10, OUTPUT);
   
  if (!SD.begin(pinSD)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");

}


void loop()
{
  // open the file  
  
  myFile = SD.open("comando.txt"); 
  
  if (myFile) {
    int i = 0;  
    while (myFile.available() && i < 4 ) {  
      comando[i] = myFile.read();
      i++;
    }
    
    // close the file 
    
    myFile.close(); 
  }
  
  else {
    
    // if the file didn't open, print an error:
    Serial.println("error opening comando.txt");
  }
  
  Serial.println("il vettore contiene: ");
  int j = 0;
  while (j<4) {
    Serial.print(comando[j]);
    j++;
  }
  Serial.println();
}

In questo modo naturalmente il programma salva su vettore sempre la prima riga di codice, in che modo posso scorrere via via le varie righe del file?

Grazie mille a tutti.

Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni
e a leggere il regolamento: Regolamento

Già, che maleducato, ho dimenticato le presentazioni! Risolvo subito :smiley:

Quali sono i pin che usi?
Quanti sono i pin che usi?

Potresti registrare il byte e accendere o spegnere nello stesso istante tutto il buffer da 8 bit con la manipolazione dei registri

0 = 00000000
10 = 00001010
128 = 10000000
255 = 11111111
ecc
con Arduino Reference - Arduino Reference
oppure qui
http://www.leonardomiliani.com/2013/manipoliamo-direttamente-le-porte-logiche-di-una-mcu/comment-page-1/

Si usa lo "/n" per sapere quando la riga finisce oppure metti 20-30 numeri separati da una ',' o delle lettere corrispondente al byte ascii

ciao

Grazie mille!
Non ero a conoscenza della manipolazione dei registri, è molto interessante e penso che me la studierò a breve :grinning: .
Io perchè pensavo a qualcosa di molto semplice per l'accensione di determinati pin, in questo caso 3, per semplicità potrei infatti supporli continui (es. led 1 pin 5, led 2 pin 6, led 3 pin 7) e fare qualcosa del tipo:

boolean comanda_led(int appoggio_valori[]) {
  int i = 0;
  while (i<n) {
    if (appoggio_valori[i] == 0) 
      digitalWrite(pinLed+i,LOW);
     else
       digitalWrite(pinLed+i,HIGH);
    i++;
  }
}

dove appoggio_valori è il vettore che contiene i caratteri presi in input (es. 101) che passo alla funzione e pinLed contiene il valore del primo pin, avendo infatti supposto i pin contigui evito di fare un if a tre uscite per controllare di quale dei pin si tratti e mi basta aggiungere i al pin del primo led.
in questo caso quindi il posto i-esimo del vettore indica il valore di tensione del pin i-esimo.

Tornando al problema relativo all'input da file ho pensato anche che, senza contare i caratteri "a capo", potrei fare caricare interamente il file in una matrice di char nella funzione setup, del tipo:

101
000
111
....

in modo da dover tenere conto via via solo dell'indice di riga (es j) senza dover richiamare l'input da file e scorrere tutte le righe viste precedentemente.
Dovrei solo fare qualche prova per vedere se un file di 20-30 righe di questo tipo sia "caricabile" nella memoria di Arduino o se fosse troppo grande.