Hola. Necesito comunicar dos arduinos por medio de ethernet de tal forma que al momento de que yo envié un pulso en uno de los arduinos el otro al recibirlo active un led por un tiempo definido. La idea es que se conecten directamente es decir del puerto RJ45 de uno directamente al Rj45 del otro, no me ha funcionado, utilice un switch para interconectar los dos arduinos y tampoco me comunica, les dejo el código que utilice para esto, tanto el cliente como el servidor.
cliente
#include <Ethernet.h>
#include <SPI.h>
/*CONFIGURACION DE LOS PARAMETROS ETHERNET CLIENTE*/
byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x2F, 0xE4 };
// byte ip[] = { 192, 168, 1, 178 }; OTRA FORMA DE COLOCAR LA DIRECCION IP
IPAddress ip(192, 168, 1, 178);
byte server[] = { 192, 168, 1, 125 }; // IP DEL ARDUINO SERVIDOR
int SW; // CREA LA VARIABLE DE TIPO ENTERO "SW"
EthernetClient client; // CREA UN CLIENTE, QUE EN ESTE CASO SE LLAMA "client"
void setup()
{
Ethernet.begin(mac, ip, server); // INICIA LA LIBRERÍA ETHERNET Y LA CONFIGURACIÓN DE LA RED
pinMode(3, INPUT); // CONFIGURA EL PIN 3 DE ARDUINO COMO UNA ENTRADA DIGITAL
pinMode(4,OUTPUT); // CONFIGURA EL PIN 4 COMO SALIDA DIGITAL (sd)
digitalWrite(4,HIGH); // COLOCA EL PIN 4 DE LA ARDUINO EN UN NIVEL LÓGICO ALTO
delay(1000);
Serial.begin(9600); // COMIANZA LA COMUNICACIÓN SERIAL A 9600 BAUDIOS DE VELOCIDAD
client.flush(); // DESCARTA TODOS LOS DATOS ALMACENADOS EN EL BUFFER
delay(500);
}
void loop()
{
if(digitalRead(3)== LOW) // SI EL PIN DIGITAL 3 ESTA EN BAJO....... ENTONCES.....
{
Serial.flush(); // LIMPIA EL BUFFER DEL MONITOR SERIAL
Serial.println("Esperando el boton"); // IMPRIME EN EL MONITOR SERIAL
}
else // CASO CONTRARIO A LA CONDICIÓN INICIAL
{
Serial.println("Entrada 3 en alto"); // IMPRIME EN EL MONITOR SERIAL
client.flush(); // NUEVAMENTE LIMPIA LOS DATOS DEL BUFFER DE DATOS DE LA CONEXIÓN ETHERNET
client.connect(server, 12535); // CONECTA EL CLIENTE AL SERVIDOR POR SU IP Y POR EL PUERTO ESPECIFICADO
Serial.println("connected"); // IMPRIME EN MONITO SERIAL
delay(1000);
SW = client.write('P'); // LE ASIGNA LA VARIABLE "SW" EL VALOR QUE SE ESCRIBIRÁ EN EL SERVIDOR
Serial.println(SW); // IMPRIME EL VALOR DE RETORNO DE LA FUNCIÓN WRITE() QUE ES EN BYTES
delay(1000);
}
}
servidor
#include <SPI.h>
#include <Ethernet.h>
/*CONFIGURACION DE LOS PARAMETROS ETHERNET SERVIDOR*/
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
// byte ip[] = { 192, 168, 1, 123 }; OTRA FORMA DE ESCRIBIR LA DIRECCIÓN IP
IPAddress ip(192, 168, 1, 125); // DIRECCIÓN IP ASIGNADA AL SERVIDOR
byte gateway[] = { 192, 168, 1, 1 }; // LA DIRECCIÓN DE PUERTA DE ENLACE AL ROUTER
byte subnet[] = { 255, 255, 255, 0 }; // LA MÁSCARA SUBNET DEL ROUTER
EthernetServer server = EthernetServer(12535); // CREA UN SERVIDOR QUE ESTA ATENTO A CONEXIONES ENTRANTES POR UN PUERTO DADO
void setup()
{
Ethernet.begin(mac, ip, gateway, subnet); // INICIA LA LIBRERÍA ETHERNET Y LA CONFIGURACIÓN DE LA RED
server.begin(); // INDICA AL SERVIDOR QUE COMIENCE A RECIBIR CONEXIONES ENTRANTES
pinMode(4,OUTPUT); // CONFIGURA EL PIN 4 DE ARDUINO COMO SALIDA
pinMode(3,OUTPUT); // CONFIGURA EL PIN 3 DE ARDUINO COMO SALIDA
digitalWrite(4,HIGH); // DESHABILITA LA MEMORIA SD
Serial.begin(9600); // COMIENZA LA COMUNICACIÓN SERIAL A 9600 BAUDIOS
Serial.print("server is at "); // IMPRIME EN EL MONITOR SERIAL
Serial.println(Ethernet.localIP()); // IMPRIME LA IP LOCAL EN EL MONITOR SERIAL
}
void loop()
{
EthernetClient client = server.available(); // COMIENZA A LEER LO QUE ESTA ENTRANDO EN EL BUFFER DEL SERVIDOR
if (client)
{ // SI EL CLIENTE ESTA CONECTADO.... ENTONCES.....
Serial.println("client connected"); // IMPRIME EN EL PUERTO SERIAL
while (client.connected()) // MIENTRAS EL CLIENTE ESTÉ CONECTADO..... HACE.....
{
int c = client.read(); // CREA LA VARIALBE DE TIPO ENTERO "C" EN DONDE SE ALMACENA LO LEIDO EN EL BUFFER
if (c == 'P') // SI EL ENTERO "C" ES IGUAL AL VALOR ASCII 80 QUE EQUIVALE AL VALOR 'P'
{
Serial.println(c); // IMPRIME EN EL MONITOR SERIAL EL VALOR DE LA VARIABLE "C"
digitalWrite(3,HIGH); // ENTONCES ASIGNA EL VALOR "HIGH" O 5 VOLTS AL PIN 3 DE ARDUINO
delay(2000); // DEMORA 2 SEGUNDOS
digitalWrite(3,LOW); // ASIGNA EL VALOR "LOW" O 0 VOTLS AL PIN 3 DE ARDUINO (ENCIENDE Y APAGA EL LED)
server.write(client.read());
}
}
delay(500);
}
}