Arduino Forum

Forum 2005-2010 (read only) => International => Español => Topic started by: 111---111 on Mar 18, 2010, 11:31 pm

Title: Servidor domotico con ethernet shield
Post by: 111---111 on Mar 18, 2010, 11:31 pm
Hace poco he adquirido una shield de ethernet para arduino y he estado cacharreando un poco con ella, es la basada en el enc28j60.

Encontré varios ejemplos, entre ellos el de nuelectronics y otro bastante interesante basado en el primero con funcionalidad para cambiar la configuracion ip por serie.

Yo he querido ampliar el número de botones para actuar en mas salidas, para consequir 4 he tenido que borrar toda la funcionalidad para cambiar la configuracion ip y ahora con 6 botones, sólo funcionan los 4 primeros  :-[

Os dejo el código que he hecho para que le hecheis un vistazo y ver porqué no funcionan el boton 5 y 6 y ver si se podría ampliar a mas botones, ya que con 6 el proyecto se queda bastante escaso.

Saludos y gracias a toda la comunidad que hacen que todo sea mas facil.
Title: Re: Servidor domotico con ethernet shield
Post by: 111---111 on Mar 18, 2010, 11:34 pm
1/2 del código

Code: [Select]
#include "etherShield.h"

// Based on Nuelecronics and JP Civade sample code
// Modified by Dricote on 2010/03/18
// Needs an ATMega368 beacuse of ram

// please modify the following two lines. mac and ip have to be unique
// in your local area network. You can not have the same numbers in
// two devices:
static uint8_t mymac[6] = {0x54,0x55,0x58,0x10,0x00,0x24};
static uint8_t myip[4] = {192,168,1,15};
static char baseurl[]="http://192.168.1.15/";
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(){
 
  /*initialize enc28j60*/
  es.ES_enc28j60Init(mymac);
  es.ES_enc28j60clkout(3); // change clkout from 6.25MHz to 12.5MHz
  delay(10);
       
     /* Magjack leds configuration, see enc28j60 datasheet, page 11 */
     // LEDA=greed LEDB=yellow
     //
     // 0x880 is PHLCON LEDB=on, LEDA=on
     // enc28j60PhyWrite(PHLCON,0b0000 1000 1000 00 00);
     es.ES_enc28j60PhyWrite(PHLCON,0x880);
     delay(250);
     //
     // 0x990 is PHLCON LEDB=off, LEDA=off
     // enc28j60PhyWrite(PHLCON,0b0000 1001 1001 00 00);
     es.ES_enc28j60PhyWrite(PHLCON,0x990);
     delay(250);
     //
     // 0x880 is PHLCON LEDB=on, LEDA=on
     // enc28j60PhyWrite(PHLCON,0b0000 1000 1000 00 00);
     es.ES_enc28j60PhyWrite(PHLCON,0x880);
     delay(250);
     //
     // 0x990 is PHLCON LEDB=off, LEDA=off
     // enc28j60PhyWrite(PHLCON,0b0000 1001 1001 00 00);
     es.ES_enc28j60PhyWrite(PHLCON,0x990);
     delay(250);
     //
 // 0x476 is PHLCON LEDA=links status, LEDB=receive/transmit
 // enc28j60PhyWrite(PHLCON,0b0000 0100 0111 01 10);
 es.ES_enc28j60PhyWrite(PHLCON,0x476);
 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);

     /*plen will ne unequal to zero if there is a valid packet (without crc error) */
 if(plen!=0){
               
   // 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+6]));
       
       // Process commands
       switch (cmd) {
       case 2:
               on_off1=1;
             digitalWrite(SW1, HIGH);  // switch on LED1
               break;
       case 3:
               on_off1=0;
             digitalWrite(SW1, LOW);  // switch off LED1
               break;
       case 4:
               on_off2=1;
             digitalWrite(SW2, HIGH);  // switch on LED2
               break;
       case 5:
               on_off2=0;
             digitalWrite(SW2, LOW);  // switch off LED2
               break;
       case 6:
               on_off3=1;
             digitalWrite(SW3, HIGH);  // switch on LED3
               break;
       case 7:
               on_off3=0;
             digitalWrite(SW3, LOW);  // switch off LED3
               break;
       case 8:
               on_off4=1;
             digitalWrite(SW4, HIGH);  // switch on LED4
               break;
       case 9:
               on_off4=0;
             digitalWrite(SW4, LOW);  // switch off LED4
               break;
       case 10:
               on_off5=1;
             digitalWrite(SW5, HIGH);  // switch on LED5
               break;
       case 11:
               on_off5=0;
             digitalWrite(SW5, LOW);  // switch off LED5
               break;
       case 12:
               on_off6=1;
             digitalWrite(SW6, HIGH);  // switch on LED6
               break;
       case 13:
               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      
     }
   }
 }
       
}
// 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'){
                               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 < 0x3a && *strbuf > 0x2f){
                       // is a ASCII number, return it
                       r=(*strbuf-0x30);
               }
       }
       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>"));

       
     
Title: Re: Servidor domotico con ethernet shield
Post by: 111---111 on Mar 18, 2010, 11:35 pm
2/2 del código

Code: [Select]
       switch (on_off1) {
         case 1:
              plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("Out 1: <font color=\"#00FF00\">On</font><br>"));
               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=3>"));
             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><br>"));
               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=2>"));
             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><br>"));
               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=5>"));
             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><br>"));
               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=4>"));
             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><br>"));
               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=7>"));
             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><br>"));
               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=6>"));
             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><br>"));
               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=9>"));
             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><br>"));
               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=8>"));
             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><br>"));
               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=11>"));
             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><br>"));
               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=10>"));
             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><br>"));
               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=13>"));
             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><br>"));
               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=12>"));
             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);
}
Title: Re: Servidor domotico con ethernet shield
Post by: yespi on Mar 19, 2010, 11:36 am
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
Title: Re: Servidor domotico con ethernet shield
Post by: 111---111 on Mar 19, 2010, 12:52 pm
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?
Title: Re: Servidor domotico con ethernet shield
Post by: yespi on Mar 19, 2010, 02:12 pm
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

Title: Re: Servidor domotico con ethernet shield
Post by: 111---111 on Mar 19, 2010, 07:21 pm
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 :-[
Title: Re: Servidor domotico con ethernet shield
Post by: pacojarcia on Sep 10, 2010, 11:38 pm
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. ;)
Title: Re: Servidor domotico con ethernet shield
Post by: 111---111 on Sep 11, 2010, 12:26 am
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
Title: Re: Servidor domotico con ethernet shield
Post by: pacojarcia on Sep 11, 2010, 09:47 pm
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.
Title: Re: Servidor domotico con ethernet shield
Post by: 111---111 on Sep 12, 2010, 03:08 pm
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
Title: Re: Servidor domotico con ethernet shield
Post by: Maverik on Sep 13, 2010, 10:27 pm
mira yo tengo este código que me parece mas simple porq no pruebas con este y me dices como te fue

Code: [Select]
#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<br>");
         client.print("<br>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<br>");
         client.print("<br>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<br>");
         client.print("<br>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<br>");
         client.print("<br>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();
       }
     }
   }
 }
}
Title: Re: Servidor domotico con ethernet shield
Post by: 111---111 on Sep 13, 2010, 10:36 pm
lo que pasa que este código es para la shield que utiliza el chip wiznet verdad??
Title: Re: Servidor domotico con ethernet shield
Post by: Maverik on Sep 14, 2010, 01:31 am
exacto, es para las ethernet con wiznet.
Title: Re: Servidor domotico con ethernet shield
Post by: 111---111 on Sep 14, 2010, 09:18 pm
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.
Title: Re: Servidor domotico con ethernet shield
Post by: Maverik on Sep 14, 2010, 09:41 pm
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
Title: Re: Servidor domotico con ethernet shield
Post by: 111---111 on Sep 14, 2010, 10:20 pm
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\................
Title: Re: Servidor domotico con ethernet shield
Post by: Maverik on Sep 14, 2010, 10:47 pm
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.

(http://lh4.ggpht.com/_GHfV7_VgUTw/TI_e2lx6prI/AAAAAAAAJxc/504nyb9hk3g/s720/codigo.jpg)
Title: Re: Servidor domotico con ethernet shield
Post by: Maverik on Sep 14, 2010, 10:54 pm
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
Title: Re: Servidor domotico con ethernet shield
Post by: 111---111 on Sep 14, 2010, 11:56 pm
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 ;) , 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
Title: Re: Servidor domotico con ethernet shield
Post by: Maverik on Sep 15, 2010, 01:30 am
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).

(http://lh3.ggpht.com/_GHfV7_VgUTw/TJAE3aZRoLI/AAAAAAAAJyY/-ufgWriiQzw/s720/web.jpg)

si quieres ver la nueva pagina web es esta:

http://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 ::)
Title: Re: Servidor domotico con ethernet shield
Post by: pacojarcia on Sep 15, 2010, 10:03 am
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.


Title: Re: Servidor domotico con ethernet shield
Post by: 111---111 on Sep 17, 2010, 10:36 pm
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
Title: Re: Servidor domotico con ethernet shield
Post by: venomio on Sep 19, 2010, 06:57 pm
Esharle un Ojillo a esto:
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1284455681
Title: Re: Servidor domotico con ethernet shield
Post by: venomio on Sep 19, 2010, 07:07 pm
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?
Title: Re: Servidor domotico con ethernet shield
Post by: 111---111 on Sep 20, 2010, 09:25 pm
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.
Title: Re: Servidor domotico con ethernet shield
Post by: pacojarcia on Sep 22, 2010, 10:48 am
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
Code: [Select]
#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      
   } } } }
Title: Re: Servidor domotico con ethernet shield
Post by: pacojarcia on Sep 22, 2010, 10:49 am
codigo 2/2
Code: [Select]
  // 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><br>"));
             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><br>"));
             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><br>"));
             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><br>"));
             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><br>"));
             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><br>"));
             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><br>"));
             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><br>"));
             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><br>"));
             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><br>"));
             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><br>"));
             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><br>"));
             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);
}
Title: Re: Servidor domotico con ethernet shield
Post by: 111---111 on Sep 22, 2010, 10:42 pm
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... :(

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... :-[
Title: Re: Servidor domotico con ethernet shield
Post by: pacojarcia on Sep 22, 2010, 11:25 pm
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?
Title: Re: Servidor domotico con ethernet shield
Post by: Maverik on Sep 22, 2010, 11:35 pm
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

http://es.opendomo.org/

http://www.instructables.com/id/Connecting-a-12V-Relay-to-Arduino/

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  ::)

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

http://domotica23.260mb.com/

Usuario: user
Password: pass
Title: Re: Servidor domotico con ethernet shield
Post by: venomio on Sep 23, 2010, 01:22 am
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:
http://real2electronics.blogspot.com/2009/11/rapid-prototyping-hardware.html

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
Title: Re: Servidor domotico con ethernet shield
Post by: 111---111 on Sep 25, 2010, 09:22 pm
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 ;)

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.
Title: Re: Servidor domotico con ethernet shield
Post by: Maverik on Sep 25, 2010, 10:27 pm
DRicote:
si el tamaño del arduino es algo q ayuda muxo.
no entiendo q pruebas hicistes, puedes explicar mejor? :-/
Title: Re: Servidor domotico con ethernet shield
Post by: Maverik on Sep 26, 2010, 01:43 am
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.

Code: [Select]
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
Code: [Select]
<META HTTP-EQUIV= "Refresh"CONTENT=\"1;URL=javascript:history.back() ">
Title: Re: Servidor domotico con ethernet shield
Post by: 111---111 on Sep 26, 2010, 10:31 pm
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 ;)


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?
Title: Re: Servidor domotico con ethernet shield
Post by: 111---111 on Sep 27, 2010, 10:43 pm
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?
Title: Re: Servidor domotico con ethernet shield
Post by: maurogamer on Oct 22, 2010, 04:08 am
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
Title: Re: Servidor domotico con ethernet shield
Post by: 111---111 on Oct 22, 2010, 07:48 pm
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.
Title: Re: Servidor domotico con ethernet shield
Post by: maurogamer on Oct 23, 2010, 05:53 pm
Hola Dricote, muchas gracias por responder, sabes, estoy con algunas dudas frente a este proyecto..

Tengo clara la configuración de la página, para el envío de la información a la Arduino, pero no tengo muy claro como realizar la configuración en el arduino para que recepcione la información de la web. Hice un intento pero no me funciono  :-[ :-[ :-[

lo que sucede es que yo solo quiero abrir unas puertas, solo ON, y luego darle un tiempo para cerrar, como las puertas magnéticas...

pero me confundí un poco, revisé el código de pacojarcia y vi como funcionaba.. y esta de maravillas con 6 botones, pero también realicé una web para comunicarla con el arduino ocupando datos por la URL..
Title: Re: Servidor domotico con ethernet shield
Post by: maurogamer on Oct 26, 2010, 08:44 pm
estimado Dricote, hice una prueba tratanto de tomar los datos de la Web, pero no me es posible que funcione, por lo que lei, lograste realizar esa opción, para mi es la mejor, porque no cargas el código en el arduino, si no que puedes ocupar un web que sería ideal,

el código que revisé es para la wiznet, y tu tenias la ethernet con el enc28J60, que es lo que tengo en este minuto, una duemilanove y  una ethernet shield con el enc28j60.. podria ver la perte de tu código donde recopilas la información de la web ???

yo envío los valores de la web vía GET action,

Muchas Gracias
Title: Re: Servidor domotico con ethernet shield
Post by: 111---111 on Oct 26, 2010, 10:05 pm
Si te revisas el post desde el principio hallarás la respuesta (ya lo han mencionado varios compañeros), para enviar info a la shield de ethernet por GET no hace falta que sea un modelo u otro, funciona con las dos.

Y no he quitado el código si no, no haría nada, sólo he quitado la parte de html.


Saludos
Title: Re: Servidor domotico con ethernet shield
Post by: gonchi on Oct 26, 2010, 10:06 pm
hola. he adquirido hace un tiempo una ethernet shield. y la aplicacion sobre la que estais debatiendo es la que mas me interesa y apasiona como aplicacion.
Estais a años luz mia. Podriais indicarme ejemplos o paginas para ir adquiriendo conocimientos. porque los codigos que  poneis no estan completos no.

gracias.
Title: Re: Servidor domotico con ethernet shield
Post by: maurogamer on Oct 26, 2010, 10:27 pm
si, hice un ejemplo de web como la siguiente:
Quote

<head>
   <title>sin título</title>
   <meta http-equiv="content-type" content="text/html;charset=utf-8" />
   <meta name="generator" content="Geany 0.18" />
</head>

<body>

<form method="GET" action="192.168.0.15">
   <input type="submit" name="Puerta1" value ="1"><br>
   <input type="submit" name="Puerta2" value ="1"><br>
   <input type="submit" name="Puerta3" value ="1"><br>
   <input type="submit" name="Puerta4" value ="1"><br>
</form>    

</body>
</html>


pero el código que cargo en la arduino no me funciona, ahora estoy en la Universidad, llegando a casa postiaré en código que cargo en la arduino. Si es posible me indiquen donde está el problema,

Muchas Gracias
Title: Re: Servidor domotico con ethernet shield
Post by: maurogamer on Oct 27, 2010, 04:44 am
Muchas Gracias Dricote, logré enviar los datos vía web con los ejemplos del foro, lo que si intente colocar un delay bajo el primer switch, funciona pero se tarda 14 seg aprox. en apagar y además la web se torna lenta.. a que se puede deber eso...????

dejo mi codigo

Code: [Select]
#include "etherShield.h"

static uint8_t mymac[6] = {0x54,0x55,0x58,0x10,0x00,0x24};
static uint8_t myip[4] = {192,168,0,15};
static char baseurl[]="http://192.168.0.15/";
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
                           delay(7000);
                           digitalWrite(SW1, LOW);
                           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      
   } } } }


// 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"));
       return(plen);
}  
Title: Re: Servidor domotico con ethernet shield
Post by: opalenzuela on Oct 27, 2010, 01:42 pm
Desde hace algún tiempo iniciamos un sub-proyecto de OpenDomo (http://opendomo.org) basado en domótica sobre Arduino, al que bautizamos como Domino. Este sub-proyecto consiste en un firmware para Arduino que convierte la placa en una plataforma de automatismos, fácilmente programable y con una gran variedad de funciones, tal como podéis ver en la página oficial del proyecto: http://es.opendomo.org/domino

Uno de los próximos pasos a seguir es adaptar este firmware para dar soporte al Ethernet Shield de Arduino, pero al no disponer del dispositivo no lo hemos podido llevar a cabo aún. Si en este foro hay algún usuario interesado en usar Arduino como elemento de control domótico en red, tal vez quiera echar un vistazo a las posibilidades de Domino, ya que podría serle de utilidad.

Por ahora, la utilidad del puerto Ethernet está planteada como conexión por socket, emulando el actual puerto USB, pero tal vez podamos estudiar la posibilidad de incorporar algun soporte básico para HTTP más adelante, en cuanto podamos verificar su funcionamiento.
Title: Re: Servidor domotico con ethernet shield
Post by: 2torr on Oct 28, 2010, 04:11 pm
Hola a todos,

es mi primer mensaje en el foro, he estado siguiendo este post y la verdad es que me ha parecido muy interesante. Estoy usando la shield con chip de Wiznet 5100 y he intentado compilar el codigo de Maveric sin resultado positivo. Por cierto,estoy utilizando la version 021 de arduino.
Al principio me solicita la libreria SIP y una vez cargada, al compilar, me da los siguientes errores:

TEST_ETH_1.cpp: In function 'void loop()':
TEST_ETH_1:59: error: 'class String' has no member named 'append'
TEST_ETH_1:63: error: 'class String' has no member named 'contains'
TEST_ETH_1:84: error: 'class String' has no member named 'contains'
TEST_ETH_1:89: error: 'class String' has no member named 'contains'
TEST_ETH_1:94: error: 'class String' has no member named 'contains'
TEST_ETH_1:99: error: 'class String' has no member named 'contains'
TEST_ETH_1:104: error: 'class String' has no member named 'contains'
TEST_ETH_1:109: error: 'class String' has no member named 'contains'
TEST_ETH_1:114: error: 'class String' has no member named 'contains'

Alguna ayuda de porque puede estar ocurriendo esto?

Un saludo y gracias de antemano.
2torr
Title: Re: Servidor domotico con ethernet shield
Post by: 2tor on Nov 02, 2010, 03:17 pm
OK,
pues ya que no hay respuestas me contesto yo...Después de echarle un poco de tiempo en pruebas y demás, he conseguido salvar los dos problemas que tenía con el "contains" y el "append" que después de la versión del IDE 019 no funcionan. A partir de esta versión (019) la librería Strings se ha incorporado en el nucleo y hay funciones que no valen, por lo que hay que re-adaptar el código.

Si hay alguien interesado que pregunte.

Saludos.
Title: Re: Servidor domotico con ethernet shield
Post by: RicardoAbellan on Nov 03, 2010, 07:11 pm
si no me equivoco contais se sutituye por
if (strstr(lineaDeCaracteres,"buscar"));

donde lineaDeCaracteres es la cadena de caracteres y "buscar" es donde irian los caracteres que queremos buscar (entre " " ).


Title: Re: Servidor domotico con ethernet shield
Post by: karagos on Jan 13, 2011, 07:27 pm
hola tengo este shiel y me dijeron que era compatible con arduino pero no se conectarlo
http://cgi.ebay.es/ws/eBayISAPI.dll?ViewItem&item=260688971131&ssPageName=STRK:MEWNX:IT#ht_3595wt_1139
en mi shield vienen marcados los pines asi y yo creo que es asi:
"sck" que equivale a "sck" del enlace                                    pin13
"si" que equivale a "mosi" del enlace(creo)                             pin11
"so" que equivale a "miso" del enlace(creo)                            pin12
"cs" que por deducion sera el "ss".(alguien podria confirmarlo) pin10
y me sobran estos pines
wql= no se para que sirve
int= idem
clkout= idem
reset= sera para resetar pero no se como utilizarlo
3.3v= alimentacion
grn= alimentacion

llevo varios dias dandole vueltas en google y mandando correos al chino y ni caso, no quiero tirarlo por que ya no se que hacer.
si alguien me puede decir como se conecta estaria agradecido.... y asi poder seguir
gracias

creeis que voy por buen camino?
y gracias de nuevo
Title: Re: Servidor domotico con ethernet shield
Post by: karagos on Jan 16, 2011, 03:03 am
hola el chino ya me ha contestado y lo he conectado....pero sigo igual
la ip de mi ordenador es 192.168.0.194
intento hacer in ping sin exito.
de esta parte de codigo temgo que cambiar algo:
static uint8_t mymac[6] = {
 0x54,0x55,0x58,0x10,0x00,0x27};
static uint8_t myip[4] = {
 192,168,1,15};
la ip supongo que sera  192.168.0.15
pero lo de mymac no se como hacerlo.
porfavor ayudenme necesito saber que al menos funciona.

el arduino esta conectado al router, es asi?
Title: Re: Servidor domotico con ethernet shield
Post by: 111---111 on Jan 16, 2011, 10:23 am
Por lo de la mac ni la toques, no creo que tengas ninguna igual en tu red, la ip tiene que estar dentro de tu rango de red y sí, se puede conectar directamente al router o en cualquier punto de tu red.
Title: Re: Servidor domotico con ethernet shield
Post by: karagos on Jan 17, 2011, 03:07 pm
hola pues no podria contestarte.
si la ip es 192.168.1.15 y hago un ping
me dice que el tiempo de espera agotado
y si la cambio por
192.168.0.15
envia y recibe pero me da un error de host de destino inaccesible.