UDP.begin() blocca il programma

Buonasera a tutti, mi trovo a chiedervi un consiglio su come risolvere un problema, a mio avviso, incomprensibile. Ho fatto uno sketch che gira bene su arduino UNO con una ethernet shield, preò, se inserisco la riga Udp.begin(localPort) il programma si blocca. Vi posto il codice fino al suddetto comando.
Ringrazio chiunque possa aiutarmi.
Alessandro.

#include <SunLight.h>
#include <SPI.h>
#include <Ethernet.h>
#include <EthernetUdp.h>
#include <BlynkSimpleEthernet.h>
#include <TimeLib.h>
#include <WidgetRTC.h>

#define BLYNK_GREEN     "#23C48E"
#define BLYNK_BLUE      "#04C0F8"
#define BLYNK_YELLOW    "#ED9D00"
#define BLYNK_RED       "#D3435C"
#define BLYNK_DARK_BLUE "#5F7CD8"
SunLight mySun; // Declaration of the object
float myLatitude = 45.9;
float myLongitude = 12.6;

//----------------- Comunicazione UDP (User Datagram Protocol)  ---------------------
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //DE:AD:BE:EF:FE:ED
IPAddress ip(192,168,1,40);// arduino luci
unsigned int localPort = 7880; // arduino luci
char DatiRX[20];
EthernetUDP Udp;
IPAddress IP_Remote(192,168,1,41); //citofono
unsigned int Port_Remote = 7878;  //citofono

EthernetClient client;
char server[] =  { 64, 233, 187, 99 }; //"www.google.com";  

//----------------- TIME ---------------------
WidgetRTC rtc;
BLYNK_CONNECTED() { rtc.begin(); }// Synchronize time on connection
int oraPrecedente = 0;

//--------------------------------------
#define BLYNK_PRINT Serial
char auth[] = "xxxxxxxxxxxxxxxxxxxxxx";
//passw: alebl //
int BttBlynkLuci = LOW;
int BttBlinkAntifurto = LOW;
int BttBlinkDisattivaSensore = LOW;
int BttBlinkflash = LOW;
int ValueUltimaVisita = 0;
bool SensorePresenzaDisattivato = false;
bool presenzaAttivata = false;
bool contaSecondiLuceAccesaTemporaneaTimer = false;
String tutto = "";
BlynkTimer timer;
void checkPhysicalButton();
void checkPhysicalButton(){}
BLYNK_WRITE(V0) {BttBlynkLuci = param.asInt();}
BLYNK_WRITE(V1) {BttBlinkAntifurto = param.asInt();}
BLYNK_WRITE(V2) {BttBlinkflash = param.asInt();}
BLYNK_WRITE(V3) {ValueUltimaVisita = param.asInt();}
BLYNK_WRITE(V4) {BttBlinkDisattivaSensore = param.asInt();}

//BLYNK_READ(V2) {Blynk.
bool luceRossaAttivata = false;
bool luceGiallaAttivata = false;
bool luceVerdeAttivata = false;

WidgetLED ledWrosso(V11);
WidgetLED ledWgiallo(V12);
WidgetLED ledWverde(V13);

//Uscite:
#define LedSemaforoRosso 7
#define LedSemaforoGiallo 6
#define LedSemaforoVerde 5
#define ComandoRele 4     

//Ingressi:
#define ConsensoPLC 3
#define SensorePresenza 2

bool StatoLuceManualePLC = false;
bool StatoLuceManualeBlynk = false;
int  Presenza = LOW;    //SensorePresenza
int  Consenso = LOW;  //ConsensoPLC

int contaSecondiLuceAccesa = 10000;
int contaSecondiPresenzaRilevata = 15000;
int contaSecondiLuceAccesaMax = 10000;
int contaSecondiLuceAccesaTemporanea = 10000;

void AzzeraSemaforo()
{
    digitalWrite(LedSemaforoRosso, LOW);
    digitalWrite(LedSemaforoGiallo, LOW);
    digitalWrite(LedSemaforoVerde, HIGH);
    ledWrosso.off();
    ledWgiallo.off();
    ledWverde.on();
    luceRossaAttivata = false;
    luceGiallaAttivata = false;
    luceVerdeAttivata = true;
}
void lampeggio(int numeroLampeggi)
{
  
	for (int i=0; i <= numeroLampeggi; i++)
    {
		digitalWrite(ComandoRele, LOW); //Low = ON
		delay(200);
		digitalWrite(ComandoRele, HIGH); //Low = OFF
		delay(200);
    }
}

void clockDisplay() //ogni 10 secondi
{
	Serial.println("-- 10 sec. --------------------");
	if (contaSecondiLuceAccesa <10000) {contaSecondiLuceAccesa += 10;}
	if (contaSecondiPresenzaRilevata <15000) {contaSecondiPresenzaRilevata += 10;}
	if (contaSecondiLuceAccesaMax <10000) {contaSecondiLuceAccesaMax += 10;}

	
	Blynk.virtualWrite(V3, contaSecondiPresenzaRilevata/60); 
}

void setup()
{  
	Blynk.begin(auth);
	Serial.begin(9600);
	Serial.println( "Inizia SETUP");
  
// ----------- ATTIVA ETHERNET E VERIFICA LA CONNESSIONE ---------------
	if (Ethernet.begin(mac) == 0)
	{
		Serial.println("Failed to configure Ethernet using DHCP");
		Ethernet.begin(mac, ip);
	}
// give the Ethernet shield a second to initialize:
	delay(1000);
	Serial.println("connecting...");
 
	// if you get a connection, report back via serial:
	if (client.connect(server, 80))
	{
		Serial.println("connected");
		client.println("GET /search?q=arduino HTTP/1.1");// Make a HTTP request:
		client.println("Host: www.google.com");
		client.println("Connection: close");
		client.println();
	} 
	else
	{
		Serial.println("connection failed"); // if you didn't get a connection to the server:
	} 
//------------- UDP ------------------
	Udp.begin(localPort);

Primo, non postare la stessa domanda anche nel forum in inglese: o lo metti qui o lo metti nella sezione in inglese. Ma tanto te lo farà notare un moderatore.

Secondo, generalmente udp.begin() imposta l'ascolto su una determinata porta UDP quindi non fa nulla di particolare, io l'ho usato varie volte e non ho mai avuto problemi.

Domanda: a tu per caso nella STESSA rete hai un altro device con Arduino? Ed in caso affermativo, (qui hai il classico DEAD BEEF FEED) DEVI cambiare il MAC address di uno dei due perché non possono coesistere, e sospetto che questo possa causare il problema all'inizializzazione dell'ascolto UDP.

>Alex73PN: in conformità al REGOLAMENTO, punto 13, il cross-posting è proibito (anche tra lingue diverse) per cui, il tuo post duplicato nella sezione Inglese del forum è stato cancellato.

Ti prego, per il futuro, di evitare di aprire più post sullo stesso argomento in sezioni differenti del forum. Grazie.

Guglielmo

Salve, chiedo scusa, pensavo fossero due forum diversi.
Per docdoc: in effetti ho anche un mega e uno yun ma tutti e tre hanno mac diversi.
Mi sono accorto che cambiando il mac address funziona, ma ogni volta che faccio una modifica allo sketch si blocca nuovamente allo stesso punto. Se poi cambio ancora il mac allora funziona di nuovo.
Forse è un problema del router?
Grazie.

Mah, strano, non mi è mai capitato (tu in pratica devi cambiare il MAC address ad ogni compilazione intendi??) però forse è possibile che dia fastidio al router/switch (se è quello casalingo fornito dai provider non dovrebbe però avere problemi o blocchi in base al MAC).

Ovviamente il MAC deve essere comunque "valido" ed univoco, ti consiglio di generarne uno con qualche tool ad esempio QUESTO.

Prova prima anche a riavviare il router (se hai uno switch tra Arduino ed il router, riavvia lo switch) per fargli resettare la tabella dei Mac, per sapere cosa significa cerca in rete, ad esempio qui) e facci sapere.