Salve, ancora qui a capire qualcosa.
Ho un sketch, dove uso in contemporanea le librerie
ICMPPing e TimeLib.h
Non includendo la libreria ICMPPing (mi serve per sapere se un determinato ip e collegato al WIFI di casa) funziona tutto perfettamente. Quando includo la libreria ICMPPing , la libreria TimeLib (serve per aggiornare l'orario in EthernetUdp), va tutto in blocco. addirittura si perma il LOOP.
Come posso ovviare a questo problema?
Grazie in anticipo.
Secondo me si può risolvere, ma bisogna capire meglio l'ambiente nel quale operi.
Quali librerie esatte usi attualmente (versione, e/o scaricata da dove)? non parlo poi solo di quelle due, ma ad esempio della Ethernet visto che entrambe se non erro hanno dentro delle "#include Ethernet.h", e potrebbero andare in conflitto su qualcosa (non credo nulla di hardware comunque).
Postaci almeno un estratto del tuo sketch (tutte le righe iniziali con #define#include eccetera, e inizializzazioni, il resto del codice se vuoi tenerlo riservato omettilo) e le esatte versioni delle librerie coinvolte, e vediamo.
Se non vado errato, TimeLib.h è un pezzo della libreria Time di Paul Stoffregen che trovi QUI ...
... hai installato TUTTA la libreria Time ?
Se si puoi verificare i vari esempi, magari trovi qualche cosa che ti aiuta oppure ... armarti di santa pazienza e verificare nei vari moduli, che detta libreria usa, se c'è qualche cosa che va in conflitto con la ICMPPing :
bitmanrc:
libreria <ICMPPing.h> /* created 30 Sep 2010 by Blake Foster */
libreria <TimeLib.h> sconosciuta la data
Per la prima ok, non mi sembra ci possano essere problemi (comunque la ICMPPing.h già include alcune librerie ossia SPI.h Ethernet.h e utility/w5100.h).
Per la TimeLib.h invece ho qualche perplessità: possibile che questa non abbia alcun indicatore di versione, autore o date, né tramite la gestione librerie dell'IDE, né nel file alcun commento?
Per dire, vedi QUI è la TimeLib di tal Stoffregen, o QUESTA di derickr. Se fosse una di queste ti basterebbe leggere il file .h.
bitmanrc:
la libreria TimeLib è la versione ?!?!?!
Se apri il file "library.properties" (che per le librerie specifica le relative "proprietà" inclusa la versione) leggi questo:
name=Time
version=1.5
author=Michael Margolis
maintainer=Paul Stoffregen
sentence=Timekeeping functionality for Arduino
paragraph=Date and Time functions, with provisions to synchronize to external time sources like GPS and NTP (Internet). This library is often used together with TimeAlarms and DS1307RTC.
category=Timing
url=Arduino Playground - HomePage
architectures=*
Quindi si, è la versione 1.5 di Stoffregen.
Comunque in generale, se dall'IDE apri Sketch, Include, e selezioni "Gestione librerie" puoi vedere tutte le librerie installate(con un box anche per cercare per note) e quindi accedere a tutte le relative informazioni.
Per tornare al tuo problema quindi, per prima cosa chiarisci meglio cosa intendi con "si blocca al loop".
Identifica dove esattamente si blocca, ossia dividi in singole istruzioni quelle linee dove hai messo più istruzioni ed inserisci qualche Serial.print() per capire dove si ferma, ad esempio non:
Serial.println("Pingo il primo telefono");
ICMPEchoReply echoReply = ping(PrimoTelefono, 1);
if (echoReply.status == SUCCESS) {
Persona2=1;
Serial.println("Spengo antifurto");
SpegniAntifurto();
Serial.println("Proseguo");
TempoLetturaPresenza=0L;
}
Serial.println("Fine if primo telefono");
e così via.
Dove si ferma? Ovviamente posta sia il nuovo codice sia l'output della finestra seriale...
name=Time
version=1.5
author=Michael Margolis
maintainer=Paul Stoffregen
sentence=Timekeeping functionality for Arduino
paragraph=Date and Time functions, with provisions to synchronize to external time sources like GPS and NTP (Internet). This library is often used together with TimeAlarms and DS1307RTC.
category=Timing
url=Arduino Playground - HomePage
architectures=*
la riga dove non va più gia al primo utlizzo e questa setSyncProvider(getNtpTime); //// si blocca a questo comando/riga, quindi NON fa la richiesta
comunque se lo carichi su arduino e lo vorresti provare, vedi tu stesso.
Quindi Fa il ping ma non fa l'aggiornamento data.
bitmanrc:
la riga dove non va più gia al primo utlizzo e questa setSyncProvider(getNtpTime); //// si blocca a questo comando/riga, quindi NON fa la richiesta
Beh, prima considerazione. Non ho sottomano una Ethernet quindi non posso provare, però mi (ti) chiedo una cosa: la setSyncProvider() serve per specificare la funzione per callback E sincronizzare l'ora, ma perché tu la metti nel loop()? Non so se richiamarla più volte possa dare problemi, ma io quella la metterei nel setup() (come tra l'altro puoi vedere negli esempi allegati alla libreria!), e poi nel loop ti basta chiamare la now().
Poi un'altra cosa per me "strana" è negli include del tuo sketch.
Perché fai anche
#include "utility/w5100.h"
?
Primo, già lo fa la ICMPPing (vedi il .h) quindi non ne hai bisogno, ma secondo, perché con le doppie vigolette (invece di #include <utility/w5100.h>)? Hai una w5100.h "tua" nella cartella dello sketch? Perché?
Insomma, prendi gli esempi sia della ICMPPing sia della TimeLib, se vedi quali #include mettono fai la stessa cosa. In pratica togli la "utility" che non ci va, e lascia solo questi:
W5100 mi sono sbagliato. Era per un altra libreria... Proverò con now()...... Siccome perde qualche secondo.... Allora volevo l ora corretta ogni 20 minuti sul mio programma completo. Ho postato solo una parte del totale programmmmmmma.
NON va, da me NON va nulla. Rifarò tutto il software rendendolo più "ordinato" sia nella logica che nelle variabili.
Per adesso rinvio il mio commento alla fine di GIUGNO. poi vediamo.
A presto su questo argomento.