salve, sto cercando di configurare un client che deve inviare un comando al server solo se si verifica un determinato evento, per esempio la pressione di un pulsante:
qualcuno ha qualche idea????....qualche caso simile???? grazie
Spiegati un pò meglio...
che tipo di server? Un server scritto sempre da te o uno esistente? (ad esempio un server web)
E la pressione di un tasto da tastiera o di arduino?
grazie della risposta: ho un arduino web client e un arduino webserver. Al verificarsi di un evento sul client (pressione di un pulsante) deve accendersi un led sull'arduino server. Fin'ora sono riuscito con un codice che però ciclicamente manda un POST al server quando il pulsante è HIGH oppure quando è LOW: tutto funziona perfettamente. Il problema è che non vorrei che si saturi la banda del router: quindi vorrei fare una richiesta quando (e solo quando) il pulsante cambia stato. Come posso fare? Non riesco a trovare qualche esempio che mi metta sulla "retta via" ; spero in un aiuto, grazie, Fabio
ps il codice sul client è questo:
#include <Client.h>
#include <Ethernet.h>
#include <Server.h>
#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; // numero del pin del pulsante
const int ledPin = 7; // numero del pin del led
int buttonState = 0; // variabile per la lettura dell stato del pulsante;
void setup() {
// inizializza il pin del LED come uscita:
pinMode(ledPin, OUTPUT);
// initializza il pin de pulsante come input:
pinMode(buttonPin, INPUT);
Ethernet.begin(mac, ip);
// inizializza la libreria seriale:
Serial.begin(9600);
//inizializza la Ethernet shield, dopo un secondo:
delay(1000);
Serial.println("connecting...");
// se ottiene una connessione, stampa via seriale:
if (client.connect())
Serial.println("connected");
else {
// se non si connette al server:
Serial.println("connection failed");
}
}
void loop(){
// legge lo stato del pulsante:
buttonState = digitalRead(buttonPin);
// controlla se il pulsante è premuto:
if (buttonState == HIGH) {
Serial.println("led acceso");//stampa su seriale;
digitalWrite(ledPin, HIGH);// accendo un led spia su client;
client.connect();//connette il client
{Serial.println("connesso");} //stampa su seriale;
client.println("POST /led=1");//invia il comando "accendi led";
client.println();
client.stop();}
else {
!client.connect();//se la risposta è falsa;
{ Serial.println("connesso"); }
// spegne il led:
digitalWrite(ledPin, LOW);
Serial.println("led spento");//scrive su seriale;
client.println("POST /led=0");//invia il comando "spegni led";
client.println();}
client.stop();
delay (2000);}//end delay before loop starts again
grazie a presto!!
Ok! Secondo me il modo più semplice per risparmiare banda è che il client notifichi al server SOLO i cambiamenti di stato.
In altre parole il client invia un messaggio di "led acceso" solo quando il pulsante è premuto e al loop precedente non lo era, ed invia un messaggio di "led spento" solo quando il pulsante non è premuto ma al loop precedente lo era.
In questo momento non ho molto tempo per scrivere il codice, ma ti posso consigliare di modificare quello che già utilizzi e gestire il concetto di "stato precedente" tramite una variabile (ad esempio di tipo bool).
ho provato a connettermi al client con questa sketch, ma funziona solo in parte:
#include <SPI.h>
#include <Ethernet.h>
#include <Client.h>
// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
// il MAC Address lo posso inventare
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192,168,0,108 };
byte server[] = { 192,168,0,107 }; // mio computer
Client client(server, 80);
// set pin numbers:
const int buttonPin = 2; // the number of the pushbutton pin
const int ledPin = 7; // the number of the LED pin
// variables will change:
int buttonState = 0;
int buttonStateOld = 0; // variable for reading the pushbutton status
// 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):
void setup() {
// initialize the LED pin as an output:
pinMode(ledPin, OUTPUT);
// initialize the pushbutton pin as an input:
pinMode(buttonPin, INPUT);
// start the Ethernet connection:
Ethernet.begin(mac, ip);
// inizializza la libreria seriale:
Serial.begin(9600);
//inizializza la Ethernet shield, dopo un secondo:
delay(1000);
Serial.println("connecting...");
// se ottiene una connessione, stampa via seriale:
if (client.connect())
Serial.println("connected");
else {
// se non si connette al server:
Serial.println("connection failed");
}
}
void loop()
{buttonStateOld=buttonState;
buttonState = digitalRead(buttonPin);
// check if the pushbutton is pressed.
// if it is, the buttonState is HIGH:
if (buttonState != buttonStateOld)
{
if (buttonState == HIGH){
client.connect();//connette il client
Serial.println("connesso"); //stampa su seriale;
client.println("POST /led=1");//invia il comando "accendi led";
client.println();
Serial.println("led acces");
client.stop();
// turn LED on:
digitalWrite(ledPin, HIGH);
} }
else
if (buttonState == LOW){
!client.connect();
Serial.println("connesso"); //stampa su seriale;
client.println("POST /led=0");//invia il comando "spegni led";
client.println();
Serial.println("post led spento");
client.stop();
// turn LED off:
digitalWrite(ledPin, LOW);// accendo un led spia su client;
Serial.println("led spento");//stampa su seriale;
}delay (2000);//end delay before loop starts again
}
nel caso in cui il pin è HIGH, si connette e stampa LED=1, nel caso il pin è LOW si connette e stampa in continuazione LED=0. Come faccio a far stampare LED=0 solo una volta finchè il pin diventa di nuovo HIGH? grazie, a presto
nessuno mi aiuta???????