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.
#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.
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
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();
}
}