Problema con SD ed esecuzione programma

Ciao,
Sto cercando di creare un programma che legge linee di codice da una SD e le decodifica per valorizzare un Array.
Il programma, prendendo spunto qua e la, funziona perfettamente.
Il problema sorge quando devo leggere anche il valore da un encoder rotativo.
Anche qui la parte di programma presa da sola funziona perfettamente.
Quando arrivo ad unire i due sketch si blocca tutto.
Come mai?


// -----------------------------------------------------------------------------
// INIZIALIZZAZIONE SD
// -----------------------------------------------------------------------------

#include <SPI.h>
#include <SD.h>
File datafile;
String fname = "prova.txt";

char line[30];
int row[8];

// -----------------------------------------------------------------------------
// INIZIALIZZAZIONE ENCODER
// -----------------------------------------------------------------------------

//Definizione pin
const unsigned int pinClk = 8;
const unsigned int pinDt = 9;
// Conserva stato ultima posizione encoder
int prevClk;
int prevDt;
int currClk;
int currDt;
// Variabile per mantenere il valore del contatore di esempio
int contatore;


void setup() {

  Serial.begin(9600);

  if (!SD.begin(4)) {
    Serial.println("SD initialization failed!");
    abort();
  }

  delay(500);
  Serial.println("Seriale ed SD inizializzato");

  pinMode(pinClk, INPUT);
  pinMode(pinDt, INPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);

  digitalWrite(11, HIGH);
  digitalWrite(12, LOW);
  delay(500);
  Serial.println("Pin inizializzati");

  // Esegui prima lettura dei valori sui pin
 prevClk = digitalRead(pinClk);
  prevDt = digitalRead(pinDt);


  //Inizializzo variabile contatore
  contatore = 0;
}

void loop() {
  currClk = digitalRead(pinClk);
  currDt = digitalRead(pinDt);
  Serial.println("Leggo PIN");

  // Se la lettura corrente è diversa dall'ultima memorizzata
  if (currClk != prevClk) {
    

    //readdata();

    Serial.print("[prevClk, prevDt | currClk, currDt] = ");
    Serial.print(prevClk);
    Serial.print(" ");
    Serial.print(prevDt);
    Serial.print(" | ");
    Serial.print(currClk);
    Serial.print(" ");
    Serial.print(currDt);

    //Se il valore di dt è uguale al valore corrente di clk
    if (currDt == currClk) {
      Serial.print(" -");
      contatore --;
    } else {
      Serial.print(" +");
      contatore ++;
    }

    // Mostra lo stato del contatore
    Serial.print(" = ");
    Serial.println(contatore);

    //Aggiorna valori
    prevClk = currClk;
    prevDt = currDt;
  }
}


  void readdata() {
  Serial.println("read");
  datafile = SD.open(fname);
  int i = 0;
  if (datafile) {
    while (datafile.available()) {
      char c = datafile.read();
      if (c == '\n') {
        line[i] = 0;
        Serial.println("to decode");
        Serial.println(line);
        decodedata(line);
        delay(1000);
        i = 0;
      } else if (c == '\r') {

      } else {
        line[i] = c;
        i++;
      }
    }
    datafile.close();
  } else {
    Serial.println("error opening file");
  }
  }




  void decodedata(char* str) {
  Serial.println("decode");
  char* token = strtok(str, ";");
  int i = 0;
  while (token != NULL) {
    int n = 0;
    if (i == 1) {
      n = 0;
    } else {
      //temperatura impostata
      n = atoi(token);
    }
    row[i] = n;
    i++;
    token = strtok(NULL, ";");


      Serial.println("row valorizzato?");
      for (int j = 0; j <= 8; j++) {
      Serial.println(row[j]);
      }

  }
  }

Perché dopo aver inizializzatio la SD fai le pinmode dei pin 11 e 12?
E ci scrivi anche?

Sono MISO e MOSI e sono gestiti dalla libreria, non toccarli inutilmente

Togli quella roba e riprova, poi facci sapere

Ah,
Togli quell'inutile oggetto String
Usa char[]

1 Like

Sono un rincoglionito non avevo minimamente pensato a questo... Perché avevo"infilato" l'encoder direttamente nei pin della shield e lo alimentavo con 11 e 12 SOLO PER LE PROVE SIA CHIARO. Per questo mi sono sempre state poco simpatiche le shield, rendono disponibili PIN che non sono. Comunque adesso funziona tutto, grazie mille.
PS
Che oggetto intendi?

Fallo diventare
char fname[]="prova.txt";

usare una libreria per un encoder rotativo, non credo sia saggio.......in fondo un encoder manda un certo numero di segnali digitali....basta contarli per sapere la posizione.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.