ARDUINO ETHERNET SOS

voglio accendere un led da remoto…mi aiutate??? questo è il codice:
dove sbaglio??

#include <Ethernet.h>
int ledPIN=13;
int statusPIN=0;
byte mac = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip = { 10, 0, 0, 4};
byte server = { 212,52,84,24 }; // libero

Client client(server, 25);

void setup()
{
Ethernet.begin(mac, ip);
Serial.begin(9600);

delay(1000);

Serial.println(“connecting…”);

if (client.connect()) {
Serial.println(“connected”);

client.println();

} else {
Serial.println(“connection failed”);
}
}

void loop()
{
if (client.available()) {
char c = client
.read();
Serial.print(c);
statusPIN!=statusPIN;
digitalWrite(ledPIN,statusPIN);

}

if (!client.connected()) {
Serial.println();
Serial.println(“disconnecting.”);
Serial.println(“disconnecting.”);
statusPIN!=statusPIN;
client.stop();
for(;:wink:
;
}
}

Anch'io vorrei fare una cosa simile, ma sto valutando le possibilità prima di acquistare arduino e la ethernet shield... Sto iniziando a vedere però qualcosa di codice, sia dal libro ufficiale che dal reference! :) Mi sapresti spiegare più o meno il funzionamento di quelle linee di codice che hai postato?? In particolar modo il loop non mi è tanto chiaro... :-? Te ne sarei grato!! :)

ti posto il mio contatto msn gae22@live.it...ke parliamo meglio....

Non ho msn... :( Se c'è una cosa che detesto fortemente sono le chat!!! :)

Vedendo questo esempio qui http://arduino.cc/en/Reference/ClientConnected (dal quale mi sembra sia preso il tuo codice più o meno...) Arduino cerca subito di connettersi a Google tramite il suo indirizzo ip:

Client client(server, 80);

Inizializza scheda Ethernet e porta seriale ed effettua una query con google stesso

client.println("GET /search?q=arduino HTTP/1.0");

Nella seconda funzione (loop) semplicemente ricopia tutti i caratteri della risposta, uno per uno, sulla porta seriale per farli visualizzare a schermo... (almeno questo è quello che credo dato che non ho ancora modo di provarlo di mio! ;) )

if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }

Credo che il lavoro da fare sia cercare un modo di ottenere una risposta dal server del tipo 'accendi' (anziché la pagina html come in questo esempio), memorizzare tutta la risposta anzichè stamparla a video carattere per carattere, e confrontarla con i casi da considerare (se la stringa vale 'accendi', setta ad HIGH il valore del led)

Credo che il lavoro sia questo! Proviamo a lavorarci insieme, anche se per me sarà un pò più complicato!!! :s

Potresti provare a lanciare questo esempio (quello che ti ho linkato) dove al posto di

client.println("GET /search?q=arduino HTTP/1.0");

inserisci

client.println("GET / HTTP/1.0")

Se il risultato è la pagina html di google, allora potrebbe non essere troppo complesso!!! ;) (Rozzo...molto rozzo, ma non troppo complesso!!! ;p)

Ciao!! :)

si ma quel codice serve a connettersi alla pagina di ricerca google...ke t viene rispedita sul serial monitor in formato html...il mio obbiettivo è mandare ora un pakketto ad arduino cosi lui mi accenda il led...è questo il mio problema... ::)

Allora almeno fai una prova, salva tutta la pagina in qualche variabile e confrontala con la pagina html che ti dovrebbe uscire. Dopo inserisci un if che ti controlla se sono uguali (e per come l'hai impostato dovrebbero esserlo) e ti accende il led.

Ovviamente è una cosa molto ruzzolana, ma di sicuro funziona!!

Poi si pensa al resto!! ;)

infatti quello ke ho fatto è ke appena si collega alla pagina mi accende il led fin quando nn si disconnette…ma questo nn ha molto senso xkè devo decidere io quando accenderlo da remoto nn quando lui decide d connettersi a google…nn so in realtà come fare… :slight_smile:

Se questo funziona basta cambiare la porta e mandare qualche messaggio via telnet al posto della pagina di google!!! Imposta come server il tuo pc, fai partire una sessione telnet su qualche porta e usa messaggi come 'accendi' o 'spegni'!! :)

se metto il pc come server...mi da conflitto sugli ip... :-/

ti posto il codice...ma si disconnette dal server pop3 di hotmail...

#include <Ethernet.h>

byte mac = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip = { 10, 0, 0, 4};
byte server = {65,55,172,25 }; hotmail

Client client(server, 995);

void setup()
{
Ethernet.begin(mac, ip);
Serial.begin(9600);

delay(1000);

Serial.println(“connecting…”);

if (client.connect()) {
Serial.println(“connected”);
client.println(“user Your.name”);
client.println(“pass PassWord”);
client.println(“quit”);
client.println();
} else {
Serial.println(“connection failed”);
}
}

void loop()
{
if (client.available()) {
char c = client.read();
Serial.print(c);
}

if (!client.connected()) {
Serial.println();
Serial.println(“disconnecting.”);
client.stop();
for(;:wink:
;
}
}

Farlo da hotmail è molto più complicato!! Non conosci neanche il contenuto del pacchetto che ti manda quel server...dovresti studiarti a fondo tutto il protocollo per riuscire ad interpretare per bene il contenuto e verificare se la mail ti arriva proprio da quell'indirizzo!! La cosa più semplice a mio parere è configuare il tuo pc come server e tramite una sessione telnet inviare messaggi su una determinata porta ad arduino. I problemi che stai avendo sui conflitti di ip non so a cosa possano esser dovuti...sicuro di non utilizzare ip già assegnati?? :-/

allora ho messo il mio pc come server e ho aperto la porta 23 del telnet...adesso si collega...ma come faccio a mandargli dei messaggi?..nel senso ke gli dovrei mandare una mail e l'indirizzo di destinazione quale sarebbe? sul telnet nn si possono mandare messaggi istantanei... :-/

Manda un messaggio del tipo 'HELO arduino'. Se arduino lo legge, allora ti basta controllare il messaggio e accendere o spegnere il led di conseguenza! ;)

Ovviamente per collegarti devi aprire telnet e connetterlo ad Arduino!! Se l'ip che hai assegnato ad Arduino è 192.168.1.3:

telnet 192.168.1.3

io in questo programma nn so dove piazzargli il messaggio…se poi intendi mandarlo da telnet…bisogna indicare indirizzo del mittente e destinatario…

Te l'ho già scritto...

Manda un messaggio del tipo 'HELO arduino'. Se arduino lo legge, allora ti basta controllare il messaggio e accendere o spegnere il led di conseguenza! Wink

Puo’ darsi che non abbia capito bene quello che cercate di fare, in tal caso mi scuso in anticipo.
Se invece l’obiettivo e’ quello di accendere o spegnere un led con un comando da rete, allora innanzitutto il pin 13 non va bene perche’ Arduino uses digital pins 10, 11, 12, and 13 (SPI) to communicate with the W5100 on the ethernet shield.
Poi per mandare un comando da internet io ho settato Arduino come Server su una porta qualsiasi (77 in questo caso) e mi sono collegato con un Client usando telnet .
A questo punto ho definito dei “comandi” ai quali Arduino risponde con operazioni diverse sul led.
Il codice che segue utilizza la porta seriale per visualizzare informazioni su quello che succede, ma ovviamente non e’ necessaria:

#include <Ethernet.h>

//Arduino uses digital pins 10, 11, 12, and 13 (SPI) to communicate with the W5100 on the ethernet shield
int ledPIN = 9;
byte mac = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
//byte ip = { 10, 0, 0, 4};
byte ip = { 192, 168, 178, 177 };
byte gateway = { 192, 168, 178, 1 };
byte subnet = { 255, 255, 255, 0 };

Server server(77);

void setup()
{
// setta come output
pinMode(ledPIN, OUTPUT);
// initialize the ethernet device
Ethernet.begin(mac, ip, gateway, subnet);
// start listening for clients
server.begin();
Serial.begin(9600);
Serial.println(“Accepting connections at port 77”);
blink (5);
}

void loop()
{
Client client = server.available();
// il client si collega con il comando:
// telnet 192.168.178.177 77
if (client) {
int rcv = client.read();
// echo vs il client:
server.write(rcv);
// Serial.print(rcv);

// comandi accettati:
// 1=acceso, 0=spento, B=blink
switch (rcv) {
case ‘1’:
digitalWrite(ledPIN, HIGH);
Serial.println(“CMD 1 received”);
break;
case ‘0’:
digitalWrite(ledPIN, LOW);
Serial.println(“CMD 0 received”);
break;
case ‘B’:
blink(2);
Serial.println(“CMD B received”);
break;
}
}
}

void blink (int times)
{
for (int cnt=times; cnt>0; cnt–)
{
digitalWrite(ledPIN, HIGH); // set the LED on
delay(200);
digitalWrite(ledPIN, LOW); // set the LED off
delay(200);
}
}

grazie mille...era proprio quello ke cercavo..