Conectar modulo W5100 (shield ethernet) y módulo SIM900 (Shield GSM/GPRS)

Hola, tengo una duda. Me gustaría saber si se puede conectar a la vez un módulo W5100 y un módulo SIM900 a un arduino mega 2560. Quiero poder usar un servidor web para monitorizar el estado de una variable y a la vez que si esa variable llega a un determinado valor, que me mande un SMS para avisarme.

Muchas gracias de antemano, un saludo

Si, se puede.

Por si te llegaras a encontrar en la misma situación..

Saludos

Genial, lo probaré con el siguiente código:

#include <SPI.h>
#include <Ethernet.h>
#include <GSM.h>

// Definición de variables globales
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 1, 177);
EthernetServer server(80);
int contador = 10;
int boton = 2;

// Configuración del módulo GSM/GPRS
GSM gsmAccess;
GSM_SMS sms;
char phone[] = "+1234567890";  // Número de teléfono para enviar el mensaje

void setup() {
  pinMode(boton, INPUT);
  Ethernet.begin(mac, ip);
  server.begin();

  // Inicialización del módulo GSM/GPRS
  while (gsmAccess.begin() != GSM_READY) {
    delay(1000);
  }
}

void loop() {
  // Lee el estado del pulsador
  int estadoBoton = digitalRead(boton);
  if (estadoBoton == HIGH) {
    // Decrementa el contador
    contador--;

    // Si el contador es menor que 5, envía un mensaje SMS
    if (contador < 5) {
      sendSMS();
    }
  }

  // Maneja las conexiones entrantes
  EthernetClient client = server.available();
  if (client) {
    // Lee la petición del cliente
    String request = client.readStringUntil('\r');
    client.flush();

    // Si la petición es un POST (es decir, se envió el formulario)
    if (request.indexOf("POST") != -1) {
      // Extrae el nuevo valor del contador del formulario
      int nuevoContador = 0;
      if (request.indexOf("contador=") != -1) {
        nuevoContador = request.substring(request.indexOf("contador=") + 9).toInt();
        contador = nuevoContador;
      }
    }

    // Envía la respuesta al cliente
    client.println("HTTP/1.1 200 OK");
    client.println("Content-Type: text/html");
    client.println();
    client.println("<html>");
    client.print("<p>Contador: ");
    client.print(contador);
    client.println("</p>");
    client.println("<form method=\"POST\">");
    client.println("Nuevo valor del contador: <input type=\"text\" name=\"contador\"><br>");
    client.println("<input type=\"submit\" value=\"Cambiar\"><br>");
    client.println("</form>");
    client.println("</html>");
  }
}

void sendSMS() {
  // Crea el mensaje SMS
  char message[50];
  sprintf(message, "El contador ha bajado a %d", contador);

  // Envía el mensaje SMS
  sms.beginSMS(phone);
  sms.print(message);
  sms.endSMS();
}

La idea es hacerlo con 20 pulsadores cada uno vinculado a un contador.

Alimentaré la placa de arduino mega con 9V 2A y probaré a poner primero el shield W5100 y encima el shield SIM900.

Según he visto, estos 4 pines del shield tienen que ir doblados un poco para afuera para que no conecten con la placa mega y luego hacerle un puente asi:

ethernet <> mega
13----------->52
12----------->50
11----------->51
10----------->53

Esta configuración es si quieres usar también una micro sd no? (Que no sería mi caso) por el tema de que entre en conflicto los pines SPI.

No tengo idea, no he usado ninguna de las 3 placas. :laughing:
Seguramente googleando un poco te saques las dudas, yo no puedo aportarte más.

Si, es correcto.

MODELO SS MOSI MISO SCK
Uno 10 11 12 13
Nano 10 11 12 13
Mini Pro 10 11 12 13
Mega 53 51 50 52

El pin SS por hardware se emplea al usar Arduino como esclavo . En caso de usar Arduino como maestro, podemos usar cualquier pin como SS, o varios en caso de disponer de varios esclavos.

Entonces según lo que propongo hacer, la placa de arduino mega sería el maestro, verdad? Y los esclavos el W5100 y el SIM900. Conectándolo como dices debería de funcionar, aún no me ha llegado el SIM900, a ver si logro que funcione y que no interfiera uno con el otro

Usalo con el reemplazo que tu mismo sugeriste y va a funcionar.

Mira esto, te ahorras la placa SIM900 que por cierto ya esta obsoleta salvo por los SMS. Tenlo presente.

Aca lo haces con ESP32 que esta mas actual.

Que chulo voy a investigar a ver, muchas gracias! :slight_smile:

Lo estoy simplificando porque no me va bien el servidor, solo he puesto código para el server, me carga todo bien y me muestra el valor actual del contador en 10, hay un form que es para que yo envíe el nuevo valor pero le pongo el valor que sea , me actualiza la página y siempre me sale 10. No se por qué no cambia, este es el código:

#include <SPI.h>
#include <Ethernet.h>

// Definición de variables globales
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 1, 177);
EthernetServer server(80);
int contador = 10;
int boton = 2;

void setup() {
  pinMode(boton, INPUT);
  Ethernet.begin(mac, ip);
  server.begin();
}

void loop() {
  // Lee el estado del pulsador
  int estadoBoton = digitalRead(boton);
  if (estadoBoton == HIGH) {
    // Decrementa el contador
    contador--;
  }

  // Maneja las conexiones entrantes
  EthernetClient client = server.available();
  if (client) {
    // Lee la petición del cliente
    String request = client.readStringUntil('\r');
    client.flush();

    // Si la petición es un POST (es decir, se envió el formulario)
    if (request.indexOf("POST") != -1) {
      // Extrae el nuevo valor del contador del formulario
      int nuevoContador = 0;
      if (request.indexOf("contador=") != -1) {
        nuevoContador = request.substring(request.indexOf("contador=") + 9).toInt();
        contador = nuevoContador;
      }
    }

    // Envía la respuesta al cliente
    client.println("HTTP/1.1 200 OK");
    client.println("Content-Type: text/html");
    client.println();
    client.println("<html>");
    client.print("<p>Contador: ");
    client.print(contador);
    client.println("</p>");
    client.println("<form method=\"POST\">");
    client.println("Nuevo valor del contador: <input type=\"text\" name=\"contador\"><br>");
    client.println("<input type=\"submit\" value=\"Cambiar\"><br>");
    client.println("</form>");
    client.println("</html>");
    client.stop();
  }
}

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.