Uso de w5500, micro SD y mega pro

Hola a todos,
Tengo una consulta que hacer al foro, recién pude adquirir el modulo w5500 lo probé con uno de los tantos programitas que hay en la red y funciona bien, la micro SD también funciona bien, las pruebas lo hice cada modulo por separado uso el mega pro 2560. El problema esta cuando quiero trabajar con estos dos módulos, mi consulta es:
Si las librerías de cada uno de estos dos módulos se encargan de activar/desactivar (o seleccionar) los respectivos SS o es que uno mismo lo tiene que hacer en el código, uso
W5500: pin 10 como SS
microSD: pin 4 como SS

El manejo lo hacen las librerías, solo tienes que indicar los pines a cada una
Por ej. con

Ethernet.init(10);

configuras el CS (o SS) en el pin 10 para la w5500.
Y con

SD.begin(4);

el CS (o SS) en el pin 4 para la SD.

Saludos

Estimado gatul,
Agradezco tu respuesta no se que estoy haciendo mal porque no me esta funcionando, el codigo es simple:

  • Lee un sensor de T° y envia por el serial
  • También envía la T° lo envía por LAN
  • Si el selector esta en LOW graba la T° en la SD.

El problema que tengo es que no envía nada por LAN.
Si hay lectura de T°, si presiono el selector si graba en memoria SD.
Gracias..

#include <SPI.h>                // libreria interfaz SPI (micro SD)
#include <SD.h>                 // incluye libreria para tarjetas SD
#include <Ethernet.h>
#include <OneWire.h>      
#include <DallasTemperature.h>
#include <Wire.h>
#define  pin53 53         // necesario para mega 2560
#define  SSpin 10         // pin 10 para shield 
#define  SDpin 4          // pin 4 para SD

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };  // MAC
IPAddress ip(192,168,1,69);   // Esta direccion IP EthernetServer server(80);

void setup() {
    Ethernet.begin(mac, ip);    // inicializa la conexión Ethernet
    Ethernet.init(SSpin);        // esto ultimo recien lo puse
    server.begin();                  // inicializa el servidor
    Serial.begin(9600);
    pinMode(SELECTOR, INPUT);
    pinMode(LED, OUTPUT);
    pinMode(pin53, OUTPUT);         //
    pinMode(SSpin, OUTPUT); 
    pinMode(SDpin, OUTPUT);
   
    if (! SD.begin (SDpin)){           // inicialización de la tarjeta SD
        serial.print("No se encuentra micro SD");  
        oled.display();
        delay(1000);
        return;                                         // se sale del setup () 
    } 
 }        // fin del setup

void loop() {
   sensors1.requestTemperatures();        // envia comandos
   T[1] = sensors1.getTempC(sensor5);     // toma de lactura
   Serial.println(T[0], 1);

//Ethernet
  EthernetClient cliente = server.available(); // Inicializa client
    if (cliente) {
    boolean currentLineIsBlank = true;
    while (cliente.connected()) {         // entra al while
      if (cliente.available()) {          // si el cliente esta habilitado
        char c = cliente.read();
        if (c == '\n' && currentLineIsBlank) { 
            cliente.println("HTTP/1.1 200 OK");
            cliente.println("Content-Type: text/html");   r
            cliente.println("Connection: close"); 
            cliente.println("Refresh: 3");                // refresca 3 seg
            cliente.println();
            cliente.println("<!DOCTYPE HTML>"); 
            cliente.println("<html>");
            cliente.println("<HEAD>");
            cliente.println("<TITLE>Ethernet Sensor</TITLE>");
            cliente.println("</HEAD>");     
            cliente.println("<BODY  BGCOLOR='#3375FF'>");      
            cliente.println("<hr />");
            cliente.println("<br />");  
            cliente.println(" <H2STYLE='COLOR:WHITE;'>Monitorea Temp g celsius</H2>");
            cliente.println("<br />");               
            cliente.print("<H2 STYLE='COLOR:WHITE;'> Congeladora :   ");   
            cliente.print(T[0], 1);            // envia lectura de T
            cliente.println("<br />");                // salto de linea          
            cliente.println("<br />");          // salto de linea       */   
            cliente.println("<br />");
            cliente.println("</html>");
            break;
        }
        if (c == '\n') {
           currentLineIsBlank = true;
         } 
        else if (c != '\r') {
           currentLineIsBlank = false;
         }
       }
     }
   delay(20);           // Da tiempo al Servidor 
   cliente.stop();      // cierra la conexion
  }

 //microSD solo escribe si esta en bajo
   if (digitalRead(SELECTOR) == LOW){
       digitalWrite(LED, HIGH);
       tiempoFinal = millis(); 
       if (tiempoFinal - tiempoInicial >= 600000){    // escribe cada minuto
            archivoSD = SD.open ("datatemp.txt", FILE_WRITE); 
            if (archivoSD) {            

              archivoSD.println(T[0], 1);       // escribe T en SD         
              Serial.println("escritura correcta");
              archivoSD.close();                // cierre de archivo
             }
          tiempoInicial = millis();
          tiempoFinal = 0;
          delay(100);        
       } 
    }
 }       //    fin del loop
 

Prueba algun ejemplo de la librería para ver si el problema es de la w5500

Hola a todos,
Aquí sigo intentando con mi problema, tengo otra consulta yo estoy usando la librería Ethernet.h, sin embargo en otros ejemplos que revisado en internet usan la librería Ethernet2.h (aun no lo he descargado en mi IDE).
Hay alguna diferencia? Tendrá algo que ver?

image
Estoy usando esta placa W5500

Entiendo que estás intentando montar un server y conectarte remotamente al arduino para obtener la lectura de Tº.
Para ello lo que necesitas es definir qué puerto TCP usará.
Por ejemplo si desde un PC quieres acceder por HTTP (que es lo que parece que intentas hacer) deberás definir en el arduino el puerto 80.

Veo que tienes esta línea:

 server.begin();                  // inicializa el servidor

pero ¿¿¿dónde tienes definido 'server'???
debería ser algo así:

EthernetServer server(80);

Saludos.

Hola DanX3,
Si cuando el selector esta en bajo escribe la T° en la SD.
Decidí anular el termómetro y reemplazarlo con la variable valor que se incrementa con cada ciclo, claro esta esta variable se envia a la red y se graba cuando selector esta en bajo; hice esto solo con la finalidad d hacer mas sencillo el código hasta solucionar.
Pego aquí el código completo

#include <SPI.h>  
#include <Ethernet.h>
#include <SD.h>                 // incluye libreria para tarjetas SD
#define pin53 53        // Slave Select en pin digital
#define SDpin 4
#define SSpin 10

File     archivoSD;

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1,169);  // Esta direccion IP debe ser cambiada obligatoriamente 
                              // dependiendo de la subred de su Area Local y es la que 
                              // usara para conectarse por el Navegador.
byte LED = 25, SELECTOR = 30;
int  valor = 0;
float tiempoFinal, tiempoInicial = 0;
EthernetServer server(80);    // Puerto 80 por defecto para HTTP

 void setup() {
    Serial.begin(9600);
    pinMode(pin53, OUTPUT);
    pinMode(SSpin, OUTPUT);
    pinMode(SDpin, OUTPUT);
    digitalWrite(SSpin, HIGH);
    digitalWrite(SDpin, HIGH);

    Ethernet.begin(mac, ip);    //inicializa la conexión Ethernet y el servidor
    Ethernet.init(SSpin);
    server.begin();    
    if (! SD.begin (SDpin)){             // inicialización de la tarjeta SD
       Serial.print("No hay micro SD");  // escribe en pantalla el texto  
       delay(3000);
       return;                           // se sale del setup () para finalizar el programa
     }

    pinMode(LED, OUTPUT);
    pinMode(SELECTOR, INPUT);
 }   // fin del setup


void loop() {
  digitalWrite(LED, LOW);
  delay(200);
  valor++;
  Serial.println(valor);

  EthernetClient cliente = server.available(); // Inicializa cliente como servidor ethernet
  if (cliente) {
    boolean currentLineIsBlank = true;
    while (cliente.connected()) {
      if (cliente.available()) {
        char c = cliente.read();
        if (c == '\n' && currentLineIsBlank) { 
          cliente.println("HTTP/1.1 200 OK");
          cliente.println("Content-Type: text/html");   // Envia el encabezado en codigo HTML estandar
          cliente.println("Connection: close"); 
          cliente.println("Refresh: 3");  // refresca la pagina automaticamente cada 3 segundos
          cliente.println();
          cliente.println("<!DOCTYPE HTML>"); 
          cliente.println("<html>");
          cliente.println("<HEAD>");
          cliente.println("<TITLE>Ethernet Monitor</TITLE>");
          cliente.println("</HEAD>");
          cliente.println("<BODY>");
          cliente.println("<hr />");
          cliente.println("<H1>Arduino Monitor</H1>");
          cliente.println("<br />");  
          cliente.println("<H2>Monitorea Valor</H2>");
          cliente.println("<br />");  
          cliente.println("Lectura Analoga Ethernet");  
          cliente.println("<br />");
          cliente.println("<br />");
          cliente.print("Valor: ");
          cliente.println(valor);          
          cliente.println("<br />"); 
          cliente.println("elprofegarcia.com"); 
          cliente.println("</html>");
          break;
        }
        if (c == '\n') {
           currentLineIsBlank = true;
        } 
        else if (c != '\r') {
           currentLineIsBlank = false;
        }
      }
    }
   delay(15);          // Da tiempo al Servidor para que reciba los datos 15ms
   cliente.stop();     // cierra la conexion
   delay(200);
  }

  if (digitalRead(SELECTOR) == LOW){
       digitalWrite(LED, HIGH);
       tiempoFinal = millis(); 
       if (tiempoFinal - tiempoInicial >= 10000){             // 20 seg
          archivoSD = SD.open ("datatemp.txt", FILE_WRITE); // apertura para read/w
          if (archivoSD) {            
              archivoSD.println(valor);       // escribe en SD el valor de sensor 0   
              Serial.println("escritura correcta");
              archivoSD.close();                // cierre de archivo
           }
       tiempoInicial = millis();
       tiempoFinal = 0;
       delay(100);        
      }
      //digitalWrite(LED, LOW); 
   }    //   fin de la escritura SD */

  
}

En este código esta pasando que no envía nada por red LAN, si selector esta en bajo si escribe en la micro SD; si quito la alimentación de la micro SD si envía por la red LAN.

Puedes poner este código:

#include <SPI.h>  
#include <Ethernet.h>
#define SSpin 10

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1,169);  
EthernetServer server(80);    // Puerto 80 por defecto para HTTP
String peticionWeb =""; //cadena donde se guarda la petición web (url invocada)

 void setup() 
 {
    pinMode(SSpin, OUTPUT);
    digitalWrite(SSpin, HIGH);
    Ethernet.begin(mac, ip);    //inicializa la conexión Ethernet y el servidor
    Ethernet.init(SSpin);
    server.begin();    
 } 

void loop() 
{
 	EthernetClient cliente = server.available(); // Inicializa cliente como servidor ethernet
	if (cliente) 
	{
		peticionWeb = cliente.readStringUntil('\r');
        if ((peticionWeb.indexOf("index.html")) 
		{ 
			cliente.println("HTTP/1.1 200 OK");
			cliente.println("Content-Type: text/html");
			cliente.println("");
			cliente.println("<!DOCTYPE HTML><HTML><HEAD><TITLE>Ethernet Monitor</TITLE></HEAD><BODY><H1>");
			cliente.println("Arduino Monitor");
			cliente.println("</H1></BODY></HTML>");
		}
    }
}

¿Y desde un PC miras si puedes abrir http://192.168.1.169/index.html ?
¿Puedes paras fotos de las conexiones?
Saludos.

Hola DanX3,
Hice lo que me pediste y no abre nada con http://192.168.1.169/index.html, vuelvo a cargar mi programita y funciona bien claro esta con las observaciones mencionadas.
buscando en la web me di con este foro...
Incompatibilidad módulos ethernet w5500 mini y lector de micro sd | Foros de Electrónica
Voy a comprar este modulo SD, pero en realidad quiero usar la micro SD porque es mas pequeño.

Hola a todos,
Aquí retomando este pequeño proyecto, conseguí el modulo SD pero con el mismo resultado. Decidí tomar la opción 2 que consiste en utilizar 2 arduinos que se van a comunicar vía puerto serial.

Arduino mega pro

  • Lee T° , lo envía a la oled 0.96"
  • Luego esa T° lo envía por puerto serial.

Arduino nano
Recibe la T° por puerto serial y lo envía por LAN.

Por ahora uso el sensor DS18B20 pero a futuro sera el DHT22. Los programitas funcionan bien pero luego de unos 2 a 3 minutos el NANO envía CERO por LAN, si embargo en el mega todo anda bien porque en la oled si veo los valores de T°.
Le doy reset al NANO y luego de unos 2 a 3 minutos de estar funcionando bien vuelve a enviar CERO por LAN.

Para los programas me ayude de este link [Solucionado] Comunicación de dos arduinos - #23 by josue_gonzalezm

// Para el MEGA PRO
float temperatura = 4;// Obtención de la temperatura

void setup() {
  // put your setup code here, to run once:
  Serial1.begin(9600); // Inicia la comunicacion por (Tx1 y Rx1)
  Serial1.flush(); // Depura la informacion
}

void loop() 
{
  Serial1.write((byte*)&temperatura, 4); 
  delay(10); // Valor de ensayo y error. Evita llenar el búfer del receptor en caso de que este sea más lento que el emisor; cosa que muy probablemente ocurra, por ahora estoy con delay(10)
  // Un valor muy alto podría hacer que el flujo de datos deje de ser "constante".
}

Para en NANO:

float temperatura = 0.0;

void setup() {
  // put your setup code here, to run once:
  Serial1.begin(9600);  // Inicia la comunicacion por (Tx1 y Rx1)
  Serial.begin(9600); // Inicia la comunicacion por (Tx0 y Rx0) con el computador
  Serial1.flush();
}

void loop() {
  if (Serial1.available() > 7) { // Este es básicamente el paso 1. 
    // Paso 2:
    Serial1.readBytes((byte*)&temperatura, 4);
  }
 Serial.println(temperatura);

}

Gracias..

El Nano solo tiene un único puerto serie hardware (Serial).
O sea que Serial1 no existe, en todo caso debes emularlo con la librería SoftwareSerial.
Entonces tu código está incompleto, y si lo tienes tal cual, es imposible que compile.

Si las placas están próximas, ¿No pensaste en usar comunicación I2C?

Hola gatul,
Tienes razón el código que puse lineas arriba me sirvió de guía , mi código
es este:

 float temperatura = 0.0;

void setup() {
  Serial.begin(9600);  // Inicia la comunicación
  Serial.flush();
}

void loop() {
  if (Serial.available() > 7) { 
      Serial.readBytes((byte*)&temperatura, 4);
  }
 Serial.println(temperatura);

// en esta sección inicia la comunicación ethernet para enviar la temperatura
// por LAN,  código ya conocido por ello no lo he puesto completo

EthernetClient cliente = server.available(); // Inicializa cliente como serv.
  if (cliente) {
      boolean currentLineIsBlank = true;
      while (cliente.connected()) {
           if (cliente.available()) {
           ....
           }
       }
   }
 
}  // fin de loop

Ojo SI hay transmisión puedo ver en LAN la temperatura pero solo dura 2 a 3 minutos y luego se queda en cero.
Los arduinos están cerca de hecho se van insertar en una carcasa pequeña, elegí transmitir por puerto serial porque fue lo primero que encontré me pareció sencillo, no tengo experiencia para comunicar dos arduinos.
No he probado con I2C, es una mejor opción, me recomiendas?

Gracias

¿Por qué esperas que haya más de 7 caracteres en el buffer (en lugar de 4) si sólo vas a leer 4?

if (Serial.available() > 7) {
  Serial.readBytes((byte*)&temperatura, 4); 
}

O sea, más de 7 son al menos 8, lo que equivale a que lees con una medición de retraso.

Lo cambiaría por

if (Serial.available() >= 4) {

Al margen, ese flush() en setup() no tiene sentido porque el buffer recién creado está vacío, no puede haber nada pendiente de enviarse.

Hola gatul,
Tome en cuenta tus comentarios (para el arduino UNO) pero el resultado es el mismo, me muestra la temperatura por LAN, pasan un par de minutos y me muestra de temperatura 0.0

// probe este  
if (Serial.available() > 3) { // paso 1
      // Paso 2:
      Serial.readBytes((byte*)&temperatura, 4);


//tambien probe este
if (Serial.available() >=4) { // paso 1
      // Paso 2:
      Serial.readBytes((byte*)&temperatura, 4);

En ambo casos pasa mismo.
Estuve leyendo un poco de I2C tengo entendido que el esclavo envía la T° solo cuando el maestro le solicita, parece que es una mejor opción.

Saludos

Estuve probando (simulado en Proteus) una adaptación del código enviando valores float aleatorios de un arduino al otro durante 15 minutos cada 1 segundo sin inconvenientes.
También probé cada 500 mseg con igual resultado.
¿No será que el problema lo genera el módulo ethernet y/o su librería?

Por cierto,

if (Serial.available() > 3) {

y

if (Serial.available() >=4) {

son lo mismo porque un número entero mayor a 3 es, al menos, igual a 4 (o mayor).

Hi,
Porque espera cuando los caracteres son > de 3. Hazlo que sea > 0. Trata a ver si te trabaja mejor ignora el consejo si ya lo trataste.

Hola Tauro022,
Gracias por tu comentario,
Luego de algunos días puedo retomar este asunto pendiente.
Hice lo que me sugeriste y el resultado es el mismo, si hay envío por la LAN pero solo dura un par de minutos y se queda en cero (0.0).
Te comento que estoy probando otro código en el mega 2560 para volver a intentar la opción 1 (hacer todo este proyecto con el mega 2560, w5500, microSD).
La opción 2, en caso no pueda con la opción 1, es hacer el mismo proyecto pero con dos arduinos (mega 2560 y NANO) el primero le envía la T° al segundo y este lo envía por LAN.

Saludos,

Que tiene que ver Serial con una comunicación TCP/IP?

Hola a Surbyte,
No tiene nada que ver, solo quería hacer que un arduino (maestro) le envíe la temperatura (un float) via serial a un arduino nano (esclavo) y este lo envía por LAN.
Lo ideal es hacerlo con un solo arduino mega pero tuve muchos problemas.

Ahora bien, acabo de probar este código que le hice algunos cambios, todo funciona bien, envía la T° por LAN y cuando el selector esta en bajo graba en la micro SD.
Materiales: arduino mega, sensor de T°, shield W5100

Pongo el código:

#include <SPI.h>  
#include <SD.h>
#include <Ethernet.h>
#include <OneWire.h>      
#include <DallasTemperature.h>
#include <Wire.h>

#define  pin53 53         // no usado
#define  SSpin 10         // pin 10 para shield 
#define  SDpin 4          // pin 4 para SD
#define  DATA1 22          // pin digital 22 entrada de datos

File    archivoSD;
OneWire oneWire1(DATA1);     // a futuro sera cambiado por el DHT22

DallasTemperature sensors1 (&oneWire1);  // declara variable/objeto para sensor DATA1
DeviceAddress sensor4 = {0x28, 0xE6, 0x52, 0x95, 0xF0, 0x01, 0x3C, 0xA7};

byte   LED = 25, SELECTOR = 30;
float  Temp, tiempoFinal = 0, tiempoInicial = 0;

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1,169);   //
EthernetServer server(80);    // Puerto 80 por defecto para HTTP

 void setup() {
    Serial.begin(9600);
    delay(500);
    sensors1.setResolution(sensor4, 11);    // sensor1 a resolución de 9 bits
    Ethernet.begin(mac, ip);    //inicializa la conexión Ethernet y el servidor
    server.begin();
    sensors1.begin();
    pinMode(LED, OUTPUT);
    pinMode(SELECTOR, INPUT);
    pinMode(SDpin, OUTPUT);     // SDpin 4
    pinMode(pin53, OUTPUT);     // pin53
    pinMode(SSpin, OUTPUT);     // SSpin 10
    if (! SD.begin (SDpin)){           // inicialización de la tarjeta SD
       Serial.print("No se encuentra micro SD");  // escribe en pantalla el texto  
       delay(3000);
       return; 
    }
    //digitalWrite(SDpin, HIGH);
    //digitalWrite(SSpin, HIGH);
   
 }   // fin del setup 

void loop() {
   digitalWrite(LED, HIGH);
   delay(200);
   sensors1.requestTemperatures();        // envia comandos para tomar lecturas
   Temp = sensors1.getTempC(sensor4);     // toma de lactura del sensor 1
   Serial.println(Temp, 1);
  
   EthernetClient cliente = server.available(); // Inicializa cliente como servidor ethernet
   if (cliente) {
     boolean currentLineIsBlank = true;
     while (cliente.connected()) {
       if (cliente.available()) {
          char c = cliente.read();
          if (c == '\n' && currentLineIsBlank) { 
            cliente.println("HTTP/1.1 200 OK");
            cliente.println("Content-Type: text/html");   // Envia el encabezado en codigo HTML estandar
            cliente.println("Connection: close"); 
            cliente.println("Refresh: 3");  // refresca la pagina automaticamente cada 3 segundos
            cliente.println();
            
            cliente.println("<!DOCTYPE HTML>"); 
            cliente.println("<html>");
            cliente.println("<HEAD>");
            cliente.println("<TITLE>Ethernet REAL TIME</TITLE>");
            cliente.println("</HEAD>");
            cliente.println("<BODY BGCOLOR='#3375FF'>");      // abre el cuerpo de los comando htlm
            cliente.println("<hr />");
            cliente.println("<H1  STYLE='COLOR:#36FF33;'>SALA DE CONGELADORAS </H1>");
            cliente.println("<br />");  
            cliente.println("<BODY  BGCOLOR='#3375FF'>");
            cliente.println("<H2 STYLE='COLOR:WHITE;'>Monitorea Valor</H2>");
            cliente.println("<br />");  
            cliente.println("Lectura de sensores Ethernet");  
            cliente.println("<br />");
            cliente.println("<br />");
            cliente.print("Valor: ");
            cliente.println(Temp, 1);          
            cliente.println("<br />"); 
            cliente.println("Codigo de prueba"); 
            cliente.println("</html>");
            break;
          }
        if (c == '\n') {
           currentLineIsBlank = true;
        } 
        else if (c != '\r') {
           currentLineIsBlank = false;
        }
      }
    }
   delay(15);          // Da tiempo al Servidor para que reciba los datos 15ms
   cliente.stop();     // cierra la conexion
   digitalWrite(LED, LOW);
   delay(100);
  }

  //microSD 
 if (digitalRead(SELECTOR) == LOW){
       digitalWrite(LED, HIGH);
       tiempoFinal = millis(); 
       if (tiempoFinal - tiempoInicial >= 10000){             // 20 seg
          archivoSD = SD.open ("datatemp.txt", FILE_WRITE); // apertura para read/w
          if (archivoSD) {            
              archivoSD.println(Temp, 1);       // escribe en SD el valor de sensor 0
              Serial.println("escritura correcta"); 
                       
             //archivoSD.print(TEMP, 1);
             //archivoSD.print(",");
             //archivoSD.println(HR, 0);      
             //archivoSD.close();                // cierre de archivo
           }
          tiempoInicial = millis();
          tiempoFinal = 0;
          delay(100);        
        } 
    }

}

Pero mi objetivo es reemplazar el mega 2560 y el shield W5100 por el mega PRO y W5500 respectivamente.
Use el mismo código, en la primera prueba que hice el resultado fue que no envía nada por LAN, lo demás si funciona (lee T° y graba en la micro SD).
Que podria ser??

Qué problemas?