ping alive

Ciao Vorrei creare una sorta di ping alive con un arduino nano e una shield ethernet: mi servirebbe che in ogni intervallo di tempo prestabilito arduino interroghi un determinato IP con un numero stabilito di ping (ad esempio 10 ping), in caso ci sia risposta a questi IP resta tutto invariato, in caso contrario se perdo ad esempo 8 pacchetti si deve attivare un rele' per circa 10 secondi e poi ritornare allo stato precedente?

cosa mi consigliate?

Buongiorno,
essendo il tuo primo post nella sezione Italiana del forum, nel rispetto del nostro regolamento, ti chiedo cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ... Grazie. :slight_smile:

Credo che sia suficiente intervallare le richieste usando millis, dopo ogni connessione all'ip desiderato memorizzi in una variabile il numero di connessione eseguite e in un'altra variabile quante di queste sono fallite.
Dopo dieci connessioni tentate controlli quante siano fallite, se sono troppe attivi il relé e aspetti i secondi necessari (qui se non devi far altro puoi usare il delay al posto di millis), dopodiché spegni il relé, azzeri le due variabili indicate in precedenza e il ciclo ricomincia

fabpolli:
Credo che sia suficiente intervallare le richieste usando millis, dopo ogni connessione all'ip desiderato memorizzi in una variabile il numero di connessione eseguite e in un'altra variabile quante di queste sono fallite.

Concordo, ma il ping (ICMP) non ha connessioni, quindi deve mandare il ping e verificare che riceva la risposta entro un certo tempo. Se vuole mandare 10 ping e contare quanti di questi rispondono può farlo sequenzialmente attendendo con dei delay() ma ovviamente la cosa blocca il resto del programma per un certo tempo (es. 10 ping nei quali si attendono i classici 2 secondi significa che Arduino resta "sospeso" per ben 20 secondi).
Per cui sarebbe necessario gestire l'invio e relativa ricezione con millis(), il che complica n poco il discorso ma si può fare benissimo.

Il problema è come risponde la libreria utilizzata alle richieste? Potrebbe anche essere che "basti" delay(), tanto deve solo "svegliare" un apparato.

speedyant:
Il problema è come risponde la libreria utilizzata alle richieste?

Dipende dalla libreria. Con QUESTA puoi realizzare sia un ping sincrono (aspetta la risposta o il timeout e restituisce l'esito):

  ICMPEchoReply echoReply = ping(pingAddr, 4);
  if (echoReply.status == SUCCESS)
  {

o asincrono:

  if (! ping.asyncStart(pingAddr, 3, echoResult))
  {
    Serial.print("Couldn't even send our ping request?? Status: ");
    Serial.println((int)echoResult.status);
    delay(500);
    return;

  }

  // ok the ping started out well...
  Serial.println("Ping sent ");
  while (! ping.asyncComplete(echoResult))
  {
    // we have critical stuff we wish to handle
    // while we wait for ping to come back
    someCriticalStuffThatCantWait();
  }

  // async is done!  let's see how it worked out...
  if (echoResult.status != SUCCESS)
  {

Potrebbe anche essere che "basti" delay(), tanto deve solo "svegliare" un apparato.

Allora può usare quello sincrono (che di fatto è come fare un asincrono attendendo il timeout).

Se fosse il mio progetto, io conterei subito i “fallimenti”, sono quelli “importanti” per scatenare il relè!