Salve a tutti, mi sono avvicinato ad arduino da qualche mese. Attualmente ho un paio di dubbi e problemi con l'ethernet shield (credo di tipo software). Sono abbastanza pratico con Java (anche se non con programmi di questo tipo..) e sto sviluppando un software per controllare 4 motori (velocità e direzione) il programma l'ho testato (in versione ridotta: un solo motore) e funziona. Il problema è che volevo fare così:
1)Client java per controllare i motori (comunica attraverso la porta 8888 ed è sempre connesso ad arduino), questa connessione è perenne e mi serve anche come debug, se si sconnette per più di un minuto arduino attiva un "funzione" d'emergenza;
2)Client http(porta 80): arduino stampa i valori dei pin analogici ogni tot secondi su pagina web;
I due client funzionano da soli, ma quando cerco di unirli nello stesso sketch ho problemi. Credo il problema (ed effettivamente ha senso ) sia che non è possibile avere due server su arduino (uno che comunica con la porta 80 e uno con la porta 8888) contemporaneamente attivi. Sto usando la libreria Ethernet. Ditemi se serve postare il codice arduino. (comunque una volta finito il programma java, lo condividerò con piacere con altri interessati )
Io ho sia webserver che webclient nello stesso sketch.
in realtà comunico con il server con EthernetUDP sulla 8888 e ricevo richieste sulla 80, ma sono due funzioni ben distinte, prima ne faccio una la chiudo e poi faccio l'altra e la chiudo.
stai usando UDP o HTTP (client.println("GET /************ HTTP/1.0"))per trasmettere al server?
in teoria dovrebbe funzionare nello stesso sketch eseguendone uno alla volta
Grazie mille per la risposta. Si ho notato che uno alla volta funziona. A me servirebbe invece far funzionare tutti e due contemporaneamente. Cioè mentre è connesso il client java, ogni tot secondi far partire quello http. Per l'http sto usando direttamente l'esempio WebServer (che scrive i valori dei pin analogici) e una versione modificata del webserver per comunicare (sia in ricezione che in trasmissione) sulla porta 8888. Il problema è che il client sulla porta 8888 lo vorrei sempre connesso e mettere all'interno del secondo client, il primo. Non so se si è capito :). E' Possibile?
no nessun errore di compilazione è solo che quando mi connetto con il client java il client http non riesce più a comunicare con arduino. se hai presente l'esempio webserver in pratica non riesce a refreshare la pag dopo la prima volta.
Questo è il codice (il serverControlloMotori è quello che comunica con il java client):
#include <SPI.h>
#include <Ethernet.h>
// Enter a MAC address, IP address and Portnumber for your Server below.
// The IP address will be dependent on your local network:
byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0xFA, 0xAA };
String analogicPinFunctions[6] = {"Profondità: ", "Batteria : ", "Temperatura: ", "Umidità: ", "Pressione: ", "Umidità2: "};
IPAddress serverIP(192,168,1,4);
int serverPort=8888;
// Initialize the Ethernet server library
// with the IP address and port you want to use
EthernetServer serverControlloMotori(serverPort);
EthernetServer serverAnalogico(80);
void setup()
{
// start the serial for debugging
Serial.begin(9600);
// start the Ethernet connection and the server:
Ethernet.begin(mac, serverIP);
serverControlloMotori.begin();
serverAnalogico.begin();
pinMode(6, OUTPUT);
Serial.println("Server started");//log
}
void loop()
{
// listen for incoming clients
EthernetClient clientControlloMotori = serverControlloMotori.available();
EthernetClient clientAnalogico = serverAnalogico.available();
if (clientControlloMotori) {
int clientMsg =0;
while (clientControlloMotori.connected()) {
// an http request ends with a blank line
boolean currentLineIsBlank = true;
while (clientAnalogico.connected()) {
if (clientAnalogico.available()) {
char c = clientAnalogico.read();
// 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) {
// send a standard http response header
clientAnalogico.println("HTTP/1.1 200 OK");
clientAnalogico.println("Content-Type: text/html");
clientAnalogico.println();
clientAnalogico.println("<meta http-equiv=\"refresh\" content=\"5\">");
// output the value of each analog input pin
for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
clientAnalogico.print(analogicPinFunctions[analogChannel]);
clientAnalogico.print(analogRead(analogChannel));
clientAnalogico.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);
clientAnalogico.stop();
if(clientControlloMotori.available()==2){
int c = clientControlloMotori.read();
//if the command is the HANDSHAKE
if(c==1){
int p = clientControlloMotori.read();
Serial.println("HandShake from client");//print it to the serial
clientControlloMotori.println("Salve Java Client");//modify the string and send it back
clientMsg=0;
}
if(c==2)
{
int p = clientControlloMotori.read();
Serial.print("Modifica velocità motore Dx: ");
Serial.println(p);
analogWrite(6, p);
clientControlloMotori.println("Modifica Riuscita!");
delay(20);
}
if(c==3)
{
int p = clientControlloMotori.read();
Serial.println(p);
Serial.println("Staccare connessione");
clientControlloMotori.println("Connessione Chiusa");
}
}
}
delay(1);
// close the connection:
clientControlloMotori.stop();
}
c'è il primo problema, se il client web ti fa una persistent connection non esci più dal loop, prova ad usare
clientAnalogico.println("HTTP/1.0 200 OK");
che non prevede le connessioni permanenti ma ne fa una per ogni richiesta.
grazie per la prima dritta. A proposito c'è un sito dove posso trovare queste informazioni? le varie inizializzazioni http?
Comunque ho fatto un pò di debug prima di postare sul forum il programma. In pratica la prima volta che connetto il java client tutto va bene. Ma dopo i 5 secondi (quando dovrebbe refreshare la pagina html) il programma di controllo motori continua a funzionare tranquillamente mentre il client http non riesce più a comunicare (in pratica il clientAnalogico.connected() restituisce 0). Se dal java client faccio disconnect (funzione che chiudo il socket) e subito dopo riconnect (tasto che inizializza e connette il socket) allora riesce il refresh della pagina html e mi restituisce arduino i valori dei pin analogici (tutto ok quindi). Il vero problema è che non riesco mentre il java client rimane connesso a refreshare la pagina html per vedere i nuovi valori dei sensori. Grazie a tutti per l'aiuto
Scusa pablos ho letto ora. Sembra di no. Perchè il java client riesce a continuare tranquillamente senza problemi mentre la pagina html tenta il refresh senza riuscirci... aspetta che controllo il messaggio di errore