Aiuto comprensione SD Shield

Ciao a tutti, molto tempo fa ho comprato uno shield sd (http://www.hwkitchen.com/products/sd-card-shield-for-arduino-v2-1/) e poi tra problemi di lavoro ed altro ho bloccato tutte le mie idee.

Ora ho ripreso in mano il tutto e devo fare in modo che leggendo i dati di temperatura e luminosità (quello almeno lo so fare), si crei successivamente un file nella sd contenete i vari dati.

Sapete darmi qualche indicazione dove trovare qualche guida? Ho cercato nel forum ma non ho trovato quello che mi interessava.

Il mio problema è aprire la sd e scriverci dentro.

Grazie a tutti

Vi posto il codice che ho prodotto.

Nel caricamento non da errore ma dice “Card failed, or not present”

#include <SD.h>
const int chipSelect = 4;

int pin = 0; // analog pin
int tempc = 0,tempf=0; // temperature variables
int samples[8]; // variables to make a better precision
int maxi = -100,mini = 100; // to start max/min temperature
int i;

void setup()
{
  Serial.begin(9600); // start serial communication
     while (!Serial) {

  }


  Serial.print("Initializing SD card...");
  // make sure that the default chip select pin is set to
  // output, even if you don't use it:
  pinMode(10, OUTPUT);
 
  // see if the card is present and can be initialized:
  if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
    // don't do anything more:
    return;
  }
  Serial.println("card initialized.");

}

void loop()
{
  
  
for(i = 0;i<=7;i++){ // gets 8 samples of temperature
  
  samples[i] = ( 5.0 * analogRead(pin) * 100.0) / 1024.0;
  tempc = tempc + samples[i];
  delay(1000);

}

tempc = tempc/8.0; // better precision
tempf = (tempc * 9)/ 5 + 32; // converts to fahrenheit

if(tempc > maxi) {maxi = tempc;} // set max temperature
if(tempc < mini) {mini = tempc;} // set min temperature

Serial.print(tempc,DEC);
Serial.print(" Celsius, ");

Serial.print(tempf,DEC);
Serial.print(" fahrenheit -> ");

Serial.print(maxi,DEC);
Serial.print(" Max, ");
Serial.print(mini,DEC);
Serial.println(" Min");

tempc = 0;




{
  // make a string for assembling the data to log:
  String dataString = "";

  // read three sensors and append to the string:
  for (int analogPin = 0; analogPin < 3; analogPin++) {
    int sensor = analogRead(analogPin);
    dataString += String(sensor);
    if (analogPin < 2) {
      dataString += ",";
    }
  }

  // open the file. note that only one file can be open at a time,
  // so you have to close this one before opening another.
  File dataFile = SD.open("datalog.txt", FILE_WRITE);

  // if the file is available, write to it:
  if (dataFile) {
    dataFile.println(dataString);
    dataFile.close();
    // print to the serial port too:
    Serial.println(dataString);
  }  
  // if the file isn't open, pop up an error:

  }  

  }

Cosa avrò mai combinato?

Cambia questo :

  pinMode(10, OUTPUT);

in

  pinMode(4, OUTPUT);

E' l'unico errore evidente, se ci dici che shield usi potremmo esserti più d'aiuto...

Lo shiel è questo

http://www.hwkitchen.com/products/sd-card-shield-for-arduino-v2-1/

ratto93: Cambia questo :

  pinMode(10, OUTPUT);

in

  pinMode(4, OUTPUT);

E' l'unico errore evidente, se ci dici che shield usi potremmo esserti più d'aiuto...

non serve perchè in Spi.cpp c'è già l'inizializzazione: pinMode(SS_PIN, OUTPUT); il difetto deve essere nel connettore SD o nella SD

Installando la sd direttamente su arduino funziona ma se invece faccio passare il tutto per la bb si blocca tutto. Quando torno dalle ferie vi posto lo schema nel caso qualcuno riesca a darmi una mano.

Grazie

Infatti è una cosa hardware, dopo che hai illustrato i collegamenti si vedrà

Credo però ci sia un altro errore:

int pin = 0; // analog pin

Il pin non dovrebbe essere A0?

int pin..... è la dichiarazione di una variabile di nome pin non di un un ingresso analogico

int pin..... è la dichiarazione di una variabile di nome pin non di un un ingresso analogico

Vero, è una variabile ma usata per identificare un ingresso analogico:

samples[i] = ( 5.0 * analogRead(pin) * 100.0) / 1024.0;

Quanto ne so io i pin analogici possono essere definiti (per l' Arduino UNO) in vari modi: da 0 a 5, da A0 a A5 o da 14 a 19. Tutte le notazioni sono equivalenti.

Ciao Uwe

Corretto. Ci pensa il core a controllare se il parametro passato rientra in quelli corretti. A0 equivale a 14 e quando la funzione pinMode si trova per mano un valore di pin superiore al valore massimo di quelli digitali, ad esempio nella UNO superiore a 13, sottrae un valore prestabilito, nella UNO appunto 14, per farli rientrare nel range ammesso.

Uwe, Leo avete ragione non è un errore.

Tuttavia credo che specificare espressamente la natura del pin migliori la leggibilità del listato, non trovate?