ethernet e sd

Salve,
sto provando a utilizzare una scheda ethernet e una scheda sd.

Riesco a registrare i dati o sulla sd oppure in un db tramite pagina web. Però se provo a registrare sia su db che su sd insieme funziona solo la registrazione sul db mentre la scheda sd mi da errore.

Possibile conflitto tra scheda ethernet e sd? Tenete conto che uso una shield ethernet con inclusa scheda sd

Post codice che vediamo

Oltre al codice, posta anche link alla tua shield (il tuo esatto modello) e se hai altri componenti collegati ad Arduino oltre a quella.

Sia la Ethernet che la SD usano la comunicazione SPI. Devi abilitare di volta in volta l'interfaccia con cui vuoi comunicare abilitando il pin SS specifico. (di solito 4 e 10)

PaoloP:
Sia la Ethernet che la SD usano la comunicazione SPI. Devi abilitare di volta in volta l'interfaccia con cui vuoi comunicare abilitando il pin SS specifico. (di solito 4 e 10)

Non so se ho capito bene, ma le due periferiche condividono il bus SPI con pin SS diversi quindi possono teoricamente coesistere tranquillamente perché i pin SS sono diversi (anche nella mia shield sono 4 e 10), a meno che non ci sia qualche problema in come inizializzi i due device, o nello shield o nella sua progettazione.

Comunque sia, per capire ci serve lo sketch, il link alla shield specifica e sapere se ha altri device

EDIT: confermo che il problema potrebbe essere nel setup() ossia quando si inizializza la SD va disabilitata la Ethernet e solo alla fine fare Ethernet.begin(). Per cui appena vedremo lo sketch potremo dire qualcosa di più...

Ho collegato una shield ethernet con sd.
Se scollego il cavo di rete funziona la registrazione su sd, se collego il cavo di rete la registrazione su sd non funziona più e funziona la registrazione su db.

Grazie mille. Spero sia chiaro

/*COLLEGAMENTI
OROLOGIO DS1302 

VCC 3V
GND
CLK DIGITALE 4
DATA DIGITALE 3
RST DIGITALE 2


SENSORE DS18B20
VCC  5V
GND
CENTRALE PIN DIGITALE 7  COLLEGARE RESISTENZA DA 10K TRA CENTRALE E VCC

*/


#include <DS1302.h>

// Init the DS1302
DS1302 rtc(2, 3, 4);
String giorno ;
String dataintera ;
String orario ;




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

File myFile;
float gradi ;




#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 8
OneWire ourWire(ONE_WIRE_BUS);
DallasTemperature sensors(&ourWire);


// #include <SPI.h> // già inclusa per sd
#include <Ethernet.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress server(indirizzo server); // indirizzo ip server locale
IPAddress ip(arduino); // indirizzo ip arduino
EthernetClient client;
String strURL = "";




void setup() 
{

Serial.begin(9600);


Ethernet.begin(mac,ip);

// orologio
  rtc.halt(false);
  rtc.writeProtect(false);

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

 
  
Serial.println("Misura la temperatura con sensore DS18B20");
Serial.println("continua la misurazione");
delay(1000);
sensors.begin();


}

void loop() 
{
Serial.println();
sensors.requestTemperatures();
Serial.print("Temperatura = ");
Serial.print(sensors.getTempCByIndex(0));
Serial.println(" gradi C");

gradi = sensors.getTempCByIndex(0);


// Send Day-of-Week
  Serial.print(rtc.getDOWStr());
 Serial.print(" ");
giorno =  rtc.getDOWStr() ; 
  // Send date
  Serial.print(rtc.getDateStr());
  Serial.print(" -- ");
dataintera = rtc.getDateStr() ;
  // Send time
  Serial.println(rtc.getTimeStr());
orario = rtc.getTimeStr();




delay(1000);


// apro sd
  myFile = SD.open("orario.txt", FILE_WRITE);

  // if the file opened okay, write to it:
  if (myFile) {
    Serial.print("Scrivo sul file di testo");
    myFile.println(String(testo) + "\," + String(giorno) + "\," + String(dataintera) + "\," + String(orario) );
    
    // chiudo file:
    myFile.close();
    Serial.println("done.");
  } else {
    //errore
    Serial.println("errore apertura file di testo");
  }

UpdateTemp();
}




void UpdateTemp()
{
  // char server[] = "/arduino/arduinotab.php";
 if (client.connect(server, 8081))
 {

/*QUESTA PARTE APRO PAGINA ARDUINOTAB,PHP PASSANDO IN GET VALORE TEMPERATURA CHE REGISTRO SU DB*/
 //creo l'url utilizzando una stringa
  strURL = "GET /arduino/arduinotemp.php?temperatura=";
  strURL += gradi;
 strURL += "&giorno=";
 strURL += giorno;
 strURL += "&dataintera=";
 strURL += dataintera;
 strURL += "&orario=";
 strURL += orario;
 
 //invio la richiesta al server
 client.println(strURL);
client.println("Host: arduino");
    
 client.println("Connection: close");
 client.println();
 //chiudo la connessione
 client.stop();
 }
 else
 {
 // errore di connessione
 }
}

Ma se sai che la SD ha come pin di chipselect il 4

if (!SD.begin(4)) {

perchè usi lo stesso pin anche per l'RTC ?

DS1302 rtc(2, 3, 4)

Ho provato a spostare anche il pin 4 al pin 5 ma stessa cosa.

Prima di scrivere sulla SD prova a dare le istruzioni

digitalWrite(10, HIGH);
digitalWrite(4, LOW);

e prima di consultare la Ethernet

digitalWrite(10, LOW);
digitalWrite(4, HIGH);

Niente da fare.

Grazie mille per l'aiuto.

Ho risolto, era un problema di memoria. Ho eliminato alcuni println e ora funziona tutto, registro sia su sd che su db. Salta giusto la registrazione di un record sul db ogni tanto.
Però funziona tutto.

Ho anche tolto

digitalWrite(10, LOW);
 digitalWrite(4, HIGH);

funziona lo stesso.

grazie mille

Non speravo di riuscire a fare una cosa del genere in poco tempo (anche se è molto elementare)

michelearduino:
Ho risolto, era un problema di memoria. Ho eliminato alcuni println e ora funziona tutto, registro sia su sd che su db. Salta giusto la registrazione di un record sul db ogni tanto.

Bene, ma non benissimo. Nel senso che se "salta la registrazione ogni tanto" non mi convince :wink:
Se avevi quasi saturato la memoria è possibile che abbia comportamenti anomali, ma insomma... Intanto comunque sulle stringhe usa F() (es. "Serial.println(F("Messaggio di prova"));") per usare la flash e risparmiare RAM, però resta il fatto che apparentemente avevi il pin 4 usato sia dalla SD sia dall'RTC...