aduino ethernet shield

opto per la più facile grazie!!! :slight_smile:

sto cercando di caricare l'esempio di gianni c. libreria tinyWebServer - #11 by candy - Generale - Arduino Forum ma mi dà l'errore quando carico lo skethc su arduino; ho copiato i file nella root della sd, e poi la demo su arduino: -------> serie di errors!!!!come mai?

senza conioscere gli erorri la vedo dura....

finalmente riesco ad accendere un led da ethernet

#include <Server.h>
#include <Client.h>

#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,1,15 };
byte gateway[] = {192,168,1,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("Accetto");
blink (5);
}

void loop()
{
Client client = server.available();
server.write('ok');
// il client si collega con il comando:
// telnet 192.168.1.15 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);
}
}

qualcuno mi aiuta comporre uno sketch che mi consenta di mettere in ascolto il secondo dei due arduino collegati su rete intranet mentre il primo invia un comando? fin'ora sono riuscito "solo" ad inviare un comando via telnet e fare accendere un led (con ethernet shield)!!!!
praticamente devo inviare un comando sull'indirizzo ip del secondo arduino.....ma non trovo la soluzione... :~
grazie a tutti!!

beh, il secondo arduino sarà un client...
e guarda caso tra gli esempi c'è TelnetClient, che legge dei comandi da seriale e li invia al server... a partire da quel codice dovrebbe essere uno scherzo fare quello che ti serve :grin:

...che fatica..ma non mi arrendo!!! grazie lesto di tutte le dritte!!
finalmente ho modificato un prgammino in html che mi fa accendere il led con una inte

/*
Web server preso dall'esempio dell'ide e modificato da me
*/

#include <SPI.h>
#include <Ethernet.h>
#include <WString.h>

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x3A, 0xA3 };
byte ip[] = { 192,168,0,107 };

// Initialize the Ethernet server library
// with the IP address and port you want to use
// (port 80 is default for HTTP):
Server server(80);

int analogChannel = 5; //pin analogico dell LM35
int ledpin = 8; //pin del led
float tempC = 0; //temperatura in gradi celsius
int ledstatus = 0; //stato del led

void setup()
{
// start the Ethernet connection and the server:
Ethernet.begin(mac, ip);
server.begin();
pinMode(analogChannel,INPUT); //input dell' LM35
pinMode(ledpin,OUTPUT); //output del led
Serial.begin(9600);
}

void loop()
{
//leggiamo la temperatura
tempC = (analogRead(analogChannel) * 4.88 * 100)/1024;
// listen for incoming clients
Client client = server.available();
if (client) {
// an http request ends with a blank line
boolean currentLineIsBlank = true;
String readstring; //stringa per la lettura dal browser
while (client.connected()) {
if (client.available()) {
char c = client.read();
readstring.concat(c); //aggiunge c alla stringa;
// if you've gotten to the end of the line (received a newline
// character) and the line is blank, the http request has ended,
// so you can send a reply
if (c == '\n' && currentLineIsBlank) {
readstring.concat('\0');
//controllo su seriale
Serial.println("stringa: ");
Serial.println(readstring);
Serial.print("indexOf(led=1): ");
Serial.println(readstring.indexOf("led=1"));
Serial.print("indexOf(led=0): ");
Serial.println(readstring.indexOf("led=0"));

if(readstring.indexOf("led=1") == 6){
digitalWrite(ledpin,HIGH);
ledstatus = 1;
Serial.println("LED ON"); //controllo
}
if(readstring.indexOf("led=0") == 6){
digitalWrite(ledpin,LOW);
ledstatus = 0;
Serial.println("LED OFF"); //controllo
}
// send a standard http response header
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println();
//Creazione pagina web
client.println("");

client.println("Domotic-Arduino");

client.println("");
client.println("<body bgcolor=""black"" text=""white"">");

client.println("<h1 align=""center"">Domotic-Home


");
client.println("
");
client.print("Temperatura interna : ");
client.print((int)tempC);
client.println(" C");
client.println("

");
client.println("

<a href=""/"">Aggiorna Sensore

");
client.println("
");
client.println("
");
client.println("
");
client.print("Comandi LED su pin ");
client.println(ledpin);
client.println("
");
client.print("Stato LED :");
if(ledstatus){
client.println("<font color=""green""> ON");
}else{
client.println("<font color=""red""> OFF");
}
client.println("
");
client.println("

<a href=""/?led=1"">ACCENDI | <a href=""/?led=0"">SPEGNI</>

");

client.println("");

break;
}
if (c == '\n') {
// you're starting a new line
currentLineIsBlank = true;
}
else if (c != '\r') {
// you've gotten a character on the current line
currentLineIsBlank = false;
}
}
}
// give the web browser time to receive the data
delay(1);
// close the connection:
client.stop();
}
}

rfaccia grafica in html.

Ma ora non riesco a capire come fare a farlo accendere premendo il tasto sull'altro arduino. Ho provato con la libreria telnet client: ma dove modifico la stringa per far capire al server che deve rievere da client?

grazie a presto.

non devi modificare nulla. Il secondo arduino si connette, invia un messaggio facendo in modo che la stringa "led=1" o "led=0" sia in 6 posizione, così da essere riconosciuta e accettata dall'indexof().
fine :slight_smile:

quindi non mi resta che collegare il pulsante su pin 2 e 5V , con il resistore pin 2 verso ground e alla pressione del pulsante il server sarà già in ascolto... naturalmente dopo aver assegnato gli indirizzi del client per far recapitare il tutto al server in rete locale!!! Speriamo bene..a dopo per i risultati, spero che non mi esploda l'arduino XD XD XD.......

che faccio lesto, procedo così?

in teoria sì, ma non mi assumo responsabilità su incendi :grin:

...non prende fuoco nè si accende il led!!! cosa posso postare per un aiutino??? :smiley:

questa è la sketch del client con i parametri di rete modificati:

*/

#include <SPI.h>
#include <Ethernet.h>

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = {
192,168,0,108 };

// Enter the IP address of the server you're connecting to:
byte server[] = {
192,168,0,107 };

// Initialize the Ethernet client library
// with the IP address and port of the server
// that you want to connect to (port 23 is default for telnet;
// if you're using Processing's ChatServer, use port 10002):
Client client(server, 23);

void setup() {
// start the Ethernet connection:
Ethernet.begin(mac, ip);
// start the serial library:
Serial.begin(9600);
// give the Ethernet shield a second to initialize:
delay(1000);
Serial.println("connecting...");

// if you get a connection, report back via serial:
if (client.connect()) {
Serial.println("connected");
}
else {
// if you didn't get a connection to the server:
Serial.println("connection failed");
}
}

void loop()
{
// if there are incoming bytes available
// from the server, read them and print them:
if (client.available()) {
char c = client.read();
Serial.print(c);
}

// as long as there are bytes in the serial queue,
// read them and send them out the socket if it's open:
while (Serial.available() > 0) {
char inChar = Serial.read();
if (client.connected()) {
client.print(inChar);
}
}

// if the server's disconnected, stop the client:
if (!client.connected()) {
Serial.println();
Serial.println("disconnecting.");
client.stop();
// do nothing:
while(true);
}
}

con il pulsante collegato sul 5v e sul pin 2, a sua volta collegato a G, secondo lo schema del pulsante. Ma come faccio ad abilitare questi ingressi?

il tuo client si sta connettendo nel setup e basta. errato!
nel setup si collega e invia "led=0", poi nel loop() controlla lo stato del bottone, se cliccato si ricollega e invia "led=1", rimane a loppare fino a quando il bottone di nuovo cambia etc etc...

lesto:
il tuo client si sta connettendo nel setup e basta. errato!
nel setup si collega e invia "led=0", poi nel loop() controlla lo stato del bottone, se cliccato si ricollega e invia "led=1", rimane a loppare fino a quando il bottone di nuovo cambia etc etc...

????? ma da qualche parte devo associare "led=0" oppure "1" nel client?
come faccio a testare il client da seriale, come faccio a capire se effettivamente si connette all'altro arduino? Se imposto il mio computer locale come server, in seriale dovrei avere un messaggio di connessione ? help.....grazie

se imposti l'ip del tuo pc non comunichi via seriale, ma sempre via TCP (quindi ethernet/wifi) e il tuo PC deve avere un programma che con un socket ascolta la porta e metta avideo i messaggi che arrivano.
Il C non ha delle librerie di default per i Socket, pochè sono dipendenti dal sistema operativo. Però ce li ha java, e quindi Processing... Tra l'altro molto semplici da usare.

????? ma da qualche parte devo associare "led=0" oppure "1" nel client?

che vuol dire associare in questo contesto?
Quando hai bisogno di accendere il led, se la connessione è attiva invii il messagio, se no ti connetti e invii il messaggio. stessa cosa per spegnerlo. Non vedo nulla di complicato in ciò

[

????? ma da qualche parte devo associare "led=0" oppure "1" nel client? che vuol dire associare in questo contesto?

nel senso che per dire al client che, premendo il pulsante collegato al pin 2 mi deve inviare il comando al server nella posizione dell'index non ho idea di come si possa fare: ho provato a cercare ma non c'è nessun esempio del genere..... =(

bhe devi semplicemente inviare lo stesso comando che avrebbe inviato il browser no? non c'è nulla di complicato o di già fatto, si tratta di una client.write()

cosa sbaglio ancora????

#include <SPI.h>
#include <Ethernet.h>

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192,168,0,108 };// my client arduino n°2)
byte server[] = { 192,168,0,107 }; // my server (arduino n°1)

// Initialize the Ethernet client library
// with the IP address and port of the server
// that you want to connect to (port 80 is default for HTTP):
Client client(server, 80);

const int buttonPin = 2; // the number of the pushbutton pin (arduino 1)
int buttonState = 0; // variable for reading the pushbutton status

void setup() {
pinMode(buttonPin, INPUT); // initialize the pushbutton pin as an input:
// start the Ethernet connection:
Ethernet.begin(mac, ip);
// start the serial library:
Serial.begin(9600);
// give the Ethernet shield a second to initialize:
delay(1000);
Serial.println("connecting...");

// if you get a connection, report back via serial:
if (client.connect()) {
Serial.println("connected");

}
else {
// kf you didn't get a connection to the server:
Serial.println("connection failed");
}
}

void loop()
{
// if there are incoming bytes available
// from the server, read them and print them:
if (client.available()) {
char c = client.read();
// read the state of the pushbutton value:
buttonState = digitalRead(buttonPin);

// check if the pushbutton is pressed.
// if it is, the buttonState is HIGH:
if (buttonState == HIGH) {
// turn LED on:
client.write("led=1");
Serial.println("led acceso");
}
else {
// turn LED off:
(buttonState == HIGH);
client.write("led=0");
Serial.println("led spento");
}
Serial.print(c);

}

//if the server's disconnected, stop the client:
if (!client.connected()) {
Serial.println();
Serial.println("disconnecting.");
client.stop();

// do nothing forevermore:
for(;:wink:
;
}
}

dovrebbe mancare qualcosa nel setup: se inserisco direttamente nel setup un comando POST / led=1 e carico la sketch il led si accende, led=0 si spegne; per il collegamento del pulsante ancora non ho risultati!!! mi aiutate????? grazie.

uhhh ma ce l'hai su con questo

// do nothing forevermore:
for(;;)

se non fai più nulla, non controlli nemmeno più lo stato del pulsante. il loop() si deve continuare a ripetere all'infinito!! cosa che fa da solo se non lo blocchi...