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 è
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 ....
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.
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 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
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è
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
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!