[SOLVED] ethernet shield use ethernet and sd in time

Hi! i have a arduino mega with a ethernet shield. I would like use sd and ethened. I can work with both in the code but the ethernet only connect one time and then I did not connect with him again

#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>
#include "DHT.h"  //libreria sensor de humedad
 
#define DHTPIN 2 // pìn sensor de humedad
#define DHTTYPE DHT11  // tipo de sensor


#define SPI_SD 8 // pin tarjeta sd
#define SPI_ETHERNET 53 // para sd

DHT dht(DHTPIN, DHTTYPE); // sensor humedad
File myFile;
// modulo ethernet
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // viene sin mac
char server[] = "www.domain++++.com";
IPAddress ip(192,168,1,35);
EthernetClient client;

int mrelojes[9][7]; // matriz de relojes la ultima posicion la posicion de memoria En este orden fluo1 fluo2 ledapoyo luna aire uv co2 ko fe

// bluetooth variables
char letra; // cada caracter que va leyendo bluetooth
char cadena[255]; // array de caracteres
int i=0; // tamaño del array
boolean cadenacompleta=false; //si la cadena esta completa 

// sondas
float temperatura[3]; // temperaturas
float ph=0;
int lluvia=0;
int boya=0;

// hora
byte second, minute, hour,dayOfMonth, month, year;

long tiempoblue=0;
long ultimotiempoblue=0;

//
int primerencendido=1;

// variables sensor de humedad
int humedad=0;
int tempservidor=0;
long tiempohumedad=0;
long ultimotiempohu=0;





 
void setup()
{
    
    Serial.begin(9600);
    Serial1.begin(9600);
    dht.begin();
     // modulo sd y ethernet
    pinMode(SPI_SD, OUTPUT);
    pinMode(SPI_ETHERNET, OUTPUT);
    Serial.print("Inicializando sd...");
    EnableSD();
    if (!SD.begin(4)) {
    Serial.println("Fallo iniciando sd!");
    return;
    }
    Serial.println("Tarjeta sd montada correctamente");
    
 // cliente web
 //Iniciamos cliente web
    EnableEthernet();
    if (Ethernet.begin(mac) == 0) 
    {
      Serial.println("Failed to configure Ethernet using DHCP");
      // no point in carrying on, so do nothing forevermore:
      // try to congifure using IP address instead of DHCP:
      Ethernet.begin(mac, ip);
    }
    // give the Ethernet shield a second to initialize:
    delay(1000);
    Serial.println("connecting...");
    // if you get a connection, report back via serial:
    if (client.connect(server, 80)) 
    {
      Serial.println("connected");
      // Make a HTTP request:
      client.println("GET /search?q=arduino HTTP/1.1");
      client.println("Host: www.domain**.com");
      client.println("Connection: close");
      client.println();
    }
    else {
      // kf you didn't get a connection to the server:
      Serial.println("connection failed");
    }
    
 }

then in the code i use for example

EnableEthernet();
  if (client.connect(server, 80)) 
  {
    Serial.println("Conectado servidor");
    client.print("GET /iot.php?s1="); // Enviamos los datos por GET
    client.print(temperatura[0]);
    client.print("&s2=");
    client.print(temperatura[1]);
    client.print("&s3=");
    client.print(temperatura[2]);
    client.print("&ph=");
    client.print(ph);
    client.print("&boya=");
    client.print(boya);
    client.print("&lluvia=");
    client.print(lluvia);
    client.println(" HTTP/1.0");
    client.println("Host: www.arduacuario.com");
    client.println("User-Agent: Arduino 1.0");
    client.println();
    Serial.println("Conectado");
  }
  
  EnableSD();
  myFile = SD.open("log.txt", FILE_WRITE);
  if (myFile) 
      {
        Serial.print("Escribiendo log en sd...");
        myFile.println(" Enviados datos al servidor ");
        myFile.close();
        Serial.println("cerrado archivo");
        
      }
      else
      {
        Serial.println("error abriendo log.txt");
      }
 void EnableSD(){
    //Para comunicar con sd desabilitamos w5100 spi (pin 10 HIGH)
    // Para comunicar con sd habilitamos sd spi (pin 4 low)
    digitalWrite(SPI_SD, LOW);
    digitalWrite(SPI_ETHERNET, HIGH);
    }
    void EnableEthernet(){
    //Para comunicar con sd habilitamos w5100 spi (pin 10 low)
    // Para comunicar con sd deshabilitamos sd spi (pin 4 HIGH)
    digitalWrite(SPI_SD, HIGH);
    digitalWrite(SPI_ETHERNET, LOW);
    }

when i connect in second time to ethernet
this if dont pass

if (client.connect(server, 80)) 
  {

You are using the wrong pins for the slave select pins. Don't use D8 and D53. They are D4 and D10.

// SD SS is D4, and w5100 SS is D10
#define SPI_SD 4 // pin tarjeta sd
#define SPI_ETHERNET 10 // para w5100

// and in setup set both SS pins HIGH
    pinMode(SPI_SD, OUTPUT);
    digitalWrite(SPI_SD, HIGH);
    pinMode(SPI_ETHERNET, OUTPUT);
    digitalWrite(SPI_ETHERNET, HIGH);

Once these are set, you do not need to worry about the SS pins. The SD and ethernet libraries take care of those.

edit: Changed comment on the ethernet ss define.

Hi the code dont work… I have a arduino mega i think the ss pin are different. I changed this for your pins and the code one work one time then the w5100 dont connect again.
I try to not changed in the code the ss pins with the same results.

i make a symple code to try it with the same resoult.

#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>
#include "DHT.h"  //libreria sensor de humedad
 
#define DHTPIN 2 // pìn sensor de humedad
#define DHTTYPE DHT11  // tipo de sensor


#define SPI_SD 4 // pin tarjeta sd
#define SPI_ETHERNET 10 // para sd

DHT dht(DHTPIN, DHTTYPE); // sensor humedad
File myFile;
// modulo ethernet
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // viene sin mac
char server[] = "www.domain**.com";
IPAddress ip(192,168,1,35);
EthernetClient client;



long tiempoblue=0;
long ultimotiempoblue=0;

//
int primerencendido=1;

// variables sensor de humedad
int humedad=0;
int tempservidor=0;
long tiempohumedad=0;
long ultimotiempohu=0;
void setup()
{
    
    Serial.begin(9600);
    Serial1.begin(9600);
    dht.begin();
     // modulo sd y ethernet
    pinMode(SPI_SD, OUTPUT);
    digitalWrite(SPI_SD, LOW);
    pinMode(SPI_ETHERNET, OUTPUT);
    digitalWrite(SPI_ETHERNET, LOW);
    Serial.print("Inicializando sd...");
    EnableSD();
    if (!SD.begin(4)) {
    Serial.println("Fallo iniciando sd!");
    return;
    }
    Serial.println("Tarjeta sd montada correctamente");
    
 
 }
 
 void loop()
{
   
 tiempoblue=millis();

 if (tiempoblue-ultimotiempoblue>10000)
 {
 
  sensorhumedad();
  ultimotiempoblue=tiempoblue;
 }
}


void sensorhumedad()
{
  tiempohumedad=millis();
  
  if (tiempohumedad-ultimotiempohu>1000)
  {
    humedad=dht.readHumidity();
    tempservidor=dht.readTemperature();
    if (isnan(tempservidor) || isnan(humedad)) // funcion que comprueba si son numeros las variables indicadas
      {
        Serial.println("Fallo al leer del sensor DHT"); //Mostramos mensaje de fallo si no son numeros
        EnableSD();
        myFile = SD.open("hume.txt", FILE_WRITE);
    
        if (myFile) 
          {
            Serial.print("Escribiendo log en sd...");
            
            myFile.println("hora..");
            myFile.print("Fallo al leer el sensor de humedad");
            // close the file:
            myFile.close();
            
        
          }
          else
          {
            Serial.println("error abriendo log.txt");
          }
    
      } 
    else 
      {
        //Mostramos mensaje con valores actuales de humedad y temperatura, asi como maximos y minimos de cada uno de ellos
        Serial.print("Humedad relativa: ");
        Serial.print(humedad);
        Serial.print(" %\t");
        Serial.print("Temperatura: ");
        Serial.print(tempservidor);
        Serial.println(" *C");
        myFile = SD.open("hume.txt", FILE_WRITE);
    
        if (myFile) 
          {
            Serial.print("Escribiendo log en sd...");
            
            myFile.println("humedad leida");
        
            // close the file:
            myFile.close();
            
        
          }
      }
      
  delay(1000);
  EnableEthernet();
  if (Ethernet.begin(mac) == 0) 
    {
      Serial.println("Failed to configure Ethernet using DHCP");
      // no point in carrying on, so do nothing forevermore:
      // try to congifure using IP address instead of DHCP:
      Ethernet.begin(mac, ip);
    }
    // give the Ethernet shield a second to initialize:
    delay(1000);
    Serial.println("connecting...");
    // if you get a connection, report back via serial:
  delay(1000);
  if (client.connect(server, 80)) 
  {
    Serial.println("Conectado servidor");
    client.print("GET /humedad.php?temp="); // Enviamos los datos por GET
    client.print(tempservidor);
    client.print("&humedad=");
    client.print(humedad);
    client.println(" HTTP/1.0");
    client.println("Host: www.++domain++.com");
    client.println("User-Agent: Arduino 1.0");
    client.println();
    Serial.println("Conectado");
  }else
  {
     Serial.println("Error subiendo al servidor humedad");
  }
  ultimotiempohu=tiempohumedad;
  }
}

void EnableSD(){
    
   //Para comunicar con sd desabilitamos w5100 spi (pin 10 HIGH)
    // Para comunicar con sd habilitamos sd spi (pin 4 low)
    digitalWrite(SPI_SD, LOW);
    digitalWrite(SPI_ETHERNET, HIGH);
    
  }
    void EnableEthernet(){
    //Para comunicar con sd habilitamos w5100 spi (pin 10 low)
    // Para comunicar con sd deshabilitamos sd spi (pin 4 HIGH)
    digitalWrite(SPI_SD, HIGH);
    digitalWrite(SPI_ETHERNET, LOW);
    
  }

Thank you

Hi the code dont work… I have a arduino mega i think the ss pin are different.

Actually, the pins are not different on the Mega. The SPI data lines are on the ICSP pins just like the Uno. The w5100 slave select is D10 and the SD slave select is D4, just like the Uno.

Your Ethernet.begin() function call should be in setup with the SD.begin() call.

I don’t see where you are reading the response or closing the connection. That will cause problems.

edit: You don’t need the EnableSD or EnableEthernet functions. The SD and ethernet libraries take care of those pins for you.

hi
I continued doing tests . I still can not get it to work .
i change the code.

#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>
#include "DHT.h"  //libreria sensor de humedad
 
#define DHTPIN 2 // pìn sensor de humedad
#define DHTTYPE DHT11  // tipo de sensor


#define SPI_SD 4 // pin tarjeta sd
#define SPI_ETHERNET 10 // para sd

DHT dht(DHTPIN, DHTTYPE); // sensor humedad
File myFile;
// modulo ethernet
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // viene sin mac
char server[] = "www.**.com";
IPAddress ip(192,168,1,35);
EthernetClient client;



long tiempoblue=0;
long ultimotiempoblue=0;

//
int primerencendido=1;

// variables sensor de humedad
int humedad=0;
int tempservidor=0;
long tiempohumedad=0;
long ultimotiempohu=0;
void setup()
{
    
    Serial.begin(9600);
    Serial1.begin(9600);
    
    dht.begin();
     // modulo sd y ethernet
    pinMode(SPI_SD, OUTPUT);
    digitalWrite(SPI_SD, HIGH);
    pinMode(SPI_ETHERNET, OUTPUT);
    digitalWrite(SPI_ETHERNET, HIGH);
    
    SD.begin();
    Serial.print("Inicializando sd...");
    
    if (!SD.begin(4)) {
    Serial.println("Fallo iniciando sd!");
    return;
    }
    Serial.println("Tarjeta sd montada correctamente");
    if (Ethernet.begin(mac) == 0) 
    {
      Serial.println("Failed to configure Ethernet using DHCP");
      // no point in carrying on, so do nothing forevermore:
      // try to congifure using IP address instead of DHCP:
      Ethernet.begin(mac, ip);
    }
    // give the Ethernet shield a second to initialize:
    delay(1000);
    Serial.println("connecting...");
    // if you get a connection, report back via serial:
  delay(1000);
    
 
 }
 
 void loop()
{
   
 tiempoblue=millis();

 if (tiempoblue-ultimotiempoblue>10000)
 {
 
  sensorhumedad();
  ultimotiempoblue=tiempoblue;
 }
}


void sensorhumedad()
{
  tiempohumedad=millis();
  
  if (tiempohumedad-ultimotiempohu>1000)
  {
    humedad=dht.readHumidity();
    tempservidor=dht.readTemperature();
    if (isnan(tempservidor) || isnan(humedad)) // funcion que comprueba si son numeros las variables indicadas
      {
        Serial.println("Fallo al leer del sensor DHT"); //Mostramos mensaje de fallo si no son numeros
        
        myFile = SD.open("hume.txt", FILE_WRITE);
    
        if (myFile) 
          {
            Serial.print("Escribiendo log en sd...");
            
            myFile.println("hora..");
            myFile.print("Fallo al leer el sensor de humedad");
            // close the file:
            myFile.close();
            
        
          }
          else
          {
            Serial.println("error abriendo log.txt");
          }
    
      } 
    else 
      {
        //Mostramos mensaje con valores actuales de humedad y temperatura, asi como maximos y minimos de cada uno de ellos
        Serial.print("Humedad relativa: ");
        Serial.print(humedad);
        Serial.print(" %\t");
        Serial.print("Temperatura: ");
        Serial.print(tempservidor);
        Serial.println(" *C");
        
        
 
        
        //SD
        myFile = SD.open("hume.txt", FILE_WRITE);
    
        if (myFile) 
          {
            Serial.print("Escribiendo log en sd...");
            
            myFile.println("humedad leida");
        
            // close the file:
            myFile.close();
            
        
          }
      }
      
  delay(1000);
  
  //Ethernet
        
        if (client.connect(server, 80)) 
  {
    Serial.println("Conectado servidor");
    client.print("GET /humedad.php?temp="); // Enviamos los datos por GET
    client.print(tempservidor);
    client.print("&humedad=");
    client.print(humedad);
    client.println(" HTTP/1.0");
    client.println("Host: www.***.com");
    client.println("User-Agent: Arduino 1.0");
    client.println("Connection: close");
    
    client.println();
    Serial.println("Conectado");
  }else
  {
     Serial.println("Error subiendo al servidor humedad");
  }
  ultimotiempohu=tiempohumedad;
  }
  
  
  
}

i create other code only with ethernet and erase all sd reference Becouse i think the problem are in the part. And NOt work. The code crash when the arduino send the data one time

The new code

#include <SPI.h>
#include <Ethernet.h>
//#include <SD.h>
#include "DHT.h"  //libreria sensor de humedad
 
#define DHTPIN 2 // pìn sensor de humedad
#define DHTTYPE DHT11  // tipo de sensor


//#define SPI_SD 4 // pin tarjeta sd
#define SPI_ETHERNET 10 // para sd

DHT dht(DHTPIN, DHTTYPE); // sensor humedad

// modulo ethernet
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // viene sin mac
char server[] = "www.***.com";
IPAddress ip(192,168,1,35);
EthernetClient client;



long tiempoblue=0;
long ultimotiempoblue=0;

//
int primerencendido=1;

// variables sensor de humedad
int humedad=0;
int tempservidor=0;
long tiempohumedad=0;
long ultimotiempohu=0;
void setup()
{
    
    Serial.begin(9600);
    Serial1.begin(9600);
    
    dht.begin();
     // modulo sd y ethernet
    
    pinMode(SPI_ETHERNET, OUTPUT);
    digitalWrite(SPI_ETHERNET, LOW);
    
   
    
  
    if (Ethernet.begin(mac) == 0) 
    {
      Serial.println("Failed to configure Ethernet using DHCP");
      // no point in carrying on, so do nothing forevermore:
      // try to congifure using IP address instead of DHCP:
      Ethernet.begin(mac, ip);
    }else
    {
      Serial.println("Ethernet iniciado");
    }
    // give the Ethernet shield a second to initialize:
    delay(1000);
    Serial.println("connecting...");
    // if you get a connection, report back via serial:
  delay(1000);
    
 
 }
 
 void loop()
{
   
 tiempoblue=millis();

 if (tiempoblue-ultimotiempoblue>10000)
 {
 
  sensorhumedad();
  ultimotiempoblue=tiempoblue;
 }
}


void sensorhumedad()
{
  tiempohumedad=millis();
  
  if (tiempohumedad-ultimotiempohu>1000)
  {
    humedad=dht.readHumidity();
    tempservidor=dht.readTemperature();
    if (isnan(tempservidor) || isnan(humedad)) // funcion que comprueba si son numeros las variables indicadas
      {
        Serial.println("Fallo al leer del sensor DHT"); //Mostramos mensaje de fallo si no son numeros
        
        
    
      } 
    else 
      {
        //Mostramos mensaje con valores actuales de humedad y temperatura, asi como maximos y minimos de cada uno de ellos
        Serial.print("Humedad relativa: ");
        Serial.print(humedad);
        Serial.print(" %\t");
        Serial.print("Temperatura: ");
        Serial.print(tempservidor);
        Serial.println(" *C");
             
      }
      
  delay(1000);
  
  //Ethernet
        
        if (client.connect(server, 80)) 
  {
    Serial.println("Conectado servidor");
    client.print("GET /humedad.php?temp="); // Enviamos los datos por GET
    client.print(tempservidor);
    client.print("&humedad=");
    client.print(humedad);
    client.println(" HTTP/1.0");
    client.println("Host: www.***.com");
    client.println("User-Agent: Arduino 1.0");
    client.println("Connection: close");
    
    client.println();
    Serial.println("Datos enviado OK");
  }else
  {
     Serial.println("Error subiendo al servidor humedad");
  }
  ultimotiempohu=tiempohumedad;
  }
  
  
  
}

The code only work 3 times. In the first time work ok the second time not connect to server and the 3 time crash. I understand it.

i tried to change digitalWrite(SPI_ETHERNET, HIGH); to LOW becouse the ehterned shield isnt original with the same resoult.

Thank you

You are not reading the response from the server or closing the connection.

  if (client.connect(server, 80)) 
  {
    Serial.println("Conectado servidor");
    client.print("GET /humedad.php?temp="); // Enviamos los datos por GET
    client.print(tempservidor);
    client.print("&humedad=");
    client.print(humedad);
    client.println(" HTTP/1.0");
    client.println("Host: www.***.com");
    client.println("User-Agent: Arduino 1.0");
    client.println("Connection: close");
    
    client.println();

// add this
    while(client.connected()) {
        while(client.available()) {
            char ch = client.read();
            Serial.write(ch);
        }
    }

// and this
    client.stop();

    Serial.println("Datos enviado OK");
  }else
  {
     Serial.println("Error subiendo al servidor humedad");
  }

WORK!!! :grin: :grinning: I´m happy!
Thank you very much SruferTIM!!
This code work ok. Its a humedity senson connect to arduino and then the arduino upload the humedity and temp to sql tablet.

#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>
#include "DHT.h"  //libreria sensor de humedad
 
#define DHTPIN 2 // pìn sensor de humedad
#define DHTTYPE DHT11  // tipo de sensor


#define SPI_SD 4 // pin tarjeta sd
#define SPI_ETHERNET 10 // para sd

DHT dht(DHTPIN, DHTTYPE); // sensor humedad
File myFile;
// modulo ethernet
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // viene sin mac
char server[] = "www.domain.com";
IPAddress ip(192,168,1,35);
EthernetClient client;



long tiempoblue=0;
long ultimotiempoblue=0;

//
int primerencendido=1;

// variables sensor de humedad
int humedad=0;
int tempservidor=0;
long tiempohumedad=0;
long ultimotiempohu=0;
void setup()
{
    
    Serial.begin(9600);
    Serial1.begin(9600);
    
    dht.begin();
     // modulo sd y ethernet
    pinMode(SPI_SD, OUTPUT);
    digitalWrite(SPI_SD, HIGH);
    pinMode(SPI_ETHERNET, OUTPUT);
    digitalWrite(SPI_ETHERNET, HIGH);
    
    SD.begin();
    Serial.print("Inicializando sd...");
    
    if (!SD.begin(4)) {
    Serial.println("Fallo iniciando sd!");
    return;
    }
    Serial.println("Tarjeta sd montada correctamente");
    if (Ethernet.begin(mac) == 0) 
    {
      Serial.println("Failed to configure Ethernet using DHCP");
      // no point in carrying on, so do nothing forevermore:
      // try to congifure using IP address instead of DHCP:
      Ethernet.begin(mac, ip);
    }
    // give the Ethernet shield a second to initialize:
    delay(1000);
    Serial.println("connecting...");
    // if you get a connection, report back via serial:
  delay(1000);
    
 
 }
 
 void loop()
{
   
 tiempoblue=millis();

 if (tiempoblue-ultimotiempoblue>10000)
 {
 
  sensorhumedad();
  ultimotiempoblue=tiempoblue;
 }
}


void sensorhumedad()
{
  tiempohumedad=millis();
  
  if (tiempohumedad-ultimotiempohu>1000)
  {
    humedad=dht.readHumidity();
    tempservidor=dht.readTemperature();
    if (isnan(tempservidor) || isnan(humedad)) // funcion que comprueba si son numeros las variables indicadas
      {
        Serial.println("Fallo al leer del sensor DHT"); //Mostramos mensaje de fallo si no son numeros
        
        myFile = SD.open("hume.txt", FILE_WRITE);
    
        if (myFile) 
          {
            Serial.print("Escribiendo log en sd...");
            
            myFile.println("hora..");
            myFile.print("Fallo al leer el sensor de humedad");
            // close the file:
            myFile.close();
            
        
          }
          else
          {
            Serial.println("error abriendo log.txt");
          }
    
      } 
    else 
      {
        //Mostramos mensaje con valores actuales de humedad y temperatura, asi como maximos y minimos de cada uno de ellos
        Serial.print("Humedad relativa: ");
        Serial.print(humedad);
        Serial.print(" %\t");
        Serial.print("Temperatura: ");
        Serial.print(tempservidor);
        Serial.println(" *C");
        
        
 
        
        //SD
        myFile = SD.open("hume.txt", FILE_WRITE);
    
        if (myFile) 
          {
            Serial.print("Escribiendo log en sd...");
            
            myFile.println("humedad leida");
        
            // close the file:
            myFile.close();
            
        
          }
      }
      
  delay(1000);
  
  //Ethernet
        
        if (client.connect(server, 80)) 
  {
    Serial.println("Conectado servidor");
    client.print("GET /humedad.php?temp="); // Enviamos los datos por GET
    client.print(tempservidor);
    client.print("&humedad=");
    client.print(humedad);
    client.println(" HTTP/1.0");
    client.println("Host: www.domain.com");
    client.println("User-Agent: Arduino 1.0");
    client.println("Connection: close");
    
    client.println();
    
    while(client.connected()) {
        while(client.available()) {
            char ch = client.read();
            Serial.write(ch);
        }
    }
    
    client.stop();
    
    Serial.println("Datos enviado OK");
  
  }else
  {
     Serial.println("Error subiendo al servidor humedad");
  }
  ultimotiempohu=tiempohumedad;
  }
  
  
  
}

Thank you very much sufertim!