Ethernet shield + Dyndns, non sempre funzionante

Salve, quel progetto che stavo realizzando teoricamente funziona. Ha solo un grosso problema. Il bello del sistema che ho realizzato è che da casa puoi collegarti ad arduino tramite dyndns e vedere in tempo reale alcuni parametri rilevati da arduino. Il brutto è che non va, cioè non sempre va e io non reisco a capire che cosa ci sia di sbagliato.

Ho un profilo su dyndns.org attualmente in funzione Ho sul router la possibilità di gestire alcuni servizi DNS e quindi ho inserito servizio, account e indirizzo, ho aperto la porta 4040 su IP 192.168.0.1 che è IP di arduino sulla rete e digitanto miodns.dyndns.org:4040 a volte va e a volte non va. Nel codice c'è EthernetServer porta(4040); ma a sto punto mi chiedo se ha attinenza, sinceramente la parte di connessione è un po' causale.. senza troppi controlli, ed è

static uint8_t mac[] = { 0x90, 0xA2, 0xDA, 0x0D, 0x1D, 0x97 };
static uint8_t ip[] = { 192, 168, 0, 101 };
EthernetServer door(4040);
//Dentro il void setup() invece:
Ethernet.begin(mac,ip);
door.begin();

Ma non c'è mai stabilità, non capisco se sia un problema del DNS, del router, del codice..

Che cosa mi consigliereste di controllare ?

Il brutto è che non va, cioè non sempre va e io non reisco a capire che cosa ci sia di sbagliato

non ti funziona in particolari situazioni o in modalità random?

Potresti postare l'intero sketch che hai usato? La fonte dalla quale hai preso ispirazione :) ?

Bisogna tener conto che l'ip va spedito al servizio dyndns solo quando cambia e non 50 volte al minuto altrimenti ti giochi l'account e i tuoi ip. Se hai fatto quello free http://dyndns.it/solutions/ hai solo 5 aggiornamenti al giorno in seguito a cambi ip Quel codice che hai postato non evidenzia i problemi da te descritti, vorrei vedere come fai la richiesta all' HOST: www.dyndns.com, come hai impostato alcuni pin nel setup, i vari delay di attesa risposta ....

ciao

Ogni quanto trasmetti a DynDns il tuo IP? Non è che cambia e non aggiorni il loro database?

Ti conviene inoltre specificare tutti i parametri di rete Invece di Ethernet.begin(mac,ip); usa

Ethernet.begin(mac,ip, Dns, gateway, subnet);

se il dns è uguale al gateway, sulle reti casalinghe è cosi nel 98% dei casi. usa

Ethernet.begin(mac,ip, gateway, gateway, subnet);

Da quello che hai scritto ho capito che il router ha indirizzo 192.168.0.1 mentre lo shield 192.168.0.101.

Quando dici che hai aperto una porta intendi forse il port forwarding? Cioè ciò che entra in porta 4040 del router viene instradato sulla porta 4040 dello shield?

Credo che l'unico modo per capire se non sia un problema tra il PC esterno e il tuo router sia di abilitare un altro server, che so un web server su un pc, e di scrivere l'apposita regola sul router del tipo ciò che mi entra su porta 8080 me la instradi sul pc sulla porta 80 (non è necessario usare le stesse porte su router e PC). Quindi ti colleghi da fuori e, se trovi difficoltà con lo shield, provi se invece l'altro server rimane raggiungibile. Controlla anche che non ci siano conflitti fra regole sul router.

Inutile giocare alle scommesse... finchè non posta uno sketch qualsiasi cosa diciamo è scritta in modo random.

saluti

Scusate, ero fuori casa per cui non ho potuto rispondere prima di ora…
Vi ringrazio per le risposte, ora vi risponderò per gradi.

Ho un account a pagamento su Dyndns, non vorrei che comunque in fase di debug a forza di spegnere e accendere il router (essendo di quelli con scheda 3G prende ogni volta IP) abbia superato una qualche soglia di refresh ?
Tuttavia, avviene in situazioni piuttosto random… magari mentre sta andando e aggiorno la pagina smette di andare, a volte se scrivo IP:PORTA riesco a raggiungere la pagina,altre no.

Proverò ad aggiungere:

Ethernet.begin(mac,ip, gateway, gateway, subnet);

Comunque il codice non è poi tanto elaborato… purtroppo devo ancora farne di strada :slight_smile: comunque è questo qui:

//Librerie
#include <SPI.h>
#include <Ethernet.h>
#include <ICMPPing.h>

static uint8_t mac[] = { 0x90, 0xA2, 0xDA, 0x0D, 0x1D, 0x97 };
static uint8_t ip[] = { 192, 168, 0, 101 };
static uint8_t pingAddr[] = {Indirizzo del server da pingare};

EthernetServer door(8080);
//Direttive della libreria ICMPPing
SOCKET pingSocket = 0;
char buffer [256];

//Variabili
static int errori ;    //Contatore di ping falliti 
static int pm ;        //Contatore ping effettuati
static int lpm;        //Contatore in cui salvo il n. di ping effettuati..
static int res;        //Contatore di reset effettuati
byte vin = 7;          //Pin di alimentazione router
unsigned long time;               //Varabile che contiene i millis
unsigned long tempoIniziale = 0;  //variabile "di passaggio" per contare l'intervallo
long intervallo;

void setup()
{
  
  digitalWrite(vin,LOW); //low perchè ho messo il relè alla rovescia
  Ethernet.begin(mac,ip);
  door.begin();
//2 secondi prima di rientrare
  delay(2000);

}

void loop()
{
  unsigned long tempoAttuale = millis();

  if (tempoAttuale - tempoIniziale > intervallo) 
  {
    tempoIniziale = tempoAttuale;

    bool pingReturn; //Qua ci va il risultato del ping (Vero o Falso)

    ICMPPing ping(pingSocket);

    pingReturn = ping(4, pingAddr, buffer); //Mando il ping

    if (pingReturn) { //ping VERO, allora..
      intervallo = 120000; // Pingo ogni 2 minuti (120000 ms)
      pm++; //Aumento il contatore dei ping ricevuti correttamente
      errori=0;  //tenendo a zero quello degli erori
    }

    else {      //altrimente - se pingo FALSO - aumento la velocità
      intervallo = 5000; //
      errori++; //aumento un counter di errori
      if(errori==4) //al 4 errore:
      {
        digitalWrite(vin,HIGH); //stacco l'alimentazione al router per 5secondi
        delay(5000);
        digitalWrite(vin,LOW); // rialimento il router
        res++; //Aumento il numero di reset
        lpm=pm;    
        pm=0;      //Rinizio a contare
        delay(120000); //aspetto 2 minuti e questo perchè se aspetto meno ho visto che ci sono problemi
      }
    }
  }

    //Parte Ethernet + creazione pagina html
  EthernetClient client = door.available();  // Provo a raggiungere il client

  if (client) {

    while (client.connected()){

      if (client.available()) {

        char c = client.read();

        Serial.print(c);

        if (c == '\n') {
          //Creazione pagina internet//
          client.println(F("HTTP/1.1 200 OK"));

          client.println(F("Content-Type: text/html"));

          client.println();
         
//Pagina HTML che non fa niente se non client.print le varie variabili
      
          delay(1);
          client.flush();
          client.stop();
        }
      }
    }
  }
}

Il punto è che per le mie conoscenze il codice è il massimo che saprei fare

infatti come sospettavo nel reply 2 non hai impostato nel setup i pin 4 e 10 in output/high.

ciao

Ciao pablos e grazie per la risposta ma purtroppo per me non è chiara, potresti spiegarmela meglio ? Intendi dire che oltre riavviare il router tramite relè, devo anche riavviare ethernet shield ? il pin 10 vedo che è relativo a Ethernet shield. Ma riavviando ethernet shield, la parte superiore ( Ethernet.begin(mac,ip); door.begin(); ) in quel punto del programma, che fine fa ?

non modifichi niente per ora, aggiungi solo nel tuo setup le istruzioni necessarie per settare i pin che usi, nemmeno il tuo vin avevi impostato, quando utilizzi un pin qualsiasi devi dire se è un input o un output, il 4 (per SD) e il 10 (per la ethernet) vengono impegnati dallo shield e vanno comunque impostati.

che diventerà così

void setup()
{
  pinMode(4, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(vin, OUTPUT);
  digitalWrite(4,1);
  digitalWrite(10,1);
  digitalWrite(vin,LOW); //low perchè ho messo il relè alla rovescia
  Ethernet.begin(mac,ip);
  door.begin();
//2 secondi prima di rientrare
  delay(2000);

}

Intendi dire che oltre riavviare il router tramite relè

Perchè riavvii il router con relè?

Scusa la risposta in velocità.

Sto provando le varie cose che mi avete consigliato, ho aggiunto ethernet.begin(ip,mac,gateway,gateway,subnet); e il pinning.. ora proviamo.

Per quanto riguarda il relè, posso darti maggiori informazioni ma in linea di massima è perchè ho necessità di riavviare fisicamente il router

Sono quasi sicuro che il tuo mal funzionamento random è causato dal pin 4 non impostato, sostituisci il setup() provalo e fammi sapere altrimenti se pensi di usare il pin 4 e non sfruttare la SD devi piegare leggermente il piedino verso l'esterno e reinserire lo shield lasciando libero il 4 su arduino ciao

Ho appena finito di aggiungere i vari consigli che mi avete dato, adesso lo lascio attivo per un po' e ti so dire! Ma che cosa sarebbe questo pin 4 ? Pensavo fosse relativo alla SDcard

Si il pin 4 è l’enable della SD, se non lo imposti viene abilitata in modo random causando problemi

Ah, ottimo consiglio.. Grazie!

Ora comunque sto provando, se mi imbatto in comportamenti strani o anomali magari riporto qua :)

Ora comunque sto provando, se mi imbatto in comportamenti strani o anomali magari riporto qua

Quindi se va tutto bene non lo sapremo mai :stuck_out_tongue_closed_eyes:

haha no no, scusami non volevo intendere quello!

Cmq lo ho lasciato andare tutta la notte e sembra tutto OK!

Funziona solamente con la USB scollegata ma non è un problema in quanto è alimentato 12v ma chiedo solo se è normale per via di quei pin!

Federico0: Funziona solamente con la USB scollegata ma non è un problema in quanto è alimentato 12v ma chiedo solo se è normale per via di quei pin!

no, non centrano nulla quei pin, la usb impegna i pin 0-1.

Ho un altro dilemma :)

Ho acquistato Arduino Ethernet rev3 perchè con una sola scheda faccio tutto - minori spazi e minori consumi - mi chiedevo se tutte questa considerazioni riguardo i pin 4 e 10 valgono anche in questo caso e se c'è un modo efficace per provarlo!