Libreria Udp e ping

Ciao ragazzi facendo un nuovo progettino mi sono trovato a dover usare n 2 arduini ethernet che dovrebbero comunicare tra di loro tramite UDP ed in più uno dei due in determinate situzioni dovrebbe fare un ping di qualche indirizzo ip per vedere se è disponibile in rete.
Separatamente, la parte del ping e la parte udp funzionano bene ma quando cerco di usarle entrambe nello stesso sketch non funzionano.
sapete se vi è qualche incompatibilità? posto un esempio!
Grazie a tutti per la disponibilità.

lato_send_30_12_13.ino (1.28 KB)

Ciao e benvenuto. Ti invito alla lettura del regolamento.

Ciao.
Non c’è bisogno di richiamare la funzione loop dalla funzione allarme.
Quando il micro finisce di processare la funzione ritorna al punto della chiamata e prosegue con gli altri comandi.

#include <SPI.h>        
#include <Ethernet.h>
#include <EthernetUdp.h>
#include <ICMPPing.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, 0xFD, 0xED };
IPAddress ip(192, 168, 0, 178);
IPAddress pingAddr_teo(192,168,0,200); // ip address to ping

unsigned int localPort = 8888;      // local port to listen on
int port=8888;

// An EthernetUDP instance to let us send and receive packets over UDP
EthernetUDP Udp;
int led = 9;
SOCKET pingSocket = 0;//x ping
char buffer [256];//x ping
ICMPPing ping(pingSocket, (uint16_t)random(0, 255));

void setup() {
  // start the Ethernet and UDP:
  pinMode(led, OUTPUT); 
  Ethernet.begin(mac,ip);
  Udp.begin(localPort);
  Serial.begin(9600);
}

void loop() {
  ICMPEchoReply echoReply = ping(pingAddr_teo, 4);
  if((echoReply.status == SUCCESS) or (echoReply.status == SUCCESS) )
  {
    digitalWrite(led, HIGH);
    // allarme();
    delay(2000);
  }
  else
  { 
    digitalWrite(led, LOW);
    interrupts();
    Udp.beginPacket("192.168.0.177", port);
    Udp.write("hello");
    Udp.endPacket();
    delay(2000);
    //  allarme();
  }
}

void allarme()
{ 
  Udp.beginPacket("192.168.0.177", port);
  Udp.write("hello");
  Udp.endPacket();
  delay(2000);
  //loop();   <-- questo non serve
}

Se chiami allarme() sia nell’IF che nell’ELSE tanto vale metterlo fuori. Viene chiamato comunque.
Guarda l’esempio “blink whitout delay” nell’IDE, per capire come temporizzare le operazioni e eliminare i delay().
Oppure puoi usare delle librerie come LeOS o Looper.

Leo ciao, ok ok sto leggendo il regolamento! Ciao paolo, inanzi tutto grazie! Cmq sinizialmente non richiamavo la funzione ma poi in uno dei tanti tentativi l'ho messo dentro in quanto sembra che arrivato a quel punto l'esecuzione del programma si ferma. C'è per intenderci meglio, finche chiamo solo le funzioni riguardanti il ping funziona tutto ma quando arrivando da un ping apro l'udp l'esecuzione del programma sembra fermarsi.

Ciao ragazzi, io usando Arduino UNO + Ethernet Shield non riesco a farlo funzionare. Mi va sempre in errore alla riga ICMPEchoReply echoReply.... Cosa potrebbe essere? Grazie anticipatamente.

Era meglio aprire una nuova discussione piuttosto che riesumarne una di 1 anno fa. E metti tutti i dettagli perché con quelle tre righe in croce che hai scritto ci vuole la sfera di cristallo per indovinare il problema.