Ayuda módulo ethernet Shield verify[solucionado y funcionando]

Hola amigos,

El motivo de mi mensaje es por lo siguiente:

He adquirido un módulo arduino uno con un shield de Ethernet, tengo algo de experiencia en microcontroladores, pero los módulos arduinos son nuevos para mí. El problema es el siguiente, he probado algún programilla como encender un led y apagarlo con el puerto serie y me ha funcionado a la primera, pero luego estoy intentando hacer lo mismo pero a través del módulo shield y me estoy volviendo loco. Resulta que tengo el siguiente código:


#include <Ethernet.h>
#include <SPI.h>
boolean reading = false;

////////////////////////////////////////////////////////////////////////
//CONFIGURE
////////////////////////////////////////////////////////////////////////
byte ip[] = { 192, 168, 0, 199 }; //ip address to assign the arduino
byte gateway[] = { 192, 168, 0, 1 }; //ip address of the gatewa or router

//Rarly need to change this
byte subnet[] = { 255, 255, 255, 0 };

// if need to change the MAC address (Very Rare)
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

Server server = Server(80); //port 80
////////////////////////////////////////////////////////////////////////

void setup(){
//Pins 10,11,12 & 13 are used by the ethernet shield

pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);

Ethernet.begin(mac, ip, gateway, subnet);
server.begin();
}

void loop(){

// listen for incoming clients, and process qequest.
checkForClient();

}

void checkForClient(){

Client client = server.available();

if (client) {

// an http request ends with a blank line
boolean currentLineIsBlank = true;
boolean sentHeader = false;

while (client.connected()) {
if (client.available()) {

if(!sentHeader){
// send a standard http response header
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println();
sentHeader = true;
}

char c = client.read();

if(reading && c == ' ') reading = false;
if(c == '?') reading = true; //found the ?, begin reading the info

if(reading){
Serial.print(c);

switch (c) {
case '2':
//add code here to trigger on 2
triggerPin(2, client);
break;
case '3':
//add code here to trigger on 3
triggerPin(3, client);
break;
case '4':
//add code here to trigger on 4
triggerPin(4, client);
break;
case '5':
//add code here to trigger on 5
triggerPin(5, client);
break;
case '6':
//add code here to trigger on 6
triggerPin(6, client);
break;
case '7':
//add code here to trigger on 7
triggerPin(7, client);
break;
case '8':
//add code here to trigger on 8
triggerPin(8, client);
break;
case '9':
//add code here to trigger on 9
triggerPin(9, client);
break;
}

}

if (c == '\n' && currentLineIsBlank) break;

if (c == '\n') {
currentLineIsBlank = true;
}else if (c != '\r') {
currentLineIsBlank = false;
}

}
}

delay(1); // give the web browser time to receive the data
client.stop(); // close the connection:

}

}

void triggerPin(int pin, Client client){
//blink a pin - Client needed just for HTML output purposes.
client.print("Turning on pin ");
client.println(pin);
client.print("
");

digitalWrite(pin, HIGH);
delay(25);
digitalWrite(pin, LOW);
delay(25);
}

---------------------------------Pues bien cuando le doy a verificar (Verify) me sale el siguiente error, y el problema no es solo con éste sino con cualquier ejemplo que cargo de la red, excepto los que vienen de ejemplo con el programa arduino 1.0.

error:
sketch_dec04b:1: error: cannot declare parameter 'client' to be of abstract type 'Client'
/Users/secu/Downloads/Arduino.app/Contents/Resources/Java/hardware/arduino/cores/arduino/Client.h:7: note: because the following virtual functions are pure within 'Client':
/Users/secu/Downloads/Arduino.app/Contents/Resources/Java/hardware/arduino/cores/arduino/Client.h:12: note: virtual size_t Client::write(uint8_t)
/Users/secu/Downloads/Arduino.app/Contents/Resources/Java/hardware/arduino/cores/arduino/Client.h:13: note: virtual size_t Client::write(const uint8_t*, size_t)
/Users/secu/Downloads/Arduino.app/Contents/Resources/Java/hardware/arduino/cores/arduino/Client.h:14: note: virtual int Client::available()
/Users/secu/Downloads/Arduino.app/Contents/Resources/Java/hardware/arduino/cores/arduino/Client.h:15: note: virtual int Client::read()
/Users/secu/Downloads/Arduino.app/Contents/Resources/Java/hardware/arduino/cores/arduino/Client.h:17: note: virtual int Client::peek()
/Users/secu/Downloads/Arduino.app/Contents/Resources/Java/hardware/arduino/cores/arduino/Client.h:18: note: virtual void Client::flush()
/Users/secu/Downloads/Arduino.app/Contents/Resources/Java/hardware/arduino/cores/arduino/Client.h:10: note: virtual int Client::connect(IPAddress, uint16_t)
/Users/secu/Downloads/Arduino.app/Contents/Resources/Java/hardware/arduino/cores/arduino/Client.h:11: note: virtual int Client::connect(const char*, uint16_t)
/Users/secu/Downloads/Arduino.app/Contents/Resources/Java/hardware/arduino/cores/arduino/Client.h:16: note: virtual int Client::read(uint8_t*, size_t)
/Users/secu/Downloads/Arduino.app/Contents/Resources/Java/hardware/arduino/cores/arduino/Client.h:19: note: virtual void Client::stop()
/Users/secu/Downloads/Arduino.app/Contents/Resources/Java/hardware/arduino/cores/arduino/Client.h:20: note: virtual uint8_t Client::connected()
/Users/secu/Downloads/Arduino.app/Contents/Resources/Java/hardware/arduino/cores/arduino/Client.h:21: note: virtual Client::operator bool()
sketch_dec04b:16: error: cannot allocate an object of abstract type 'Server'
/Users/secu/Downloads/Arduino.app/Contents/Resources/Java/hardware/arduino/cores/arduino/Server.h:4: note: because the following virtual functions are pure within 'Server':
/Users/secu/Downloads/Arduino.app/Contents/Resources/Java/hardware/arduino/cores/arduino/Print.h:48: note: virtual size_t Print::write(uint8_t)
/Users/secu/Downloads/Arduino.app/Contents/Resources/Java/hardware/arduino/cores/arduino/Server.h:6: note: virtual void Server::begin()
sketch_dec04b:16: error: cannot declare variable 'server' to be of abstract type 'Server'
/Users/secu/Downloads/Arduino.app/Contents/Resources/Java/hardware/arduino/cores/arduino/Server.h:4: note: since type 'Server' has pure virtual functions
sketch_dec04b.cpp: In function 'void checkForClient()':
sketch_dec04b:44: error: 'class Server' has no member named 'available'
sketch_dec04b:44: error: cannot declare variable 'client' to be of abstract type 'Client'
/Users/secu/Downloads/Arduino.app/Contents/Resources/Java/hardware/arduino/cores/arduino/Client.h:7: note: since type 'Client' has pure virtual functions
sketch_dec04b:74: error: cannot allocate an object of abstract type 'Client'
/Users/secu/Downloads/Arduino.app/Contents/Resources/Java/hardware/arduino/cores/arduino/Client.h:7: note: since type 'Client' has pure virtual functions
sketch_dec04b:78: error: cannot allocate an object of abstract type 'Client'
/Users/secu/Downloads/Arduino.app/Contents/Resources/Java/hardware/arduino/cores/arduino/Client.h:7: note: since type 'Client' has pure virtual functions
sketch_dec04b:82: error: cannot allocate an object of abstract type 'Client'
/Users/secu/Downloads/Arduino.app/Contents/Resources/Java/hardware/arduino/cores/arduino/Client.h:7: note: since type 'Client' has pure virtual functions
sketch_dec04b:86: error: cannot allocate an object of abstract type 'Client'
(....) da mas errores...

Por lo que estoy ahí estancado, alguien me podría decir que puede ser??? cargo mal las librerias?? hay error en el código??, estoy desesperado porque luego le cargo un ejemplo que viene con el programa con el webserver y no me da error... =(

Muchas gracias de antemano...

Revisa esta línea, porque no le encuentro mucho sentido:

Client client = server.available();

Muchas gracias por tu atención, puede ser que no esté correcta, pero me pasa con cualquier código que le meta que lleve las librerias ETHERNET y SPI, menos los ejemplos que vienen con el App de arduino uno. Puede ser que no cargué bien las librerias???

Un saludo.

Si estás usando la v1 del Arduino IDE, la API de ethernet cambia completamente, por lo que son incompatibles los sketches pre-1.0 con los v1.0

una confirmacion tonta el chip de la shield es el w5001?

Gracias de nuevo, me imaginaba que podria ser algo de eso, por lo que cambiare de version. Lo que quiero es interactuar con el iphone, con un programilla que desarrollado para iOS5 y poder asi para empezar atacar a una o dos salidas digitales, para abrir o cerrar puertas o motores, no se lo que se me ocurra. Luego despues seguir con analogicas, existe una red que se llama paraimpu que te genera los skecht automaticamente.

Saludos.

karagos:
una confirmacion tonta el chip de la shield es el w5001?

No te lo puedo decir ahora, ya que estoy fuera de casa, pero la placa shield me llego el jueves, pero el problema por ahora no es de hardware, es de software, ya que el error me lo da al verificar, no al cargar el programa en el chip arduino UNO. Lo que si que te puedo decir es que mi placa arduino es la UNO en version SMD, una pasada.

Gracias

Con el IDE de arduino v22 compila bien, el fallo es con la version 1.0. Voy a mirarlo.

#include <Ethernet.h>
#include <SPI.h>
boolean reading = false;

////////////////////////////////////////////////////////////////////////
//CONFIGURE
////////////////////////////////////////////////////////////////////////
IPAddress ip(192,168,1,20);
IPAddress gateway(192,168,1,1);	
IPAddress subnet(255, 255, 255, 0);

  
  // if need to change the MAC address (Very Rare)
  byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };


  EthernetServer server(80); //port 80
////////////////////////////////////////////////////////////////////////

void setup(){
  //Pins 10,11,12 & 13 are used by the ethernet shield

  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);

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

void loop(){

  // listen for incoming clients, and process qequest.
  checkForClient();

}



void checkForClient(){

  EthernetClient client = server.available();

  if (client) {

    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    boolean sentHeader = false;

    while (client.connected()) {
      if (client.available()) {

        if(!sentHeader){
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();
          sentHeader = true;
        }

        char c = client.read();

        if(reading && c == ' ') reading = false;
        if(c == '?') reading = true; //found the ?, begin reading the info

        if(reading){
          Serial.print(c);

           switch (c) {
            case '2':
              //add code here to trigger on 2
             triggerPin(2);
              break;
            case '3':
            //add code here to trigger on 3
            triggerPin(3);
              break;
            case '4':
            //add code here to trigger on 4
            triggerPin(4);
              break;
            case '5':
            //add code here to trigger on 5
            triggerPin(5);
              break;
            case '6':
            //add code here to trigger on 6
            triggerPin(6);
              break;
            case '7':
            //add code here to trigger on 7
           triggerPin(7);
              break;
            case '8':
            //add code here to trigger on 8
           triggerPin(8);
              break;
            case '9':
            //add code here to trigger on 9
           triggerPin(9);
              break;
          }

        }

        if (c == '\n' && currentLineIsBlank)  break;

        if (c == '\n') {
          currentLineIsBlank = true;
        }else if (c != '\r') {
          currentLineIsBlank = false;
        }

      }
    }

    delay(1); // give the web browser time to receive the data
    client.stop(); // close the connection:

  } 

}


void triggerPin(int pin){
//blink a pin - Client needed just for HTML output purposes.  
//  client.print("Turning on pin ");
 // client.println(pin);
 // client.print("
");

  digitalWrite(pin, HIGH);
  delay(25);
  digitalWrite(pin, LOW);
  delay(25);
}

No se porque al poner esto

 client.print("Turning on pin ");
 client.println(pin);
 client.print("
");

no compila

Como estas lineas están en otra función que no es checkForClient() no puede ir en la vida.

Bueno chicos, ya funciona correctamente, al final por si os pasa a alguno, daba error al compilar porque estaba utilizando la v1. Lo he compilado con la 0022 y ha corrido perfectamente.

El código funciona a la perfección, y ahora ya puedo modificarlo como quiera. Os cuento, mi idea es conectarlo a una aplicación nativa de iphone (desarrollada por mí) que al pulsar uno de los botones active las salidas que yo le ordene, y esto ya me funciona. Prepararé un artículo y lo publicaré cuando lo tenga listo. Acostumbrado a trabajar con PIC hace años, el Arduino es coser y cantar, qué gusto dá...

Gracias a todos.!!

flico:
Con el IDE de arduino v22 compila bien, el fallo es con la version 1.0. Voy a mirarlo.

Porque sera que hecho de falta en tu post un GRACIAS, hay que ver ....

chiva:
Si estás usando la v1 del Arduino IDE, la API de ethernet cambia completamente, por lo que son incompatibles los sketches pre-1.0 con los v1.0

Oye! Que yo lo dije primero XD

flico:
Con el IDE de arduino v22 compila bien, el fallo es con la version 1.0. Voy a mirarlo.

Muchas Gracias, perdona por no haberme dado cuenta antes... :~

Oye! Que yo lo dije primero

Pues tienes razon @chiva

@flico, que todo en esta vida esa eso :smiley:

...mi idea es conectarlo a una aplicación nativa de iphone (desarrollada por mí) que al pulsar uno de los botones active las salidas que yo le ordene, y esto ya me funciona. Prepararé un artículo y lo publicaré cuando lo tenga listo.

Como se hacen las aplicaciones del iphone?

Se programan con lenguaje Objective_C, --tienes que darte de alta como programador pagando 99 dólares--, que es un lenguaje orientado a objetos, pero existen ya por ahí SDK que programando por ejemplo en HTML 5,css y javascript lo compilan ya a lenguaje nativo directamente simplificando mucho el trabajo, pero luego tienes otro rosario que es subir las aplicaciones al App Store si quieres hacerlas públicas, aunque también puedes hacer versiones Ad-hoc para instalártelas tú mismo en tu Iphone y usarlas a nivel particular. Yo no me dedico a esto ya que soy abogado, pero en su día hice ingeniería y me llama mucho la microelectrónica y la programación, no puedo resistirme, jejeje aunque tengo varias aplicaciones subidas en el app store, casi todas jurídicas, y gracias a ello aprendí a programar después de muchas horas de estudio del Objective c que no es fácil...Te subo una captura de la aplicación, aunque es un prototipo y funciona, aún mejorará mucho.

Gracias.

Curioso lo del iphone, la pena es no tener un bicho de estos para trastear.

En android tambien se pueden hacer esas cosas, quisas un poco mas abiertas respecto a la distribucion del app, e igualmente de faciles con el app inventor.
Aca un link de un ejemplo: App Inventor: Hola Mundo en Android (II) – NeoTeo