Ciao di nuovo a tutti.
Mi sto cimentando nel classico progettino dell'orologio aggiornato via ntp.
Di materiale in rete ce n'è a iosa e sono riuscito a scrivere uno sketch funzionante.
Ho letto un po' di post e altre pagine in giro sull'argomento, ma una cosa non mi è chiara...
Avendo una wifi sempre accesa poso pensare di usare solo richieste ntp tipo una volta al minuto per aggiornare l'orologio o devo prevedere anche un rtc?
Su molti progetti non ho visto accenni all'rtc, ma su qualcuno parlavano di "ban" da parte del server ntp in caso di troppe richieste...
Quindi, in estrema sintesi, RTC sì o RTC no?
Se utilizzi la libreria NTPClient (... che non è male e che ti consiglio) ci pensa lei ad evitare che fai troppe richieste ... controlla quanto tempo è passato e, se troppo poco, non effettua la lettura.
La installi dal "Library Manager" e ti basta guardare un esempio per vedere come banalmente si usa ![]()
Guglielmo
Una sana via di mezzo. Intanto una verifica di quanto scarto ottieni dopo diciamo un giorno o due, poi si aggiorna di conseguenza.
fratt:
richieste ntp tipo una volta al minuto per aggiornare l'orologio..
Basta anche una volta al giorno volendo. Se proprio vuoi stare sereno fai il sync una volta all'ora.
In un progetto per azionare un orologio a palette, ho inizialmente usato un clone di un Nano generando un brutale clock con il semplice millis(), quindi niente RTC né tantomeno NTP.
Avevo un drift di una decina di secondi al giorno. Se la MCU ha un clock più preciso e più veloce, puoi aspettarti anche meno.
gpb01:
Se utilizzi la libreria NTPClient (... che non è male e che ti consiglio) ci pensa lei ad evitare che fai troppe richieste ... controlla quanto tempo è passato e, se troppo poco, non effettua la lettura.
Dopo varie ricerche avevo trovato questa libreria
che gestisce automaticamente anche i timezone.
Dopo do un'occhiata a quella che hai linkato tu.
speedyant:
Una sana via di mezzo. Intanto una verifica di quanto scarto ottieni dopo diciamo un giorno o due, poi si aggiorna di conseguenza.
Il problema è che mi mancano i pin per inserire anche un rtc...
cotestatnt:
In un progetto per azionare un orologio a palette, ho inizialmente usato un clone di un Nano generando un brutale clock con il semplice millis(), quindi niente RTC né tantomeno NTP.
Sì, in effetti stavo valutando di inserire un "rtc software" per ovviare al problema...
Grazie a tutti per i chiarimenti
Ma io non intendevo con rtc, ma proprio con ntp. Verifico "sperimentalmente" quanto scarta in due giorni e mi regolo di conseguenza.
Di quanta precisione hai bisogno?
Poca... anche se da mattina a sera sbagliasse un paio di minuti non sarebbe un problema.
Allora direi che va bene ogni due giorni.
Cioè dici di fare la richiesta ntp ogni 2 giorni e in mezzo aggiornare l'ora usando millis()?
O mi sono perso qualche funzione che gestisce l'orario?
Potrebbe essere una soluzione.
Con che scheda stai facendo esperimenti?
Esp-01... quella con 8 pin
Ma dillo prima che stai usando un esp8266!
In tal caso non serve nessuna libreria esterna, c'è già tutto il necessario nel core per Arduino compresa la gestione del timezone/ora legale
#include <time.h>
#include <sys/time.h>
// Definizione del timezone e degli intervalli dell'ora legale
#define MYTZ "CET-1CEST,M3.5.0,M10.5.0/3"
// struct dove memorizzare le informazioni realtive al timedate (giorno, ora, minuti, etc etc )
struct tm timeinfo; // è definita in "time.h"
void setup(){
....
// Tutto quel che serve fare è mettere questa riga dopo aver connesso l'ESP
configTime(MYTZ, "time.google.com", "time.windows.com", "pool.ntp.org");
}
////////////////////////////////
// Quando serve l'ora aggiornata:
time_t now = time(nullptr); // Ottengo l'ora aggiornata dal sistema
timeinfo = *localtime(&now); // Aggiorno la struct timeinfo con il tempo localizzato secondo il timezone definito
// Uso la struct ad esempio per printare sulla seriale con l'istruzione strftime,
// ma è possibile prelevare dalla struct quel che serve singolarmente tipo ore, minuti, secondi etc etc
char buffer[40];
buffer[40] = '\0';
strftime (buffer, 40, "%A, %d/%m/%Y %H:%M:%S", &timeinfo);
Serial.println(buffer);
///////////////////////////////
Davero??
Sugli esp non sono molto ferrato...
Cmq ieri sera dopo qualche ricerca avevo trovato un paio di librerie che mi risolvevano diversi problemi.
Adesso provo a guardare il discorso che dici tu
Il problema con gli esp in ambiente Arduino è che ci si dimentica che si tratta essenzialmente di un wrapper arduino-like per usare l'SDK Espressif il quale offre tutta una serie di funzionalità "di base" già integrate e ai più sconosciute .
Di conseguenza si cercano (a mio avviso inutilmente) soluzioni alternative senza che ce ne sia realmente bisogno e i tutorial copiaincolla tutti uguali che si trovano online non aiutano... Anzi!
Sì sì, ammetto che conosco qualcosa (poco) solo di arduino. Tutto ciò che c'è un po' più in là non l'ho mai affrontato.
Grazie per la dritta
cotestatnt:
Ma dillo prima che stai usando un esp8266! ....
Sto provando il tuo codice e ovviamente funziona.
Vedo solo che ogni tanto è come se la time_t now = time(nullptr); fallisse e a monitor vedo data / ora che non centrano nulla (tipo 01/01/1970).
C'è un modo per verificare se la richiesta è andata a buon fine?
>fratt: Quando si quota un post, NON è necessario riportarlo (inutilmente) tutto; bastano poche righe per far capire di cosa si parla ed a cosa ci si riferisce, inoltre, se si risponde al post immediatamente precedente, normalmente NON è necessario alcun "quote" dato che è sottinteso. ![]()
Gli utenti da device "mobile" (piccoli schermi) ringrazieranno per la cortesia ![]()
Guglielmo
P.S.: Ho troncato io il "quote" del tuo post qui sopra ![]()
fratt:
Vedo solo che ogni tanto è come se la time_t now = time(nullptr); fallisse e a monitor vedo data / ora che non centrano nulla (tipo 01/01/1970).
Ogni tanto, intendi tipo al riavvio? In tal caso succede perché il configTime() va chiamato quando l'esp è correttamente connesso alla rete (che purtroppo non equivale esattamente a quando WiFi.status() == WL_CONNECTED come c'è sempre negli esempi).
Ci sono diverse opzioni:
- la più "rozza" è aggiungere un delay sufficiente prima di configTime();
- la seconda è testare in un while nel setup() il valore now ad esempio cosi:
time_t now = time(nullptr);
while (now < 3600 ) {
now = time(nullptr);
delay(100);
}
- la terza (più elegante) è usare gli WiFiEventHandler ed inserire l'istruzione nell'evento associato WIFI_EVENT_STAMODE_GOT_IP
Se vuoi ti abbozzo un esempio perché non è molto documentato purtroppo.
Sì, in effetti succede al riavvio.
Avevo ipotizzato si trattasse di un problema di connessione e avevo provato con la soluzione da contadino... un delay() di 10 secondi...
Però una volta è successo anche dopo il delay e la cosa mi è parsa strana.
Tranqui, mi hai già dato diverse info, adesso indago io.
Grazie
This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.