[Risolto]Problemi scrittura su SDCard

Ciao a tutti, ho un problema con il codice seguente:

#include <SPI.h>
#include <SD.h>
#include <Ethernet.h>

byte mac[] = {0x90, 0xA2, 0xDA, 0x00, 0x98, 0xC3};
byte ip[] = {192, 168, 100, 100};
byte subnet[] = {255, 255, 255, 0};
File myFile;
int buttonstate = 0;

void setup() {
  Ethernet.begin(mac, ip, subnet);
  Serial.begin(9600);
  while (!Serial) {
    ;
  }
  Serial.print("Inizializzo la SD card...");
  if (!SD.begin(4)) {
    Serial.println("Inizializzazione fallita!");
    return;
  }
  Serial.println("Inizializzazione corretta.");

  pinMode(13, INPUT);
  pinMode(10, OUTPUT);
  pinMode(4, OUTPUT);
}

void WriteOnSD() {
  digitalWrite(4, HIGH);
  myFile = SD.open("DATALOG.csv", FILE_WRITE);
  if (myFile) {
    Serial.print("Scrittura su DATALOG.csv...");
    Serial.println("PULSANTE PREMUTO");
    for (int c = 0; c < 10; c++) {
      myFile.print(c);
      myFile.println(" ,100,1010,1020");
    }
    // close the file:
    myFile.close();
    Serial.println("FATTO.");
    delay(5000);
    digitalWrite(4, LOW);
    Serial.println("PULSANTE rilasciato");
  } else {
    Serial.println("Error apertura DATALOG.csv oppure il pulsante non attivo");
    digitalWrite(4, LOW);
  }
}

void loop() {
  buttonstate = digitalRead(13);
  if (buttonstate == HIGH) {
    WriteOnSD();
  }
}

Ho inserito una resistanza da 10k tra il pin d'ingresso e il GND, poi quando devo mandare su l'uscira gli do la 5v sull'ingresso. Ora tutto questo non corrisponde. Non corrisponde, perché salta subito all'else, non ho più idea del perchè. Da come si vede dal codice voglio scrivere sulla SDCard. La sdcard di trova sulla shield ethernet.

Mi potete aiutare?

Ad occhio, nel setup richiami SD.begin(4), ma il pin 4 non l'hai ancora dichiarato.
Prova ad inserire la dichiarazione del pin 4 output, all'inizio del setup.

Ok, ma io utilizzo la shield dove è inserita la sd card. Poi includo la spi e la ethernet, devo anche dichiarare il pin?

Vedi tu, non è plug&play ...
Hai provato a fare come ti ho suggerito ?
Magari non cambia nulla, ma a rigor di logica prima di utilizzare un pin devi dichiarare se è in o out.

Ho dichiarato il pin out, ma non cambia nulla

Visto che hai modificato il primo post, ti consiglio di modificare anche il titolo della discussione, in quanto non hai un problema con i pulsanti, ma con la SDShield.
I pulsanti funzionano, visto che riesci correttamente ad eseguire la sub WriteOnSD.
Ora sta a capire perchè non ti apre il file.

Hai dato una lettura a questo articolo?
http://blog.oscarliang.net/sd-card-arduino/

ciao.
Devo premettere che non ho una SD e potrei scrivere parecchie cavolate.
Se "salta subito all'else" evidentemente significa che:

if (myFile) {
    .....
    }

é falso.
Ho alcune domande: perchè quei digitalWrite(4, HIGH);
inoltre credo che il file DATALOG.csv deve esistere per poterci scrivere.

ciao
pippo72

Il digitalwrite, mi serve per fare vdere che sto scrivendo, è solo per visualizzare. Dopo un pò di codice lo elimino, perché non mi servirà più
Comunque adesso ho il codice un pò modificato; ho pure creato il file. Ma il problema è nel loop. Infatti, quando sposto il tutto nel setup, funziona perfettamente e anche se il file non esiste lo crea.
Secondo me ad arduino non gli va giù gli ingressi e il codice fatto così. Posto il nuovo codice:

#include <SPI.h>
#include <SD.h>
#include <Ethernet.h>
#include "stdio.h"

byte mac[] = {0x90, 0xA2, 0xDA, 0x00, 0x98, 0xC3};
byte ip[] = {192, 168, 100, 100};
byte subnet[] = {255, 255, 255, 0};
File myFile;
int buttonstate = 0;
bool m = false;

void setup() {
  pinMode(4, OUTPUT);
  Ethernet.begin(mac, ip, subnet);
  Serial.begin(9600);
  while (!Serial) {
    ;
  }
  Serial.print("Inizializzo la SD card...");
  if (!SD.begin(4)) {
    Serial.println("Inizializzazione fallita!");
    return;
  }
  Serial.println("Inizializzazione corretta.");
  pinMode(5, OUTPUT);
  pinMode(13, INPUT);
  pinMode(10, OUTPUT);
}

void WriteOnSD() {
  digitalWrite(5, HIGH);
  myFile = SD.open("DATALOG.csv", FILE_WRITE);
  if (myFile) {
    Serial.println(m);
    Serial.print("Scrittura su DATALOG.csv...");
    for (int c = 0; c < 10; c++) {
      myFile.print(c);
      myFile.println(" ,100,1010,1020");
    }
    // close the file:
    myFile.close();
    Serial.println("FATTO.");
    delay(5000);
    digitalWrite(5, LOW);
    Serial.println("PULSANTE rilasciato");
    m = false;
  } else {
    Serial.println("Error apertura DATALOG.csv oppure il pulsante non attivo");
    digitalWrite(5, LOW);
    m = false;
    Serial.println(m);
  }
}
void loop() {
  buttonstate = digitalRead(13);
  if ((buttonstate == HIGH) && (m == false)) {
    Serial.println("PULSANTE PREMUTO");
    WriteOnSD();
    m = true;
    Serial.println(m);
  }
}

Ne sparo un'altra, anzi due.

Metti il void loop() subito sotto al setup(), di solito le sub che creiamo noi si mettono in fondo al listato.
Secondo: prova a cambiare pin di ingresso; metti il 12, o qualunque altro libero tranne 0 e 1.

venti:
Il digitalwrite, mi serve per fare vdere che sto scrivendo, è solo per visualizzare.

Quindi tu hai colegato un led a quel pin?
E' lo stesso che usi per il CS della SD (scusa l'abuso di acronimi), non so se gli piace tanto.

ciao
pippo72

ciao

Brado:
prova a cambiare pin di ingresso; metti il 12, o qualunque altro libero tranne 0 e 1.

Ha ragione Brando: i pin 13 (CLK), 12 (MISO), 11 (MOSI) e 4(CS) sono usati dalla SD.
Il pin 4 lo puoi cambiare, gli altri sono fissi quindi devi usare un pin diverso per l'ingresso.

ciao
pippo72

Sto verificando i vostri suggerimenti

Grazie a tutti e due. Vi posto il codice modificato e funzionante:

#include <SPI.h>
#include <SD.h>
#include <Ethernet.h>
#include "stdio.h"

byte mac[] = {0x90, 0xA2, 0xDA, 0x00, 0x98, 0xC3};
byte ip[] = {192, 168, 100, 100};
byte subnet[] = {255, 255, 255, 0};
int buttonstate = 0;
bool m = false;
File myFile;

void setup() {
  pinMode(4, OUTPUT);
  Ethernet.begin(mac, ip, subnet);
  Serial.begin(9600);
  while (!Serial) {
    ;
  }
  Serial.print("Inizializzo la SD card...");
  if (!SD.begin(4)) {
    Serial.println("Inizializzazione fallita!");
    return;
  }
  Serial.println("Inizializzazione corretta.");
  pinMode(8, INPUT);
}

void loop() {
  buttonstate = digitalRead(8);
  if ((buttonstate == HIGH) && (m == false)) {
    Serial.println("PULSANTE PREMUTO");
    m = true;
    Serial.println(m);
    myFile = SD.open("datalog.csv", FILE_WRITE);
    if (myFile) {
      Serial.println(m);
      Serial.print("Scrittura su datalog.csv...");
      for (int c = 0; c < 10; c++) {
        myFile.print(c);
        myFile.println(" ,100,1010,1020");
      }
      // close the file:
      myFile.close();
      Serial.println("FATTO.");
      delay(5000);
      m = false;
      Serial.println(m);
    } else {
      Serial.println("Error apertura DATALOG.csv oppure il pulsante non attivo");
      m = false;
      Serial.println(m);
    }
  }
}

Prima ho usato l'ingresso 10, non funzionava. Ho usato l'8, però dando un ritardo di 5 sec, per evitarmi una nuova lettura e capire tutto il funzionamento. Quindi era sì una congiunzione di di diverse cose: usare i pin giusti.

Grazie...Funziona!!!

Prego venti.

Bella domanda nid ... :wink:

Ok, scriverò le mie conoscenze di elettronica. Ma non conoscevo la scheda in particolare e sono andato a occhi chiusi pensando che utilizzando la shield ethernet posta sopra la scheda principale, liberavo i pin da cui si era scatenato il problema.

Beh se una scheda di tipo arduino, pone questi problemi, significa che ha livelli di utilizzo limitati alla domotica, come è scritto in lungo e largo. Cioè quindi non può essere utilizzata in ambito industriale, se no per fare piccoli web server.
L'altro post, si riferiva alla prima mia verifica su arduino..quindi dovrei tornare nell'altro post. Oppure chiedere al moderatore di chiuderlo.

Vi ringrazione

venti:
Ciao a tutti, ...

Cancello di la e posto di qui:

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

Beh se una scheda di tipo arduino, pone questi problemi, significa che ha livelli di utilizzo limitati alla domotica, come è scritto in lungo e largo.

Quali problemi, scusa?
Il protocollo SPI prevede espressamente un pin CS (Chip Select) che serve a selezionare con quale dispositivo vuoi dialogare. Siccome sullo shield ethern ci sono 2 dispositivi che dialogano via SPI, la scheda SD ed il chip Wiznet, devi scegliere con quale dialogare. E lo fai con quel pin impostato in un certo modo.

Cioè quindi non può essere utilizzata in ambito industriale, se no per fare piccoli web server.

Nessuna scheda Arduino è certificata per l'uso industriale. In teoria non potresti neanche farci dispositivi domestici collegati alla rete elettrica. Le schede Arduino sono schede di prototipazione per uso generico, sono buone a tutto ma per nulla nello specifico.

venti:
L'altro post (...) chiedere al moderatore di chiuderlo.

Rimosso

Ok. Comunque un ringraziamento a tutti. Ho imparato oggi una cosa: leggere meglio i datasheet e guardare meglio gli esempi.

Grazie