Servidor domotico con ethernet shield

Buenas,

La verdad es que veo muy interesante tu proyecto, ya irás contando como avanza ...

Sobre lo de poder poner más entradas/salidas, te propongo que uses un Register Shifter como el 74HC595 (mira el tutorial de "ShiftOut" en esta misma página)

Si esto no es correcto, que me corrijan los que saben más, que yo me inicié en esto hace una semana :-p

Sobre el error en el código, si puedo me lo miro más a fondo, a ver si damos con el problema.

Saludos,

Yespi

Gracias yespi.

A noche estuve liado con el tema y modificando varias opciones, quitando botones, poniendo actuaciones solo por serie en vez de encender leds y la verdad que por mucho cambio que hice solo conseguí cuatro botones funcionando en la interfaz web, con mas se bloqueaba la página.

Seqún he leído es por el buffer que es pequeño y necesita que todo esté volcado a éste para luego poder enviarlo, pero entonces...de cual buffer estamos hablando?? del atmega o del enc28j60.

Como se podría solucionar esta cuestión?

Pues por lo que veo en el código, debe tratarse del buffer de la Ethernet.
Para mi, una manera de simplificar el código sería enviar un sólo parámetro en lugar de 4 o 6. En ese parámetro se indicarían los leds a encender en binario, hexadecimal, o con tu propia notación.

Por ejemplo, si pasas: 001001 podrías activar los leds 3 y 6
y con: 110000 activarías los leds 1 y 2

Podría ser una opción, un poco rústica a la vista en la interfaz web, pero pienso que aunque fuera así, habría que implementar en el código todo lo que tiene que hacer cada salida con lo cual estaríamos en las mismas.

El plan a lo mejor, aunque sea engorroso podría ser el ampliar el hard del ethernet, no lo se, es hablar por hablar :-[

yo he intentado lo mismo que tu y no lo conseguí. Me rompe la cabeza el HTML
sin embargo si que te puedo ayudar en el problema de que no funcionen los últimos botones.
en la línea 248 del programa "f (*strbuf < 0x3a && *strbuf > 0x2f)"
estás verificando que el dato que le pasas está entre 0 y 9, por eso no traga ni con 10, 11, 12 y similares. :wink:

Muchísimas gracias por contestar, todavía sigo con el tema.

Conseguí 6 botones funcionando haciendo un nuevo switch después del 9 jejejej era por eso y no me lo explicaba.

Yo de programación acabo de empezar como el que dice pero de html si llevo años con ello, si quieres podemos avanzar el tema.

Saludos

mi intención sería poder desde una página poder leer todos los datos posibles (entredas y salidas digitales y analógicas), y poder enviar valores a las que sean salidas, tado digitales como analógicas.
Mi problema es como pasar diferentes tidos de datos del arduino a la página web (floats y similares) o en caso contrario hacer la conversión matemática dentro de la página web(por ejemplo de una sonda de temperatura.

La versión que tenemos de ethernet shield es un poco puñetera, pues casi todo lo que hay en la red es para la standar.

después otra duda que tengo es si es más rápido pasar datos por ethernet que por el puerto serie. Porque mi otra intención es hacer un analizador de red.
Bueno, ya hablaremos.
Un saludo.

Me gusta tu proyecto, una de las funciones que pretendía hacer yo es una estación metereológica que dependiendo de varios estados los módulos hagan una cosa u otra a parte de toda la actuación manual.

Los módulos los tengo conectados todos mediante un bus y solo escucha el que tiene que escuchar, todos como esclavos y el servidor con la shield como master.

Sobre lo que dices de esta shield, tienes toda la razón y el buffer no ayuda mucho.

Sobre la sonda de temperatura hay algún ejemplo por ahí para plasmar el resultado en la web.

Otra de las cosas que intenté fué poner varias paginas pequeñas para no poner todo en el buffer y así saturarlo, funcionaba pero hacía muchísimas cosas raras.

Saludos

mira yo tengo este código que me parece mas simple porq no pruebas con este y me dices como te fue

#include <WString.h>
#include <Ethernet.h>

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

int LDR = 3;

int LZC = 2;
int LZJ = 4; 
int LZD = 7;
int AAC = 8;

String readString = String(100);

boolean _LZJ = false; 
boolean _LZD = false;
boolean _AAC = false;
boolean _LZC = false;
///////////////////////
String url = String(100);
String teststring = String(100);
String finalstring = String(100);

int guardo = 0;
int limiteLDR = 18;
//////////////////////

void setup()
{

  Ethernet.begin(mac, ip);
  server.begin();

  pinMode(LDR, INPUT);

  pinMode(LZJ, OUTPUT);
  pinMode(LZD, OUTPUT);
  pinMode(AAC, OUTPUT);
  pinMode(LZC, OUTPUT);

}

void loop()
{

  Client client = server.available();
  if (client) 
  {
    while(client.connected()) 
    {
      if(client.available()) 
      {
        char c = client.read();
        if(readString.length() < 100) 
        {
          readString.append(c);
        }
        if(c == '\n') 
        {
          if(readString.contains("LuzDormitorio=1")) 
          {
            digitalWrite(LZD, HIGH);
            _LZD = true;

            //////////////////////LDR//////////////////////
            /* guardo = analogRead(LDR);
             if (guardo < limiteLDR)
             {
             digitalWrite(LZJ, HIGH);
             _LZJ=true;
             }
             else
             {
             digitalWrite(LZJ, LOW);
             _LZJ=false;
             }
             delay(10);    */
            //////////////////////FIN-LDR//////////////////

          }
          if(readString.contains("LuzDormitorio=0"))
          {
            digitalWrite(LZD, LOW);
            _LZD = false; 
          }
          if(readString.contains("LuzJardin=1")) 
          {
            digitalWrite(LZJ, HIGH);
            _LZJ = true;
          }
          if(readString.contains("LuzJardin=0"))
          {
            digitalWrite(LZJ, LOW);
            _LZJ = false;
          }
          if(readString.contains("AireAcondicionado=1")) 
          {
            digitalWrite(AAC, HIGH);
            _AAC = true;
          }
          if(readString.contains("AireAcondicionado=0"))
          {
            digitalWrite(AAC, LOW);
            _AAC = false; 
          }
          if(readString.contains("LuzCocina=1")) 
          {
            digitalWrite(LZC, HIGH);
            _LZC = true;
          }
          if(readString.contains("LuzCocina=0"))
          {
            digitalWrite(LZC, LOW);
            _LZC = false; 
          }

          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();
          client.println("<head>");
          client.println("<meta http-equiv=Content-Type content=text/html; charset=utf-8 />");
          client.println("<title>Eco-Home</title>");
          client.println("</head>");
          client.println("<body>");

          client.println("Luz Jardin
");
          client.print("
Estado: ");
          if (_LZJ==true)
          {
            client.println("<font color='green'>ON");
            client.println("<form method=get name=LZJ><input type=hidden name=LuzJardin value=0><input type=submit value=OFF></form>");
          }
          if (_LZJ==false)
          {
            client.println("<font color='grey'>OFF");
            client.println("<form method=get name=LZJ><input type=hidden name=LuzJardin value=1><input type=submit value=ON></form>");
          }

          client.println("<hr><font color='black'>Aire Acondicionado
");
          client.print("
Estado: ");
          if (_AAC==true)
          {
            client.println("<font color='green'>ON");
            client.println("<form method=get name=AAC><input type=hidden name=AireAcondicionado value=0><input type=submit value=OFF></form>");
          }
          if (_AAC==false)
          {
            client.println("<font color='grey'>OFF");
            client.println("<form method=get name=AAC><input type=hidden name=AireAcondicionado value=1><input type=submit value=ON></form>");
          }

          client.println("<hr><font color='black'>Luz Dormitorio
");
          client.print("
Estado: ");
          if (_LZD==true)
          {
            client.println("<font color='green'>ON");
            client.println("<form method=get name=LZD><input type=hidden name=LuzDormitorio value=0><input type=submit value=OFF></form>");
          }
          if (_LZD==false)
          {
            client.println("<font color='grey'>OFF");
            client.println("<form method=get name=LZD><input type=hidden name=LuzDormitorio value=1><input type=submit value=ON></form>");
          }

          client.println("<hr><font color='black'>Luz Cocina
");
          client.print("
Estado: ");
          if (_LZC==true)
          {
            client.println("<font color='green'>ON");
            client.println("<form method=get name=LZC><input type=hidden name=LuzCocina value=0><input type=submit value=OFF></form>");
          }
          if (_LZC==false)
          {
            client.println("<font color='grey'>OFF");
            client.println("<form method=get name=LZC><input type=hidden name=LuzCocina value=1><input type=submit value=ON></form>");
          }

          readString="";
          client.stop();
        }
      }
    }
  }
}

lo que pasa que este código es para la shield que utiliza el chip wiznet verdad??

exacto, es para las ethernet con wiznet.

Nosotros estamos utilizando la basada en el enc28j60.

De todas maneras es interesante el código que has puesto, podrías explicarlo un poco y el circuito que has hecho?, por cierto, intenté compilarlo simplemente y me daba error, uso la 018.

mmm te da error?? ami me compila bien, quizás tengas que bajarte la librería WString.h

el código es sencillo defines la MAC, la IP y el puerto, luego defines los pines de entradas / salidas y una variable booleana para saber si esta activo o no.
luego por medio de GET pasas comandos a la url de la pagina, y el arduino atrapa esos comandos, los verifica y si esta en la lista de acciones simplemente hace lo que le pides. la pagina web muestra el botón ON en caso q este apagado y OFF en caso q este prendido. aparte de eso no mucho mas, cualquier duda me avisas

Acabo de bajarme la librería que me comentas en http://arduino.cc/en/uploads/Tutorial/String.zip la he incluído y sigue sin compilarme, no se si será la versión adecuada de la librería la que me he bajado.

Me dá los siguientes errores:

C:\arduino-0018\libraries\Ethernet\Ethernet.cpp.cpp:31: error: 'Ethernet' is not a class or namespace

C:\arduino-0018\libraries\Ethernet\Ethernet.cpp.cpp:31: error: ISO C++ forbids declaration of 'Ethernet' with no type

C:\arduino-0018\libraries\Ethernet\Ethernet.cpp.cpp: In function 'int Ethernet()':

C:\arduino-0018\libraries\Ethernet\Ethernet.cpp.cpp:31: error: 'int Ethernet()' redeclared as different kind of symbol

C:\arduino-0018\libraries\Ethernet/Ethernet.h:20: error: previous declaration of 'EthernetClass Ethernet'

C:\arduino-0018\libraries\Ethernet\Ethernet.cpp.cpp: At global scope:

C:\arduino-0018\libraries\Ethernet\Ethernet.cpp.cpp:34: error: 'Ethernet' is not a class or namespace

C:\arduino-0018\libraries\Ethernet\Ethernet.cpp.cpp:38: error: 'Ethernet' is not a class or namespace

C:\arduino-0018\libraries\Ethernet\Ethernet.cpp.cpp:43: error: 'Ethernet' is not a class or namespace

C:\arduino-0018\libraries\Ethernet\Ethernet.cpp.cpp:47: error: 'Ethernet' is not a class or namespace

C:\arduino-0018\libraries\Ethernet\Ethernet.cpp.cpp:51: error: 'Ethernet' is not a class or namespace

C:\arduino-0018\libraries\Ethernet\Ethernet.cpp.cpp:55: error: 'Ethernet' is not a class or namespace

C:\arduino-0018\libraries\Ethernet\Ethernet.cpp.cpp:60: error: 'Ethernet' is not a class or namespace

C:\arduino-0018\libraries\Ethernet\Ethernet.cpp.cpp:64: error: 'Ethernet' is not a class or namespace

C:\arduino-0018\libraries\Ethernet\Ethernet.cpp.cpp:68: error: 'Ethernet' is not a class or namespace

C:\arduino-0018\libraries\Ethernet\Ethernet.cpp.cpp:72: error: 'Ethernet' is not a class or namespace

C:\arduino-0018\libraries\Ethernet\Ethernet.cpp.cpp:77: error: 'Ethernet' is not a class or namespace

C:\arduino-0018\libraries\Ethernet\Ethernet.cpp.cpp:81: error: 'Ethernet' is not a class or namespace

C:\arduino-0018\libraries\Ethernet\Ethernet.cpp.cpp:85: error: 'Ethernet' is not a class or namespace

C:\arduino-0018\libraries\Ethernet\Ethernet.cpp.cpp:89: error: 'Ethernet' is not a class or namespace

C:\arduino-0018\libraries\Ethernet\Ethernet.cpp.cpp:93: error: 'Ethernet' is not a class or namespace

C:\arduino-0018\libraries\Ethernet\Ethernet.cpp.cpp:97: error: 'Ethernet' is not a class or namespace

Luego lo he probado con la versión 019 y a parte de incorporar la librería SPI que me pide al compilar, me da los siguientes errores:

C:\arduino-0019\libraries\String\WString.cpp:34: error: prototype for 'String::String(int)' does not match any in class 'String'
C:\arduino-0019\hardware\arduino\cores\arduino/WString.h:39: error: candidates are: String::String(long unsigned int, int)
C:\arduino-0019\hardware\arduino\cores\arduino/WString.h:38: error: String::String(long int, int)
C:\arduino-0019\hardware\arduino\cores\arduino/WString.h:37: error: String::String(unsigned int, int)
C:\arduino-0019\hardware\arduino\cores\arduino/WString.h:36: error: String::String(int, int)
C:\arduino-0019\hardware\arduino\cores\arduino/WString.h:35: error: String::String(unsigned char)
C:\arduino-0019\hardware\arduino\cores\arduino/WString.h:34: error: String::String(char)
C:\arduino-0019\hardware\arduino\cores\arduino/WString.h:33: error: String::String(const String&)
C:\arduino-0019\hardware\arduino\cores\arduino/WString.h:32: error: String::String(const char*)
C:\arduino-0019\libraries\String\WString.cpp: In constructor 'String::String(const char*)':
C:\arduino-0019\libraries\String\WString.cpp:50: error: '_array' was not declared in this scope
C:\arduino-0019\libraries\String\WString.cpp:52: error: 'setArray' was not declared in this scope
C:\arduino-0019\libraries\String\WString.cpp: In copy constructor 'String::String(const String&)':
C:\arduino-0019\libraries\String\WString.cpp:60: error: '_array' was not declared in this scope
C:\arduino-0019\libraries\String\WString.cpp:61: error: 'clear' was not declared in this scope
C:\arduino-0019\libraries\String\WString.cpp:62: error: 'const class String' has no member named '_array'
C:\arduino-0019\libraries\String\WString.cpp:62: error: 'setArray' was not declared in this scope
C:\arduino-0019\libraries\String\WString.cpp: In member function 'const String& String::operator=(const String&)':
C:\arduino-0019\libraries\String\WString.cpp:77: error: '_array' was not declared in this scope
C:\arduino-0019\libraries\String\WString.cpp:83: error: 'clear' was not declared in this scope
C:\arduino-0019\libraries\String\WString.cpp:84: error: 'const class String' has no member named '_array'
C:\arduino-0019\libraries\String\WString.cpp:84: error: 'setArray' was not declared in this scope
C:\arduino-0019\libraries\String\WString.cpp: At global scope:
C:\arduino-0019\libraries\String\WString.cpp:90: error: prototype for 'const String& String::operator=(const char*)' does not match any in class 'String'
C:\arduino-0019\libraries\String\WString.cpp:70: error: candidate is: const String& String::operator=(const String&)
C:\arduino-0019\libraries\String\WString.cpp:107: error: prototype for 'const String& String::operator+=(const char*)' does not match any in class 'String'
C:\arduino-0019\hardware\arduino\cores\arduino/WString.h:44: error: candidate is: const String& String::operator+=(const String&)
C:\arduino-0019\libraries\String\WString.cpp:127: error: prototype for 'const String& String::operator+=(char)' does not match any in class 'String'
C:\arduino-0019\hardware\arduino\cores\arduino/WString.h:44: error: candidate is: const String& String::operator+=(const String&)
C:\arduino-0019\libraries\String\WString.cpp:145: error: prototype for 'const String& String::operator+=(int)' does not match any in class 'String'
C:\arduino-0019\hardware\arduino\cores\arduino/WString.h:44: error: candidate is: const String& String::operator+=(const String&)
C:\arduino-0019\libraries\String\WString.cpp:159: error: prototype for 'const String& String::operator+=(long int)' does not match any in class 'String'
C:\arduino-0019\hardware\arduino\cores\arduino/WString.h:44: error: candidate is: const String& String::operator+=(const String&)
C:\arduino-0019\libraries\String\WString.cpp: In member function 'const String& String::operator+=(const String&)':
C:\arduino-0019\libraries\String\WString.cpp:176: error: '_array' was not declared in this scope
C:\arduino-0019\libraries\String\WString.cpp:179: error: 'setArray' was not declared in this scope
C:\arduino-0019\libraries\String\WString.cpp:183: error: '_array' was not declared in this scope
C:\arduino-0019\libraries\String\WString.cpp:183: error: 'const class String' has no member named '_array'
C:\arduino-0019\libraries\String\WString.cpp: At global scope:
C:\arduino-0019\libraries\String\WString.cpp:191: error: no 'const String& String::append(char)' member function declared in class 'String'
C:\arduino-0019\libraries\String\WString.cpp:196: error: no 'const String& String::append(char*)' member function declared in class 'String'
C:\arduino-0019\libraries\String\WString.cpp:201: error: no 'const String& String::append(const String&)' member function declared in class 'String'
C:\arduino-0019\libraries\String\WString.cpp:206: error: no 'const String& String::append(int, int)' member function declared in class 'String'
C:\arduino-0019\libraries\String\WString.cpp:217: error: no 'const String& String::append(long int, int)' member function declared in class 'String'
C:\arduino-0019\libraries\String\WString.cpp:226: error: no 'const String& String::append(int)' member function declared in class 'String'
C:\arduino-0019\libraries\String\WString.cpp:234: error: no 'const String& String::append(long int)' member function declared in class 'String'
C:\arduino-0019\libraries\String\WString.cpp:323: error: prototype for 'char String::charAt(int)' does not match any in class 'String'
C:\arduino-0019\hardware\arduino\cores\arduino/WString.h:57: error: candidate is: char String::charAt(unsigned int) const
C:\arduino-0019\libraries\String\WString.cpp:339: error: prototype for 'void String::setCharAt(int, char)' does not match any in class 'String'
C:\arduino-0019\hardware\arduino\cores\arduino/WString.h:71: error: candidate is: void String::setCharAt(unsigned int, char)
C:\arduino-0019\libraries\String\WString.cpp:355: error: prototype for 'boolean String::equals(char*)' does not match any in class 'String'
C:\arduino-0019\hardware\arduino\cores\arduino/WString.h:60: error: candidate is: unsigned char String::equals(const String&) const
C:\arduino-0019\libraries\String\WString.cpp:366: error: prototype for 'boolean String::equals(const String&)' does not match any in class 'String'
C:\arduino-0019\hardware\arduino\cores\arduino/WString.h:60: error: candidate is: unsigned char String::equals(const String&) const
C:\arduino-0019\libraries\String\WString.cpp:372: error: no 'boolean String::contains(char*)' member function declared in class 'String'
C:\arduino-0019\libraries\String\WString.cpp:380: error: prototype for 'byte* String::getBytes()' does not match any in class 'String'
C:\arduino-0019\hardware................

ya salio la 019 woow, voy a tener q actualizar yo tengo la 018.

el error q te da con la 018 es algo en la librería ethernet, la modificaste ?? o es la original, trata de bajártela nuevamente, sino me avisas y te subo la mía.

te dejo una cap de mi código compilado.

mira subí el código en pde y las librerías necesarias a mediafire, no se cuanto tiempo estará activo el link así q bájalas rápido ;D

http://www.mediafire.com/file/ppyu04gj1y7d02c/Arduino.rar

Pues algo debí tocar en la librería de ethernet porque la he borrado y la he vuelto a meter y ahora por fin me compila con la 018, antes lo hice también pero en vez de borrarla entera conbiné archivos y por eso persistían los errores.

Gracias por los archivos, he podido confirmar que tienes los mismos que yo :wink: , por cierto, el pde creo que no estaba en el rar.

Unas cosillas mas, podrías subir, si puedes, un pantallazo de como se ve en el navegador tu código? tengo curiosidad, ya que como no tengo esa shield no puedo probarlo ;D

Cuántos botones se podrían llegar a poner?
Has probado a poner varias páginas enlazadas entre si o enlazar a otra ip?

Saludos

DRicote en este momento no tengo la shield porq se me quemo :-[ pero te comento lo probé con 5 botones y funcionaba (tardaba 1 segundo mas en cargar q con 4 botones). te dejo una captura de la web. pero ahora me pase a otra forma de hacerlo con un servidor con php.

esta es la captura de como quedaría la web en arduino(la q deje el código en este post).

si quieres ver la nueva pagina web es esta:

www.domotica23.260mb.com
Usuario: user
Password: pass

te aclaro q todavía esta en construcción y es solo una demo, asi que puedes modificarle lo que quieras ::slight_smile:

buscando por internet he encontrado varias librecerías modificadas para funcionar con la tarjeta basada en el enc28j60.
En algunas de ellas la programación es similar a la tarjeta standar.
Lo malo es que siempre hay alguna instrucción no compatible entre unas librerías y otras y los ejemplos que funcionan con una librería hay que depurarlos para que funcionen con otra y en este punto me pierdo.
El problema es que la mayoría modifica la librería y se sigue llamando "etherShield" por lo que no puedes tenerlas simultáneamente en la ruta de búsqueda.
Por ejemplo en OpenEnergyMonitor hay ejemplos.

Para Maverik:

Yo he notado que el chip de la ethernet se pone muy caliente también, incluso tuve que ponerle un miniradiador para que disipara algo con sólo 6 botones, en cuanto que le pides algo de mas se enciende ;D

Está muy chulo como se ve en web, supongo que las imágenes son enlaces exteriores, en el móvil se tiene que ver de lujo.

Por cierto, como has hecho para controlar las salidas de arduino a través de php con un servidor externo, yo empecé con la shield de ethernet por no tener un ordenador encendido las 24h, pero si no da de sí tendré que buscar otras formas como tu, aunque sea un ordenador las 24h o un servidor externo.

Por cierto, he intentado entrar en el servidor que me dices pero me sale una página de error. :-?

Para pacojarcia:

No conocía la página que comentas, le he hechado un vistado pero no he logrado ver los ejemplos, de todas maneras, algo se debería poder hacer con esa shield ya que he llegado a ver sevidores de voIP que utilizan el enc28j60, no se en que web lo ví; una o unas páginas siempre y cuando no supere la memoria del arduino no debería ser problema para este chip, pero está decidido a darnos problemas.

Saludos