Go Down

Topic: Aiuto comprensione SD Shield (Read 1 time) previous topic - next topic

bibopm

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


bibopm

Vi posto il codice che ho prodotto.

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

Code: [Select]
#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?

ratto93

Cambia questo :
Code: [Select]
  pinMode(10, OUTPUT);
in
Code: [Select]
  pinMode(4, OUTPUT);
E' l'unico errore evidente, se ci dici che shield usi potremmo esserti più d'aiuto...
Se corri veloce come un fulmine, ti schianterai come un tuono.

bibopm

Lo shiel è questo

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


icio


Cambia questo :
Code: [Select]
  pinMode(10, OUTPUT);
in
Code: [Select]
  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

bibopm

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

icio

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

cyberhs

Credo però ci sia un altro errore:

Code: [Select]
int pin = 0; // analog pin

Il pin non dovrebbe essere A0?

icio

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

cyberhs

Quote
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:

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

uwefed

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

leo72

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.

cyberhs

Uwe, Leo avete ragione non è un errore.

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

Go Up