Servidor domotico con ethernet shield

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

Esharle un Ojillo a esto:
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1284455681

Y ahi creo que esta la madre del cordero... Resulta mucho mas trabajoso, sobre todo para la internet shield, que te devuelva la interface toda pintadita para que tu pulses... es mas facil dejarlo programado para que sepa lo que tiene que hacer y que la interface te la hagas tu en otro dispositivo. No tiene por que ser tan trabajoso. Le pasas por get lo que necesitas.

por ejemplo si lo quisieras en el movil pues en vez de currarte un programa como el nota este te guardasunos cuantos enlaces como favoritos en carpetas.

Carpeta "luz de la entrada" contiene 2 Bookmarks
uno ke sea http://ip_arduino?dispositivo=luz_entrada&accion=on
y otro ke sea http://ip_arduino?dispositivo=luz_entrada&accion=off

de manera que tu ves
LUZ ENTRADA

  • ENCENDER
  • APGAR

Y listo.no?

Pues la verdad, que de esta manera se puede hacer una interface mas bonita y currada y no se saturaría la shield.

Se puede probar a ver.

Adjunco codigo Dricote modificado para que funcionen los 6 botones
¿alquien me dice como pasar también valores analógicos del arduino a la página web y viceversa.
codigo 1/2

#include "etherShield.h"

static uint8_t mymac[6] = {0x54,0x55,0x58,0x10,0x00,0x24};
static uint8_t myip[4] = {192,168,2,205};
static char baseurl[]="http://192.168.2.205/";
static uint16_t mywwwport =80; // listen port for tcp/www (max range 1-254)

// Relay status. Start Off.
byte on_off1;
byte on_off2;
byte on_off3;
byte on_off4;
byte on_off5;
byte on_off6;

#define BUFFER_SIZE 1500
static uint8_t buf[BUFFER_SIZE+1];
#define STR_BUFFER_SIZE 22
static char strbuf[STR_BUFFER_SIZE+1];

EtherShield es=EtherShield();

// prepare the webpage by writing the data to the tcp send buffer
uint16_t print_webpage(uint8_t *buf, byte on_off1, byte on_off2, byte on_off3, byte on_off4, byte on_off5, byte on_off6);
int8_t analyse_cmd(char *str);

// 6 relays connected to output
#define SW1  2
#define SW2  3
#define SW3  4
#define SW4  5
#define SW5  6
#define SW6  7

void setup(){
Serial.begin(9600); //PACO para depurar el programa
  /*initialize enc28j60*/
   es.ES_enc28j60Init(mymac);
   es.ES_enc28j60clkout(2);
   delay(10);
        es.ES_enc28j60PhyWrite(PHLCON,0x880);
      delay(250);
      es.ES_enc28j60PhyWrite(PHLCON,0x990);
      delay(250);
      es.ES_enc28j60PhyWrite(PHLCON,0x880);
      delay(250);
      es.ES_enc28j60PhyWrite(PHLCON,0x990);
      delay(250);
        delay(100);
  //init the ethernet/ip layer:
  es.ES_init_ip_arp_udp_tcp(mymac,myip,mywwwport);
  // Init outputs
       pinMode(SW1, OUTPUT);
       digitalWrite(SW1, LOW);  // switch off LED
       pinMode(SW2, OUTPUT);
       digitalWrite(SW2, LOW);  // switch off LED
        pinMode(SW3, OUTPUT);
       digitalWrite(SW3, LOW);  // switch off LED
        pinMode(SW4, OUTPUT);
       digitalWrite(SW4, LOW);  // switch off LED
        pinMode(SW5, OUTPUT);
       digitalWrite(SW5, LOW);  // switch off LED
        pinMode(SW6, OUTPUT);
       digitalWrite(SW6, LOW);  // switch off LED
}

void loop(){
  uint16_t plen, dat_p;
  int8_t cmd;

// Ethernet Mode
  plen = es.ES_enc28j60PacketReceive(BUFFER_SIZE, buf);

  if(plen!=0){  /*plen will ne unequal to zero if there is a valid packet (without crc error) */
              // arp is broadcast if unknown but a host may also verify the mac address by sending it to a unicast address.
            if(es.ES_eth_type_is_arp_and_my_ip(buf,plen)){
              es.ES_make_arp_answer_from_request(buf);
              return;    }
            // check if ip packets are for us:
            if(es.ES_eth_type_is_ip_and_my_ip(buf,plen)==0){return;}
            if(buf[IP_PROTO_P]==IP_PROTO_ICMP_V && buf[ICMP_TYPE_P]==ICMP_TYPE_ECHOREQUEST_V){
                    es.ES_make_echo_reply_from_request(buf,plen);
                    return;    }
            
            // tcp port www start, compare only the lower byte
      if (buf[IP_PROTO_P]==IP_PROTO_TCP_V&&buf[TCP_DST_PORT_H_P]==0&&buf[TCP_DST_PORT_L_P]==mywwwport){
             if (buf[TCP_FLAGS_P] & TCP_FLAGS_SYN_V){
                     es.ES_make_tcp_synack_from_syn(buf); // make_tcp_synack_from_syn does already send the syn,ack
                     return;}
             if (buf[TCP_FLAGS_P] & TCP_FLAGS_ACK_V){
                    es.ES_init_len_info(buf); // init some data structures
                    dat_p=es.ES_get_tcp_data_pointer();
                    if (dat_p==0){ // we can possibly have no data, just ack:
                            if (buf[TCP_FLAGS_P] & TCP_FLAGS_FIN_V){es.ES_make_tcp_ack_from_any(buf);}
                            return;}
                    if (strncmp("GET ",(char *)&(buf[dat_p]),4)!=0){
                            // head, post and other methods for possible status codes see: http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
                            plen=es.ES_fill_tcp_data_p(buf,0,PSTR("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n<h1>200 OK</h1>"));
                            goto SENDTCP;}
                    // If "get /" without parameters
                       if (strncmp("/ ",(char *)&(buf[dat_p+4]),2)==0){
                            plen=print_webpage(buf, on_off1, on_off2, on_off3, on_off4, on_off5, on_off6);
                            goto SENDTCP;}
                    cmd=analyse_cmd((char *)&(buf[dat_p+5]));
                    
                    // Process commands
                    switch (cmd) {
                    case 'A':      //PACO: cambio los números por letras
                            on_off1=1;
                              digitalWrite(SW1, HIGH);  // switch on LED1
                            break;
                    case 'B':
                            on_off1=0;
                                 digitalWrite(SW1, LOW);  // switch off LED1
                            break;
                    case 'C':
                            on_off2=1;
                              digitalWrite(SW2, HIGH);  // switch on LED2
                            break;
                    case 'D':
                            on_off2=0;
                              digitalWrite(SW2, LOW);  // switch off LED2
                            break;
                    case 'E':
                            on_off3=1;
                              digitalWrite(SW3, HIGH);  // switch on LED3
                            break;
                    case 'F':
                            on_off3=0;
                              digitalWrite(SW3, LOW);  // switch off LED3
                            break;
                    case 'G':
                            on_off4=1;
                              digitalWrite(SW4, HIGH);  // switch on LED4
                            break;
                    case 'H':
                            on_off4=0;
                              digitalWrite(SW4, LOW);  // switch off LED4
                            break;
                    case 'I':
                            on_off5=1;
                              digitalWrite(SW5, HIGH);  // switch on LED5
                            break;
                    case 'J':
                            on_off5=0;
                              digitalWrite(SW5, LOW);  // switch off LED5
                            break;
                    case 'K':
                            on_off6=1;
                              digitalWrite(SW6, HIGH);  // switch on LED6
                            break;
                    case 'L':
                            on_off6=0;
                              digitalWrite(SW6, LOW);  // switch off LED6
                            break;                
                        }
                    plen=print_webpage(buf, on_off1, on_off2, on_off3, on_off4, on_off5, on_off6);
                    
          SENDTCP:  es.ES_make_tcp_ack_from_any(buf); // send ack for http get
                    es.ES_make_tcp_ack_with_data(buf,plen); // send data      
    } } } }

codigo 2/2

   // The returned value is stored in the global var strbuf
    uint8_t find_key_val(char *str,char *key)
    {
            uint8_t found=0;
            uint8_t i=0;
            char *kp;
            kp=key;
            while(*str &&  *str!=' ' && found==0){
                    if (*str == *kp){
                            kp++;
                            if (*kp == '\0'){
                                    str++;
                                    kp=key;
                                    if (*str == '='){ found=1;}
                            }
                    }else{kp=key;}
                    str++;
            }
            if (found==1){
                    // copy the value to a buffer and terminate it with '\0'
                    while(*str &&  *str!=' ' && *str!='&' && i<STR_BUFFER_SIZE){
                            strbuf[i]=*str;
                            i++;
                            str++;}
                    strbuf[i]='\0';
            }
            return(found);
}


int8_t analyse_cmd(char *str)
{      int8_t r=-1;
         if (find_key_val(str,"cmd")){
                if (*strbuf < 0x4f && *strbuf > 0x40){   //PACO antes era:   if (*strbuf < 0x3a && *strbuf > 0x2f) ahora permito de la 'A' a la 'N'
                        // is a ASCII number, return it
                        r=*strbuf;               // PACO antes era:   r=(*strbuf-0x30);  ahora esto 40 A->0 ; B -> 1 ; ....
                }
        }
        return r;
}


uint16_t print_webpage(uint8_t *buf, byte on_off1, byte on_off2, byte on_off3, byte on_off4, byte on_off5, byte on_off6)
{       int i=0;
        uint16_t plen;
        plen=es.ES_fill_tcp_data_p(buf,0,PSTR("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n"));
        plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<FONT FACE=\"arial\"><center><p><A HREF=\"/\"><b>SERVIDOR DOMOTICO</b></A></p>"));
        plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<table bgcolor=\"#f7f7f7\"><tr><td align=center>")); 
 switch (on_off1) {
          case 1:
               plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("Out 1: <font color=\"#00FF00\">On</font>
"));
              plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<form METHOD=get action=\""));
              plen=es.ES_fill_tcp_data(buf,plen,baseurl);
              plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("\">"));
              plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<input type=hidden name=cmd value=B>")); // B apaga; A enciende
              plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<input type=submit value=\"Switch off\"></form>"));
                break;
          case 0:
               plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("Out 1: <font color=\"#CC0000\">Off</font>
"));
              plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<form METHOD=get action=\""));
              plen=es.ES_fill_tcp_data(buf,plen,baseurl);
              plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("\">"));
              plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<input type=hidden name=cmd value=A>"));
              plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<input type=submit value=\"Switch on\"></form>"));
                break;
          }
        plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("</td><td align=center>"));
 switch (on_off2) {
          case 1:
               plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("Out 2: <font color=\"#00FF00\">On</font>
"));
              plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<form METHOD=get action=\""));
              plen=es.ES_fill_tcp_data(buf,plen,baseurl);
              plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("\">"));
              plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<input type=hidden name=cmd value=D>"));
              plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<input type=submit value=\"Switch off\"></form>"));
                break;
          case 0:
               plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("Out 2: <font color=\"#CC0000\">Off</font>
"));
              plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<form METHOD=get action=\""));
              plen=es.ES_fill_tcp_data(buf,plen,baseurl);
              plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("\">"));
              plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<input type=hidden name=cmd value=C>"));
              plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<input type=submit value=\"Switch on\"></form>"));
                break;
          }
        plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("</td></tr><tr><td align=center>"));
 switch (on_off3) {
          case 1:
               plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("Out 3: <font color=\"#00FF00\">On</font>
"));
              plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<form METHOD=get action=\""));
              plen=es.ES_fill_tcp_data(buf,plen,baseurl);
              plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("\">"));
              plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<input type=hidden name=cmd value=F>"));
              plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<input type=submit value=\"Switch off\"></form>"));
                break;
          case 0:
               plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("Out 3: <font color=\"#CC0000\">Off</font>
"));
              plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<form METHOD=get action=\""));
              plen=es.ES_fill_tcp_data(buf,plen,baseurl);
              plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("\">"));
              plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<input type=hidden name=cmd value=E>"));
              plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<input type=submit value=\"Switch on\"></form>"));
                break;
          }
        plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("</td><td align=center>"));
 switch (on_off4) {
          case 1:
               plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("Out 4: <font color=\"#00FF00\">On</font>
"));
              plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<form METHOD=get action=\""));
              plen=es.ES_fill_tcp_data(buf,plen,baseurl);
              plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("\">"));
              plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<input type=hidden name=cmd value=H>"));
              plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<input type=submit value=\"Switch off\"></form>"));
                break;
          case 0:
               plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("Out 4: <font color=\"#CC0000\">Off</font>
"));
              plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<form METHOD=get action=\""));
              plen=es.ES_fill_tcp_data(buf,plen,baseurl);
              plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("\">"));
              plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<input type=hidden name=cmd value=G>"));
              plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<input type=submit value=\"Switch on\"></form>"));
                break;
          }
        plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("</td></tr><tr><td align=center>"));
 switch (on_off5) {
          case 1:
               plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("Out 5: <font color=\"#00FF00\">On</font>
"));
              plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<form METHOD=get action=\""));
              plen=es.ES_fill_tcp_data(buf,plen,baseurl);
              plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("\">"));
              plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<input type=hidden name=cmd value=J>"));
              plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<input type=submit value=\"Switch off\"></form>"));
                break;
          case 0:
               plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("Out 5: <font color=\"#CC0000\">Off</font>
"));
              plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<form METHOD=get action=\""));
              plen=es.ES_fill_tcp_data(buf,plen,baseurl);
              plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("\">"));
              plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<input type=hidden name=cmd value=I>"));
              plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<input type=submit value=\"Switch on\"></form>"));
                break;
          }
        plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("</td><td align=center>"));
 switch (on_off6) {
          case 1:
               plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("Out 6: <font color=\"#00FF00\">On</font>
"));
              plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<form METHOD=get action=\""));
              plen=es.ES_fill_tcp_data(buf,plen,baseurl);
              plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("\">"));
              plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<input type=hidden name=cmd value=L>"));
              plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<input type=submit value=\"Switch off\"></form>"));
                break;
          case 0:
               plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("Out 6: <font color=\"#CC0000\">Off</font>
"));
              plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<form METHOD=get action=\""));
              plen=es.ES_fill_tcp_data(buf,plen,baseurl);
              plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("\">"));
              plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<input type=hidden name=cmd value=K>"));
              plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<input type=submit value=\"Switch on\"></form>"));
                break;
          }
        plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("</td></tr></table></center><hr>Ethernet Shield Arduino 1.0"));

        return(plen);
}

Muy acertado si señor, curioso el cambio a las letras y funcionando, a demás muy bien y con 1500 de buffer.

Lo he estado probando y va de lujo, pero en cuanto que le he metido el 7º botón (admitiendo hasta "N") me ha dicho que nanai ;D, ni subiendo el buffer... :frowning:

Se podrían conseguir los 7 u 8 botones?

Sobre lo que comentas de los valores analógicos, si lo que quieres es visualizar por ejemplo temperatura en la web, hay un ejemplo que se puede sacar algo en la librería de la ethershield, si me equivoco creo que yo no te podría responder sobre ello... :-[

para pasar más letras cambia por ejemplo:
if (*strbuf < 0x4f && *strbuf > 0x40){
a esto:
if (*strbuf < 0x58 && *strbuf > 0x40){
con esto tienes hasta la "V")
¿hasta cuanto puedes crecer el buffer? ¿por qué es tan crítico?

DRicote:

mira ese es solo una demo, en realidad mi servidor esta en casa y si prendido las 24Hs es un pentium III de 600mhz con 256Mb de ram sin teclados sin pantalla ni nada mas solo la torre conectada al router y listo, si te preocupa el consumo te digo q es muy muy poco.

pero si quieres tener un servidor externo lo puedes hacer perfectamente, si te fijas en mi pagina yo lo que hago es pasar un parametro por medio de GET o POST a la IP del arduino por ejemplo al seleccionar una zona se carga la IP y los botones tienen parametros genericos asi si precionas el boton de TV en la zona sala lo que haces es enviar un parametro a la IP 192.168.1.15/?acc1ON

si quieren se puede armar un topic para hacer un sistema domotico donde todos aportemos algo que les parece.

dejo algunos links donde e sacado info.

http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1278347111/0

ami este tema me interesa mucho, no solo prender y apagar las cosas, sino tmb recibir datos y poder programar las acciones.

cualquier cosa estoy por aqui ::slight_smile:

y mi pagina yo la puedo ver bien, el servidor es medio lento pero anda ;D

http://domotica23.260mb.com/

Usuario: user
Password: pass

Otra opción si quieres prescindir del uso de un PC entero para la tarea y poder montar un interface medio en condiciones es esta:

Mirate todos los enlaces de la izquierda que hacen referencia a LINKDUINO que es engancharle un Router por por puerto serie al arduino. Asi el router gestiona el servidor web desde una SD y el arduino solo se encarga de lo que se tiene que encargar.

El mas importante de todos es el ultimo
+LINKDUINO:DD-WRT + OPTWARE

pacojarcia:
Pues no se hasta donde se podría subir realmente el buffer, lo que si sé es que yo para hacer funcionar los 6 botones con dos "switch" como te comenté, tuve que subir el buffer a 1700, no funcionaba ni con mas ni con menos y por supuesto tuve que ir subiéndolo según fuí aumentando botones cuando empecé con ello.

Maverik:
Hola, no es por el consumo que pueda generar el ordenador las 24h, es que ya tuve uno hace tiempo como servidor de domótica por x10, camaras y alguna cosa mas, pero lo que pretendía con arduino es tener un sistema standalone y no preocuparme de nada mas que de alimentarlo y por supuesto que el tamaño reducido ayuda :wink:

Próbe a hacer una prueba en una html externa enviando por get al arduino y funcionó pero me devuelve la página del arduino, quiere decirse que si no funciona la del arduino no haría caso, supongo :-/ no?, bueno fue una prueba nada mas.

venomio:
Buenos enlaces, ya vi la página algun día, es del amigo Igor que también transita este foro, es una máquina el tio.

DRicote:
si el tamaño del arduino es algo q ayuda muxo.
no entiendo q pruebas hicistes, puedes explicar mejor? :-/

ok eso es lo q hace. prueba en poner este codigo en la pagina del arduino. lo que hace es regresart a la ultima pagina visitada.

client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("<head>");
          client.println("<meta http-equiv=Content-Type content=text/html; charset=utf-8 />");
          client.println("<title>Titulo de tu web</title>");
          client.println("</head>");
          client.println("<body>");
          client.println("<input type=button value=Atras onClick=javascript:history.back();>");
          client.println("</body>");

o tmb puedes cambiar el meta por este codigo que hace lo mismo pero automatico

<META HTTP-EQUIV= "Refresh"CONTENT=\"1;URL=javascript:history.back() ">

Pues le he borrado la web entera al arduino y le he puesto solo la redireccion con el meta que me has comentado y ya llevo 26 botones (on+off=52 en total) en servidor externo funcionando de maravilla, se puede hacer la web al gusto y sin problemas de saturar el buffer del enc28j60.

Por lo que tengo entendido, éste tiene un buffer de 8K, si la web con solo unos botones le ocupaba de 2 a 4K y la misma programación ya le metía mas, por eso se saturaba tan rápido...

Gracias tambien a pacojarcia que si no descubre lo de las letras hubiera sido imposible :wink:

Todo esto por el metodo get, alguien a probado con post?

Y otra cosa, antes cuando estaba la web en el arduino, se podía ver el estado de cada salida, como se podría visualizar esto en un servidor externo?

Lo que voy haciendo yo es una mera prueba en html, supongo que en php se le podría preguntar lo que tiene en memoria el arduino verdad?

También he conseguido meter en la eeprom el estado de encendido o apagado, así desde cualquier otro interface, ya sea un lcd, etc, se puede saber el estado real en cada momento.

Una buena forma que se me ha ocurrido es que el arduino con la shield de ethernet enviara esa info a una base de datos tipo mysql y así desde fuera (servidor externo) se pueden hace estadísticas y todo tipo de cosas.

Alguien ha conseguido conectar o sabe como se podría ,la shield basada en el enc28j60 a una base de datos tipo mysql?

Hola, la verdad es que soy nuevo en el tema arduino.. y me ha encantado como han llevado acabo este proyecto.. me parece espectacular.. solo que me queda una inquietud, sería posible montar esto en una placa Arduino Mega??, así para tener más puntos de control

Claro que es posible!, la nueva shield de ethernet con chip wiznet (la que lleva slot micro sd) ya es compatible con el mega, la anterior había que hacerla alguna modificación pero también he visto que la usaban.