Arduino ethernet como cliente

Hola,

Quisiera enviar datos recogidos por un sensor a un servidor web creado por mi con java.
Por ejemplo quiero enviar un simple integer, un 1 por ejemplo cuando la temperatura de un sensor supere un umbral como primera prueba, pero no consigo saber como hacerlo. He conseguido hacer el caso contrario, osea hacer que arduino sea un servidor, y desde el navegador, tecleando la IP que le asigno a la placa, poder ver esos resultados, pero lo que realmente me interesa es enviar esos datos en vez de consultarlos. Alguien puede guiarme un poco o darme un pequeño ejemplo? Lo he intentado con la clase EthernetClient pero no consigo hacer lo que quiero :(

Gracias de antemano!
 
Es un lio... y no creo que el problema sea tu programa de arduino.. sino tu programa de java...

Primeramente el servidor debe poder estar configurado para recibir datos, por medio de algun puerto abierto en el firewall

Despues dependiendo de la plataforma necesitas hacer un programa residente en memoria que espere esa informacion y la envie a tu aplicacion en java, eso es si esperas una comunicacion asincrona

La manera mas facil para comenzar es hacer un polling, mandar un dato al arduino y que este envie una respuesta... una vez que tengas esa parte andando entonces ya puedes pasar a realizar una comunicacion asincrona...
 
Quizás puedes hacer algo más simple como por ejemplo, leer los datos de los sensores en arduino y armar un paquete TCP y a través de una aplicación escrita en JAVA, C# o VB.net recibir dichos paquetes y tomar la información de los sensores. Hay muchos ejemplos en internet de como enviar paquetes TCP y muy buenos tutoriales de como crear aplicaciones con el Winsock de VB...o remote control, es cuestión de investigar el tema.

Saludos !
 
Gracias a todos por vuestra ayuda! He cambiado un poco la forma de llevar el proyecto, y ahora trabajo con un servidor PHP y una base de datos en la que escribo los datos. He probado un ejemplo sencillo y funciona correctamente. El código es este:


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

// network configuration. gateway and subnet are optional.

// the media access control (ethernet hardware) address for the shield:
byte mac[] = { 0:LOL:E, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 10, 236, 102, 45 };
byte gateway[] = { 10, 236, 102, 1 };
byte subnet[] = { 255, 255, 255, 0 };
byte server[] = { 31, 170, 163, 150 };


EthernetClient client;

void setup()
{
Ethernet.begin(mac, ip);
Serial.begin(9600);

delay(1000);

Serial.println("connecting...");
int mifare = 55;
if (client.connect(server, 80)) {
Serial.println("Connected!");
client.print("GET http://rsi.comuv.com/arduino.php?mifare=");
client.print(mifare);
client.println(" HTTP/1.1");
client.println("Host: rsi.comuv.com");
client.println();
} else {
Serial.println("connection failed");
}
}

void loop()
{
if (client.available()) {
char c = client.read();
Serial.print(c);
}

if (!client.connected()) {
Serial.println();
Serial.println("disconnecting.");
client.stop();
for(;;)
;
}
}

Perfectamente lo carga en la base de datos, pero ahora lo que no consigo, es hacer que lo cargue cuando pasa una determinada acción, por ejemplo, que cuando un sensor pase de 25 grados. No se que es exactamente lo que tengo que inicializar en el setup, y que poner en el loop.
Gracias de antemano, un saludo!
 
Hecho!
La cosa es que cada vez que quieres enviar un dato, estableces conexión y luego la cortas. Directamente es meter en una funcion el código, en vez de en el setup. Y esa función llamarla en el loop.
Por lo que he visto, los if de client.avaiable y !client.connected no son necesarios. Únicamente tienes que poner client.stop(); tras haber enviado el dato. Osea...conectar y luego desconectar, cada vez que se quiera enviar algo.
Gracias a todos por la ayuda, y pongo esto aqui por si algun perdido como yo tiene estos problemas!
 
Tengo otra pregunta, ahora si lo que quiero es por ejemplo, desde ese servidor php, encender un led de mi placa arduino, como lo puedo hacer? Por mas que busco, solo encuentro como configurar arduino como servidor y desde el mismo arduino preparar la interfaz web para poder encencer y apagar, pero yo lo necesito hacer desde una pagina web externa. Se puede? Alguna orientacion? Gracias!
 
Se deberia poder sin ningun problema... solo tienes que mandar el dato a la direccion IP del Arduino y que este este configurado para generar una interrupcion cuando recibe un dato..
 
Hola, no funciona de esa forma. Ya lo intenté hace tiempo.
Lo que yo quiero es que la ethernet shield mande, por ejemplo, los datos de una entrada analógica a una determinada página web.
Saludos.
 
Podriamos ayudarte mejor si nos dieras mas informacion... como el programa... de lo contrario solo estamos adivinando cual es el problema...

La ethernet Shield si puede enviar y recibir datos de cualquier pagina web
 
Hola. Una pregunta. Resulta que ya me llegó laplaca eternet shield de arduino y la monté sobre la mega 2560 que tengo. La placa se conecta sin ningún problema a internet. El problema surge cuando a la mega, estando ensamblada con la ethernet shield, le conecto un display lcd gráfico, un reloj ds1307, un sensor dht11, un sensor hcsr04, y un tecladito de 5 botones. En ese caso, laconexión a internet aveces funciona y aveces no. Es decir que los leds FULLD, 100M y LINK de la ethernet shield aveces encienden y la conexión funciona, o sino se queda parpadeando el led FULLD y la conexión no fnciona.
A continuación adjunto el programita que hice para sacerme la duda de que no sea un problema de soft.
Disculpen pero llevo más de 10 horas tratando de que nunca falle pero aveces funciona y aveces no.
Saludos.
Código:
#include "DHT.h"
#include <SD.h>
#include <SPI.h>
#include <Ethernet.h>
#include <Wire.h>
#include <glcd.h>
#include "fonts/Arial14.h"         // proportional font
#include "fonts/SystemFont5x7.h"   // system font

#if DISPLAY_HEIGHT < 64
#error ks0108 example requires a display at least 64 pixels tall
#endif
#if DISPLAY_WIDTH < 128
#error ks0108 example requires a display at least 128 pixels wide
#endif
#define DS1307_I2C_ADDRESS 0x68
#define DHTPIN 14 //Pin 50
#define DHTTYPE DHT11 

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 10,0,0,5 };
Server server(80);

int val = 0;
int ActivarHum = 51;
int DesactivarHum = 49;
int Menu = 47;
int Trig = 38, Eco = 39;
float Temp = 0, Hum = 0;
long Distancia, Dist;
byte segundos, minutos, hora, diaDeLaSemana, diaDelMes, mes, anio;
struct Datos
{
byte Segundos, Minutos, Hora, DiaDeLaSemana, DiaDelMes, Mes, Anio;
}Tiempo;
File Archi;

DHT dht(DHTPIN, DHTTYPE);

      // De Decimal a BCD
      byte decToBcd(byte val){
        return ( (val/10*16) + (val%10) );
      };
 
      // De BCD a Decimal
      byte bcdToDec(byte val){
        return ( (val/16*10) + (val%16) );
      };
 
    // La siguiente función al ser llamada recoge los datos del DS1307.
    void getDateDs1307( byte *segundos, byte *minutos, byte *hora, byte *diaDeLaSemana, byte *diaDelMes, byte *mes, byte *anio ){
 
      // Se inicia la comunicación con el reloj, se preparan los bytes a transmitir, se transmiten además de cerrarse la conexión, y se recogen los 7 primero bytes.
      Wire.beginTransmission(DS1307_I2C_ADDRESS);
      Wire.send(val);
      Wire.endTransmission();
      Wire.requestFrom(DS1307_I2C_ADDRESS, 7);
 
      //Ahora de forma consecutiva se guardan los datos recogidos y se almacenan en sus variables correspondientes.
      // Algunas de las variables se necesitan enmascarar porque ciertos bits son bits de control.
      *segundos        = bcdToDec(Wire.receive() & 0x7f);
      *minutos         = bcdToDec(Wire.receive());
      *hora            = bcdToDec(Wire.receive() & 0x3f);
      *diaDeLaSemana   = bcdToDec(Wire.receive());
      *diaDelMes       = bcdToDec(Wire.receive());
      *mes             = bcdToDec(Wire.receive());
      *anio            = bcdToDec(Wire.receive());
    };
 
    // Esta otra función pone el reloj en hora con los datos que le hayamos pasado a mano desde el VOID SETUP()
    void setDateDs1307( byte segundos, byte minutos, byte hora, byte diaDeLaSemana, byte diaDelMes, byte mes, byte anio ){
 
      Wire.beginTransmission(DS1307_I2C_ADDRESS);
      Wire.send(val);
      Wire.send(decToBcd(segundos));
      Wire.send(decToBcd(minutos));
      Wire.send(decToBcd(hora));
      Wire.send(decToBcd(diaDeLaSemana));
      Wire.send(decToBcd(diaDelMes));
      Wire.send(decToBcd(mes));
      Wire.send(decToBcd(anio));
      Wire.endTransmission();
    };
//*********************************************************************************FUNCIÓN SETUP*************************************************************************************
void setup()
{
Serial.begin(9600);
Ethernet.begin(mac, ip);
server.begin();
//Defino cuales pines son de entrada y cuales son de salida.  
pinMode(ActivarHum,INPUT);
pinMode(DesactivarHum,INPUT);
pinMode(Menu,INPUT);
GLCD.Init(NON_INVERTED);   // initialise the library, non inverted writes pixels onto a clear screen
GLCD.SelectFont(System5x7); // switch to fixed width system font  
GLCD.ClearScreen();
Wire.begin();
dht.begin();
InicializarHCSR04(Trig,Eco);
pinMode(10,OUTPUT);
if (!SD.begin(4)) {
return;
}
Archi = SD.open("DATOS.txt", FILE_WRITE);
}
//**************************************************************************************FUNCIÓN LOOP********************************************************************************
void loop()
{ 
  //IngFecha();
  do{
  Hum = dht.readHumidity();
  Temp = dht.readTemperature();
  Distancia = DistanciaSensor(Trig, Eco);
  if(Distancia){
  Dist = Distancia;
  }else{
  Distancia = Dist;
  }
  Cartel();
  LaburoInternet();
  }while(1);
}
//***********************************************************************************FUNCIÓN INGRESAR FECHA************************************************************************
void IngFecha()
{
//GLCD.ClearScreen();
//GLCD.CursorTo(0,0);
//GLCD.Puts("A CONTINUACION");
//GLCD.CursorTo(0,1);
//GLCD.Puts("INGRESE LA FECHA");
//GLCD.CursorTo(0,2);
//GLCD.Puts("FECHA:");
Etiqueta:
delay(2000);
//Hora
GLCD.ClearScreen();
GLCD.CursorTo(0,0);
GLCD.Puts("INGRESE LA HORA:");
GLCD.CursorTo(0,1);
while(!digitalRead(Menu))
{
delay(400);
if(digitalRead(ActivarHum))
{
hora++;
GLCD.CursorTo(0,1);
GLCD.Puts((int)hora);
}else if(digitalRead(DesactivarHum))
{
hora--;
GLCD.CursorTo(0,1);
GLCD.Puts((int)hora);
}
}
//Minutos
delay(1500);
GLCD.ClearScreen();
GLCD.CursorTo(0,0);
GLCD.Puts("INGRESE MINUTO:");
GLCD.CursorTo(0,1);
while(!digitalRead(Menu))
{
delay(400);
if(digitalRead(ActivarHum))
{
minutos++;
GLCD.CursorTo(0,1);
GLCD.Puts((int)minutos);
}else if(digitalRead(DesactivarHum))
{
minutos--;
GLCD.CursorTo(0,1);
GLCD.Puts((int)minutos);
}
}
//Segundos
delay(1500);
GLCD.ClearScreen();
GLCD.CursorTo(0,0);
GLCD.Puts("INGRESE SEGUNDO:");
GLCD.CursorTo(0,1);
while(!digitalRead(Menu))
{
delay(400);
if(digitalRead(ActivarHum))
{
segundos++;
GLCD.CursorTo(0,1);
GLCD.Puts((int)segundos);
}else if(digitalRead(DesactivarHum))
{
segundos--;
GLCD.CursorTo(0,1);
GLCD.Puts((int)segundos);
}
}
//Día del mes
delay(1500);
GLCD.ClearScreen();
GLCD.CursorTo(0,0);
GLCD.Puts("INGRESE DIA:");
GLCD.CursorTo(0,1);
while(!digitalRead(Menu))
{
delay(400);
if(digitalRead(ActivarHum))
{
diaDelMes++;
GLCD.CursorTo(0,1);
GLCD.Puts((int)diaDelMes);
}else if(digitalRead(DesactivarHum))
{
diaDelMes--;
GLCD.CursorTo(0,1);
GLCD.Puts((int)diaDelMes);
}
}
//Mes
delay(1500);
GLCD.ClearScreen();
GLCD.CursorTo(0,0);
GLCD.Puts("INGRESE MES:");
GLCD.CursorTo(0,1);
while(!digitalRead(Menu))
{
delay(400);
if(digitalRead(ActivarHum))
{
mes++;
GLCD.CursorTo(0,1);
GLCD.Puts((int)mes);
}else if(digitalRead(DesactivarHum))
{
mes--;
GLCD.CursorTo(0,1);
GLCD.Puts((int)mes);
}
}
//Año
delay(1500);
GLCD.ClearScreen();
GLCD.CursorTo(0,0);
GLCD.Puts("INGRESE ANIO:");
GLCD.CursorTo(0,1);
while(!digitalRead(Menu))
{
delay(400);
if(digitalRead(ActivarHum))
{
anio++;
GLCD.CursorTo(0,1);
GLCD.Puts((int)anio);
}else if(digitalRead(DesactivarHum))
{
anio--;
GLCD.CursorTo(0,1);
GLCD.Puts((int)anio);
}
}
//Pregunta
delay(1500);
GLCD.ClearScreen();
GLCD.CursorTo(6,2);
GLCD.Puts("¿LOS DATOS");
GLCD.CursorTo(6,3);
GLCD.Puts("SON CORRECTOS? (S/N)");
while(1)
{
delay(100);
if(digitalRead(ActivarHum))
{
Tiempo.Segundos = segundos;
Tiempo.Minutos = minutos;
Tiempo.Hora = hora;
Tiempo.DiaDeLaSemana = diaDeLaSemana;
Tiempo.DiaDelMes = diaDelMes;
Tiempo.Mes = mes;
Tiempo.Anio = anio;
setDateDs1307(segundos, minutos, hora, diaDeLaSemana, diaDelMes, mes, anio);  
break;  
}
else if(digitalRead(DesactivarHum))
{
hora = 0; minutos = 0; segundos = 0; diaDelMes = 1; mes = 1; anio = 0;
goto Etiqueta;
}
}
}
//***************************************************************************FUNCIÓN CARTEL************************************************************************************
void Cartel(void)
{
  getDateDs1307(&segundos, &minutos, &hora, &diaDeLaSemana, &diaDelMes, &mes, &anio);
  
  if((anio > 0) && (anio < 100))
  {
  Tiempo.Segundos = segundos;
  Tiempo.Minutos = minutos;
  Tiempo.Hora = hora;
  Tiempo.DiaDeLaSemana = diaDeLaSemana;
  Tiempo.DiaDelMes = diaDelMes;
  Tiempo.Mes = mes;
  Tiempo.Anio = anio;
  }else{
  segundos = Tiempo.Segundos;
  minutos = Tiempo.Minutos;
  hora = Tiempo.Hora;
  diaDeLaSemana = Tiempo.DiaDeLaSemana;
  diaDelMes = Tiempo.DiaDelMes;
  mes = Tiempo.Mes;
  anio = Tiempo.Anio;  
  }

  GLCD.ClearScreen();
  GLCD.DrawRoundRect(0,0,127,63, 5, BLACK);
  GLCD.CursorTo(1,1);
  GLCD.Puts("Temperatura[°C] = ");
  GLCD.PrintNumber(Temp);
  GLCD.CursorTo(1,2);
  GLCD.Puts("Humedad[%] = ");
  GLCD.PrintNumber(Hum);
  GLCD.CursorTo(1,3);
  GLCD.Puts("Distancia[Cm] = ");
  if(Distancia){
  GLCD.PrintNumber(Distancia);
  Dist = Distancia;
  }else{
  Distancia = Dist;
  GLCD.PrintNumber(Distancia);
  }
  GLCD.CursorTo(1,5);
  if(hora >= 10){
  GLCD.Puts((int)hora);
  }else
  {
  GLCD.Puts("0");
  GLCD.CursorTo(2,5);
  GLCD.Puts((int)hora);
  }
  GLCD.CursorTo(3,5);
  GLCD.Puts(":");
  GLCD.CursorTo(4,5);
  if(minutos >= 10){  
  GLCD.Puts((int)minutos);
  }else
  {
  GLCD.Puts("0");
  GLCD.CursorTo(5,5);
  GLCD.Puts((int)minutos);
  }  
  GLCD.CursorTo(10,5);
  if(diaDelMes >= 10){
  GLCD.Puts((int)diaDelMes);
  }else{
  GLCD.Puts("0");
  GLCD.CursorTo(11,5);
  GLCD.Puts((int)diaDelMes);
  }  
  GLCD.CursorTo(12,5);
  GLCD.Puts("/");
  GLCD.CursorTo(13,5);
  if(mes >= 10)
  {
  GLCD.Puts((int)mes);
  }else
  {
  GLCD.Puts("0");
  GLCD.Puts((int)mes);
  }
  GLCD.CursorTo(15,5);
  GLCD.Puts("/");
  GLCD.CursorTo(16,5);
  GLCD.Puts((int)anio);
}
//*************************************************************************************FUNCIÓN LABUROETHERNET***********************************************************************
void LaburoInternet()
{
Client client = server.available();
if (client) {
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
if (c == '\n' && currentLineIsBlank)
{
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println();
client.println("<html>");
client.println("<head>");
client.println("<title>TEMPERATURA, HUMEDAD Y DISTANCIA</title>");
client.println("<body>");
client.println("<P>LOS DATOS SON:</P>");
client.println("</body>");
client.println("<META HTTP-EQUIV=\"REFRESH\" CONTENT=\"3;URL=refrescar.html\">");
client.println("</head>");
client.println("</html>");
client.print(" Temperatura = ");
client.print(Temp);
client.print(" (C)"); 
client.println("<br />");
client.print(" Humedad = ");
client.print(Hum);
client.print(" (%)");
client.println("<br />");
client.print(" Distancia = ");
client.print(Distancia);
client.print(" (Cm)");
client.println("<br />");
break;
}
if (c == '\n')
{
currentLineIsBlank = true;
} 
else if (c != '\r') {
currentLineIsBlank = false;
}
}
}
delay(1);
client.stop();
}
}
//*************************************************************************FUNCIÓN LABUROMSD*****************************************************************************************
void LaburoMSD()
{
//Archi = SD.open("DATOS.txt", FILE_WRITE);
if (Archi) {
getDateDs1307(&segundos, &minutos, &hora, &diaDeLaSemana, &diaDelMes, &mes, &anio); 
EscribirMSD();
//Archi.close();
//delay (5000);
Serial.println("done.");
} else {
// if the file didn't open, print an error:
Serial.println("error opening test.txt");
}
}
//************************************************************************FUNCIÓN ESCRIBIR MSD***************************************************************************************
void EscribirMSD()
{
Archi.print(hora, DEC);
Archi.print(":");
if (minutos < 10) {Archi.print("0");}
Archi.print(minutos, DEC);
Archi.print(":");
if (segundos < 10) {Archi.print("0");}
Archi.print(segundos, DEC);
Archi.print(" - ");
if (diaDelMes < 10) {Archi.print("0");}
Archi.print(diaDelMes, DEC);
Archi.print(" del ");
Archi.print("20");
if (anio < 10) {Archi.print("0");}
Archi.println(anio, DEC);
Archi.print("Temperatura = ");
Archi.print(Temp);
Archi.println(" °C ");
Archi.print("Humedad = ");
Archi.print(Hum);
Archi.println(" % ");
}
//*********************************************************************FUNCIÓN QUE INICIALIZA EL SENSOR DE PROXIMIDAD**************************************************************
void InicializarHCSR04(int trigPin, int echoPin)
{
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
}
//*********************************************************************FUNCIÓN QUE DEVUELVE LA DISTANCIA DEL SENSOR DE PROXIMIDAD**************************************************
long DistanciaSensor(int trigPin, int echoPin)
{
  long duracion, distancia; //http://arduino.cc/en/Reference/Long
  digitalWrite(trigPin, LOW);  //seta o pino 12 com um pulso baixo "LOW" ou desligado ou ainda 0
  delayMicroseconds(2); // delay de 2 microssegundos

  digitalWrite(trigPin, HIGH); //seta o pino 12 com pulso alto "HIGH" ou ligado ou ainda 1
  delayMicroseconds(10);  //delay de 10 microssegundos
  digitalWrite(trigPin, LOW); //seta o pino 12 com pulso baixo novamente
  duracion = pulseIn(echoPin, HIGH);  //pulseIn lê o tempo entre a chamada e o pino entrar em high
  //Esse calculo é baseado em s = v . t, lembrando que o tempo vem dobrado
  //porque é o tempo de ida e volta do ultrassom
  distancia = (duracion/2) / 29.1;
  return distancia;
}
Al parecer la placa ethernet shield no funciona por que probé todo de nuevo pero con otra placa ethernet shield y funciona bien.
La pregunta ahora es ¿como puedo salvar la placa ethernet que supuestamente no funciona?
Saludos.
 
Última edición por un moderador:
Atrás
Arriba