problema client server arduino

Salve a tutti. ho un problema di comunicazione ethernet fra due arduino.

Il primo arduino fa da server, si occupa di leggere 5 sonde one wire ds18b20.
ci gira un server web che gestisce le chiamate sulla porta 90 e alla richiesta browser stampa una paginetta che risiede nella sd con i valori delle sonde attraverso xml rendendo il contenuto dinamico.

il secondo arduino si connette al server fa una chiamata get legge il contenuto di tutta la parte xml del server e fa un parseFloat() e ricava il valore della sonda che interessa.

il tutto funziona benissimo per un giorno, ma inspiegabilmente si pianta il client. ho inserito un contatore per vedere se la connessione tra client è server è riuscita e dopo un giorno vedo che tutto è a zero come se non funzionasse piu il client.

ecco lo sketch lato client

if (clientpuffer.connect(ippuffer, 90)){
  
 clientpuffer.print("GET /ajax_inputs");
  
  clientpuffer.println(" HTTP/1.0");
  clientpuffer.println("Host: 192.168.1.35");   
  clientpuffer.println();
  
 
  }
  else {
  Serial.println("connessione al file sul server web fallita");
 
  }
  if (clientpuffer.connected()){
    
    
  
      if(clientpuffer.find("<sondapuffer3>")){
      sondapuffer=clientpuffer.parseFloat();
 
 
            if (tmpcontrol>=0&&tmpcontrol<10){
            tmpcontrol++;}
  
  
  
      Serial.println("valore temperatura in Celsius: "); 
      Serial.println(sondapuffer);
      Serial.println("valore tmpcontrol "); 
      Serial.println(tmpcontrol);
      clientpuffer.stop();
  }
            else {
    Serial.println("non trovo <tmp>");
    
    
    if (tmpcontrol>0&&tmpcontrol<=10){
  tmpcontrol--;
    }
}
    
  }
  
  else {
  Serial.println();
  if (tmpcontrol>0&&tmpcontrol<=10){
  tmpcontrol--;
  
  }
}
  
clientpuffer.stop(); // ferma il client
clientpuffer.flush(); // svuota i dati del client

  }}

forse potrei provare ad inserire un client.stop al di fuori di questo if ma non capisco perchè me lo propone dopo un giorno il problema…

grazie a tutti

... il programma va messo COMPLETO, con solo un pezzetto ci facciamo ben poco.

Guglielmo

scusate… ecco lo sketch lato client:

Ora devo capire perchè dopo un giorno mi si pianta tutto…

sketch_forum_caldaia.ino (9.39 KB)

... hai provato a fare anche qualche ricerca qui sul forum? Perché ricordo che molto tempo fa si era parlato di un problema di malfunzionamento delle Ethernet Shield che si bloccavano dopo un certo tempo di funzionamento.

Non so se poi il problema, con le ultime release del IDE, sia stato risolto ...

Prova a leggere, ad esempio, QUESTO vecchio thread ... ::)

Guglielmo

grazie guglielmo. si ho letto vari thread sulla "bontà" dell'ethernet... ho ottenuto risultati reinizzializando il server ogni tot. secondo me il problema sta nel fatto che il client apre la connessione e poi resta li in attesa ad aspettare un risultato che non arriva. ora non ho ben chiaro cosa faccia il comando client.flush() perchè sul sito di arduino sembra che dica che in qualche modo aspetta di inviare tutti i dati in buffer... non è che forse è proprio quello il problema?

Stando al reference, la client.flush() ferma il programma fino a quando tutto i caratteri nel buffer di trasmissione non sono stati effettivamente trasmessi ... se da problemi non te lo so dire ... ::)

Guglielmo

ora ho inserito nello sketch un client.flush e un client.stop ogni 2 minuti... ora sto a vedere se domani o dopodomani si blocca. comunque grazie mille, vi farò sapere

Nuovo aggiornamento. Dopo due giorni di funzionamento normale Arduino si è piantato nuovamente. A questo punto penso sia un problema di alimentazione. Proverò ad alimentare Arduino direttamente dal 5v e non dal USB. Comunque sia le cose hanno iniziato a peggiorare da quando ho attaccato una termocoppia. Se con il 5v non va proverò a escludere la termocoppia.

... hai dentro delle print() di debug ? Su cosa si pianta ? Non è che ad un certo punto occupi troppa memoria (... e quindi il programma va fuori controllo) ? ... intanto, per tutte le print() di messaggi, usa la macro F(), così risparmi memoria.

Guglielmo

Sì pianta così a secco... ho usato le macro f() su tutti i client print della parte web.

Come potrei fare per tenere monitorata la memoria durante i vari processi?

davideesse: Come potrei fare per tenere monitorata la memoria durante i vari processi?

Leggi QUI (se come antivirus usi Avast avrai un falso positivo. NOD32, che reputo infinitamente superiore, non rivela assolutamente nulla e il sito è di uno dei nostri moderatori).

Guglielmo

Ok. Stasera faccio un test con avr, anche perché il secondo metodo non saprei come implementarlo. Comunque visto che anche adesso si è nuovamente bloccato posso affermare che la parte ethernet si è bloccata ma la parte di codice funziona bene sento i relais che si aprono e chiudono come da programma. Grazie Guglielmo per i preziosi suggerimenti

Ma è proprio il secondo metodo che devi implementare ... ... ti scarichi dal link la libreria MemoryFree e la metti nella tua cartella library assieme alle altre librerie, in testa al programma la includi con:

*#include "MemoryFree.h" *

dopo di che, nei vari punti del programma dove vuoi controllare, non fai altro che fare:

Serial.println(freeMemory());

... e ti stampa i bytes di memoria libera in quel momento ;)

Guglielmo

Troppo bene Guglielmo…
Troppo gentile…
Stasera metto tutto in pratica.
Grazie ancora

Ho inserito nello sketch come detto da Guglielmo la funzione per testare la memoria libera e siamo a 5972. penso possa andar bene se non erro. ora vediamo se dovesse piantarsi di nuovo a quanto arriva la memoria disponibile.

Per togliere dubbi anche sull’alimentazione ho cercato sul forum e ho preso un alimentatore da pc e c’ho alimentato arduino. La scheda dei relais è alimentata da un altro alimentatore switching.

spero vivamente che non si pianti più.

vi terrò aggiornati.

grazie ancora

davideesse: Ho inserito nello sketch come detto da Guglielmo la funzione per testare la memoria libera e siamo a 5972. penso possa andar bene se non erro.

... mmm ... dipende ... se hai un Arduino UNO, NO, non va bene, la SRAM è di 2K e quindi 5972 indicherebbe un problema, se invece hai un Arduino MEGA 2560, la memoria SRAM è di 8KB e allora sarebbe un numero congruo.

Guglielmo

Mi sono dimenticato di specificare che è una Mega. Quindi ci dovremmo essere.

Grazie

Eccomi qua. Di nuovo si è piantata la parete ethernet. A questo punto non so più che fare. Poco prima che si piantasse la memoria disponibile era sempre a 5972... Boh... non so più che altri tentativi fare...

… cambiare scheda Ethernet ? :confused:

Genuino in Europa non la fa ancora, ma c’è QUESTA di SeeedStudio (… sono molto seri) che monta in nuovo W5500, molto più performante :slight_smile: A livello di codice non devi cambiare nulla, devi solo usare la loro libreria per quel chip. Dai un occhiata la WiKi relativo …

Guglielmo

Dici che sia un problema di ethernet? Alla fine sono solo poche righe... una richiesta al server ogni 30 secondi e basta. In più deve solo fare da server una volta ogni tanto quando controllo il tutto...

Proverò a snellire il codice a togliere l XML .

Grazie