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
#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);
}