Go Down

Topic: Cambiare frequenza di ping durante lo sketch (Read 8072 times) previous topic - next topic


Federico0

Io avrei una altra domanda, non per risolvere un problema ma per capire cosa è consigliato - meglio fare!
Insomma, rileggndo il codice c'è questa parte che mi sembra un po' "doppia"

Code: [Select]

if(Ethernet.begin(mac) == 0) //Se il DHCP fallisce,
  {
    Ethernet.begin(mac,ip); //Faccio "a mano"
  }


Per prma cosa, è giusto il commento ?

Ma se io sono sicuro del mio mac e del mio IP sulla rete non posso togliere l'if e lasciare semplicemente "Ethernet.begin(mac,ip)" ?

lestofante

tutto quello che dici è corretto.
Spesso alcune macchine hanno gli ip riservati, sopratutto se sono server. Ma non è una funzionalità che i router di bassa fascia (aka: quelli che ti danno le compagnie telefoniche) possiedono.. o almeno io non l'ho mai visto sui vari router che ho visto in giro
Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

Federico0

#18
Apr 16, 2013, 03:40 pm Last Edit: Apr 16, 2013, 03:43 pm by Federico0 Reason: 1
Capito, allora posso provare a togliere un IF che teoricamente non dovrebbe fare "male" e vedere un po' come va!
Grazie Lesto!

Cavoli, dall'81% mi passa a 58%   :smiley-red:

lestofante

cosa vuol dire che dall'81% passi al 51%?
Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

leo72


cosa vuol dire che dall'81% passi al 51%?

Le probabilità di ricevere risposta da noi  :smiley-yell:

Federico0

Tutto esatto!
A dire il vero volevo capire cosa sarebbe quella %.. l'ide di arduino me lo dice ogni sketch carico, intuisco sia la % che occupa in memoria ma per un if mi toglie un 30 % ?

edit: Forse sono troppo in OT però

Una domanda poi prometto di smettere asd forse..

UDP, udp.. user datagram protocol.. unica cosa di cui sono certo riguardo UDP.

Io posso inviare un valore ad un server di cui so ip address e porta ?

Guardavo l'esempio ethernetUDPBegin (lo riporto per comodità)

Code: [Select]

#include <SPI.h>        
#include <Ethernet.h>
#include <EthernetUdp.h>

byte mac[] = {  

 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // MAC arduino

IPAddress ip(192, 168, 1, 177); //IP arduino sulla rete

unsigned int localPort = 8888;      // che porta sarebbe ? quella che so del mio server ? e dove andrebbe l'ip del server ?

EthernetUDP Udp;

void setup() {

 Ethernet.begin(mac,ip);

 Udp.begin(localPort); //tipo qui si potrebbe fare un numero tipo Udp.begin(ipserver,localport) ?

}


Prometto che in ogni caso domani mattina ci provo, al limite non va ma nel caso - probabile - mi piacerebbe capirci un po' di più!

Grazie ancora comunque per gli aiuti preziossimi!

lestofante

ahhhh
quella percentuale è quanto spazio occupa lo sketch in memoria FLASH (non ram, che però a quanto pare verrà aggiunta pure quella nelle prossime versioni)
e la memoria usata cala così tanto non per il semplice IF, ma perchè in quell'if è nascosto il protocollo DHCP, che non è certo pensato per essere leggerissimo.

UDP vs TCP: usa il TCP.

l'UDP non stabilisce una connessione, ciò vuol dire che chi vuole ricevere deve avere la porta in entrata aperta (al contrario, nel TCP solo il server ha la porta in entrata aperta, nonostante la comunicazione sia bidirezionale), non viene effettuato il check della validità del messaggio (se hai perso pezzi per strada dei controllarlo te), non c'è ordinamento dei pacchetti (se il datagramma 2 arriva prima dell'1 devi essere te ad accorgertene ed a riordinare), e non c'è nemmeno il check che il messaggio arrivi a destinazione.

Immagina il TCP come una telefonata: sai se è andata a buon fine, se quello dall'altra parte "ha messo giù", in automatico se un messaggio è corrotto viene ritrasmesso, e le parlo arrivano nello stesso ordine con cui sono state pronunciate.
Immagina l'UDP come una bottiglia lanciata nel mare; auguri.

Vantaggi dell'UDP: meno overhead da parte degli header, poichè non deve aspettare i "pezzi" successivi per darti la comunicazione ordinata e tutti i vari check con la ritrasmissione automatica dei dati mancanti, i dati sono SUBITO disponibili alla tua applicazione.

Ad esempio, se fai streaming video live l'UDP è migliore perchè se un utente perde un pezzo chissene, l'importante è che veda quello che sta succedendo ora.

Poi in realtà per via del casino delle porte e la mancanza di UPNP della maggior parte dei router ha fatto preferire comuinque il TCP (sai che successo youtube, se per vedere i video avresti prima dovuto aprire la porta UDP X a mano, se il tuo modem non supporta l'UPNP, in oltre devi avere l'IP pubblico...)
Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

Federico0

#23
Apr 17, 2013, 05:33 pm Last Edit: Apr 17, 2013, 05:37 pm by Federico0 Reason: 1
Ciao Lesto, grazie mille per la completa spiegazione!

Alla fine ho optato per una soluzione sicuramente meno elegante ma funzionale - per ora.

Siccome il mio router supporta il ddns ho buttato arduino su un dyndns così ora lo posso vedere da fuori della LAN.

Sul mio arduino ora c'è lo sketch che pinga un server e decide se resettare il router o meno, ho implementato la lettura del voltaggio e una pagina html su SD.

A tale pagina arduino manda appunto il valore letto sul pin analogico, ogni 30s refresha la pagina in modo tale da avere sempre un valore aggiornato.
30s è giusto per
Mi piace però il fatto che si refresha la pagina in automatico, ho trovato un tag e magari ve lo posto qua se può tornare utile:

Code: [Select]
<meta http-equiv="refresh" content="30">

Tendenzialmente, funziona anche, però non mi piace tanto il fatto che per passare il valore alla pagina faccia un brutale
Code: [Select]
   
client.print("Voltaggio batteria: ");
client.println(vfinale);

Non mi piace, potrebbe esserci una soluzione migliore ( ? ) ad esempio sfruttando PHP ?

lestofante

non PHP, ma JavaScript.
apri un socket TCP su una porta, che ti invia il nuovo valore. poi, sempre col JS lo inietti nell'HTML della pagina al posto del valore vecchio. Infine metti il js in delay e ricomici da capo.
Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

Federico0

Ok, non sono pratico purtroppo in JS ( nemmeno in PHP a dire il vero ) ma posso provarci!
Intanto mi hai dato ottimi spunti, grazie ancora..

lestofante

Code: [Select]

socket= new WebSocket('ws://www.example.com:2000'); //porta 2000

socket.onopen= function() { //appena la connessione è ok
    socket.send('hello');
};

socket.onmessage= function(s) { //quando arriva un dato
    alert('got reply '+s);
};
Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

Federico0

#27
Apr 19, 2013, 12:01 pm Last Edit: Apr 19, 2013, 12:56 pm by Federico0 Reason: 1
Il punto è che ho la pagina html su SD ed è una pagina piuttosto banale e lo sarà anche a progetto finito, cercando su internet come passare valori ad una pagina HTML o alla SD dove è la pagina html ho trovato anche gente che fa con dei gran client.println ricreandosi l'html
Inizialmente io in effetti avevo fatto così ma quando accedevo alla pagina mi trovavo un sacco di caratteri speciali casuali, le cose ripetute più e più volte e ho pensato fosse perchè è generata nel loop e boh, diciamo che magari becchi il momento sbagliato e questo è stato avvalorato dal fatto che quando facevo caricare la pagina dalla SD non ho più avuto di questi problemi tuttavia, tornando a quento detto, molta gente lo fa e non parla di tali problemi!

Purtropo faccio fatica a trovare esempi di quello di cui avrei bisogno io

leo72

Il loop è un ciclo (come dice appunto la parola) ripetuto all'infinito. Devi tenerne conto nella creazione della pagina perché immagino che prima dovrai cancellare il vecchio file HTML, poi ricrearlo solo su richiesta.

Federico0

Ho editato lo sketch, ho tolto la home su SD e faccio caricare la pagina HTML da arduinod iciamo (client.print) non so se è bella soluzione ma funziona.. per cose banali almeno, non ho provato a implementare immagini o quanto altro perchè non mi servono.. forse aggiungerò un pulsante

Go Up