sincronizzare RTC HELP

buon giorno a tutti,

vorrei un aiuto su come sincronizzare l' RTC ds1307 con NTP. Entrambi gli sketches presi dagli esempi funzionano correttamente ma non riesco a capire come estrarre i dati di anno mese, giorno, giorno della settimana , ora, minuti, secondi dallo sketch NTP in modo da poterli usare qua:

// January 21, 2014 at 3am you would call:
rtc.adjust(DateTime(2019, 12, 15, 18, 00, 0));

Grazie anticipatamente per l'aiuto.
Ciao

Posta il link alla libreria che usi. Ci sono molte librerie per gli rtc, con comandi diversi

Ecco qua:

//github.com/arduino-libraries/NTPClient

//github.com/adafruit/RTClib

Grazie molte.
Ciao

Se ho letto bene le due lib, puoi usare “epoch unix time” ovvero i secondi passati dal 1 gen 1970

RTC.adjust( DateTime( NTPClient.getEpochTime() ) );

RTC e NTPClient devono essere i nomi che tu usi nel tuo sketch

P.S. se non ricordo male occhio che il servizio NTP non tiene conto del fuso e dell’ora legale/solare

OK,

per favore potresti indicarmi che cosa intendi per" RTC e NTPClient devono essere i nomi che tu usi nel tuo sketch" : non sono molto abile con il C....
Ok, capito per l'ora legale ed il fuso orario.
Questa sera provo.
Grazie mille per l'interessamento.
Ciao

sono riuscito a provare ora in un ritaglio di tempo...
nel loop ho messo:

 Serial.println(timeClient.getFormattedTime());
 lcd.setCursor(0,0);
 lcd.print(timeClient.getFormattedTime());
 lcd.setCursor(0,2);
/rtc.adjust( DateTime( NTPClient.getEpochTime() ) );
DateTime time = rtc.now();
 //Full Timestamp
Serial.println(String("DateTime::TIMESTAMP_FULL:\t")+time.timestamp(DateTime::TIMESTAMP_FULL));
//Date Only
Serial.println(String("DateTime::TIMESTAMP_DATE:\t")+time.timestamp(DateTime::TIMESTAMP_DATE));
//Full Timestamp
Serial.println(String("DateTime::TIMESTAMP_TIME:\t")+time.timestamp(DateTime::TIMESTAMP_TIME));
Serial.println("\n");
lcd.setCursor(0,1);
lcd.print( String (time.timestamp(DateTime::TIMESTAMP_TIME)));
//Delay 5s
delay(2000);

funziona correttamente in quanto vedo su LCD riga1 :h,m,s del NTP e sulla riga 2 vedo h,m,s dello RTC.

quando compilo però mi da errore >> expected primary-expression before '(' token
in corrispondenza della linea : rtc.adjust( DateTime( NTPClient.getEpochTime() ) );
Non riesco a capire che cosa voglia dire questo errore.

Grazie , ciao

>Elesoft: ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post qui sopra (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More → Modify che si trova in basso a destra del tuo post) e racchiudere il codice all’interno dei tag CODE (… sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

In pratica, tutto il tuo codice dovrà trovarsi racchiuso tra due tag: [code] _il _tuo_ codice_ [/code] così da non venire interpretato e non dare adito alla formazione di caratteri indesiderati o cattiva formattazione del testo. Grazie.

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non avrai sistemato il codice come richiesto, nessuno ti potrà rispondere, quindi ti consiglio di farlo al più presto. :wink:

ok, grazie per la precisazione: penso di aver fatto giusto .
Ciao

Per completezza invio l'uscita sul monitor dell' IDE.

17:06:36
DateTime::TIMESTAMP_FULL:	2019-02-27T11:08:02
DateTime::TIMESTAMP_DATE:	2019-02-27
DateTime::TIMESTAMP_TIME:	11:08:02

Grazie Ciao

Posta il tuo codice, difficile darti indicazioni senza sapere cosa hai scritto.
(racchiuso nei tag code, vedi regolamento che spiega come fare e il post#6 di gpb01)

grazie per l’interessamento,
con questo sketch riesco a visualizzare i dati NTP ed i dati dallo RTC DS1307 ma non riesco a sincronizzare i due tra loro.
Avrò sicuramente fatto degli errori : sono alle prime …
Grazie nuovamente ,
ciao

/*********

*********/

#include <LiquidCrystal_I2C.h> //This library you can add via Include Library > Manage Library > 
#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include "RTClib.h"
#include <NTPClient.h>
#include <WiFiUdp.h>
RTC_DS1307 rtc;

char daysOfTheWeek[7][12] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};

LiquidCrystal_I2C lcd(0x3F, 20, 4);  // adattatore : 3F LCD : 20x4
MDNSResponder mdns;


// Replace with your network credentials
const char* ssid     = "XXXXXX";
const char* password = "YYYYYY";

WiFiUDP ntpUDP;

// You can specify the time server pool and the offset (in seconds, can be
// changed later with setTimeOffset() ). Additionaly you can specify the
// update interval (in milliseconds, can be changed using setUpdateInterval() ).
NTPClient timeClient(ntpUDP, "europe.pool.ntp.org", 3600, 60000);

// Current time
unsigned long currentTime = millis();
// Previous time
unsigned long previousTime = 0; 


unsigned long cTime= millis();      // current time diventa float

int ledPin =D8;    

void setup() {   //......................................................................................


  WiFi.begin(ssid, password);
  Serial.begin(115200);
  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }

 if (! rtc.isrunning()) {
    Serial.println("RTC is NOT running!+\+\+\+\+\+\+\+\+\+\+\+\+\+\+\+\+\+\+\\+");
    // following line sets the RTC to the date & time this sketch was "compiled".....
    //rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    // This line sets the RTC with an explicit date & time, for example to set
    // January 21, 2014 at 3am you would call:
   //rtc.adjust(DateTime(2019, 12, 15, 18, 00, 0));  // this line sets the RTC
 }

  lcd.begin();   // initializing the LCD
  lcd.backlight(); // Enable or Turn On the backlight 
  lcd.setCursor(0, 0);
  lcd.print("rtc+I2C_LCD+NTP"); // Start Print text to Line 1
  lcd.setCursor(0, 1);      
  lcd.print("PROVA 29/05/20"); // Start Print Test to Line 2
  lcd.setCursor(0, 2); 
  lcd.print(" just to test ");
  lcd.setCursor(0, 3); 
  lcd.print(" synch RTC w NTP ");  

  // Connect to Wi-Fi network with SSID and password
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print("*> ");
  }
  Serial.print("connected");
  
 // dati di connessione su LCD I2C
  lcd.clear();
  lcd.print(ssid);
  lcd.setCursor(0,1);
  lcd.print(WiFi.localIP());
  lcd.setCursor(0,2);
  long rssi = WiFi.RSSI();
  lcd.print("RSSI:");
  lcd.print(rssi);
  lcd.print(" dBm");
  lcd.setCursor(0,3);
  lcd.print(WiFi.macAddress());
  
//  dati di connesssione su seriale  IDE Monitor terminal
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
  Serial.println("port= 80");
  Serial.printf("RSSI: %d dBm\n", WiFi.RSSI());
  Serial.print("MAC: ");
  Serial.println(WiFi.macAddress());
  Serial.println("");
  Serial.println("");

  timeClient.begin();
 
  pinMode(ledPin, OUTPUT);   // LED 
 
}

//......................................  loop beginning  .........................................
void loop()
  {
 
 timeClient.update();
 

 Serial.println(timeClient.getFormattedTime());   // source= NTP
 lcd.clear();
 lcd.setCursor(0,2);      // terza riga 
 lcd.print(timeClient.getFormattedTime()); 

// RTC.adjust( DateTime( NTPClient.getEpochTime() ) );  //eeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
// rtc.adjust( DateTime( NTPClient.getEpochTime() ) );  // eeeeeeeeeeeeeeeeeeeeeeeeeeeeee

 DateTime time = rtc.now();   //ds 1307
 
 //Full Timestamp from DS1307
 Serial.println(String("DateTime::TIMESTAMP_FULL:\t")+time.timestamp(DateTime::TIMESTAMP_FULL));

 //Date Only  from DS1307
 Serial.println(String("DateTime::TIMESTAMP_DATE:\t")+time.timestamp(DateTime::TIMESTAMP_DATE));

 //Full Timestamp  from DS 1307
 Serial.println(String("DateTime::TIMESTAMP_TIME:\t")+time.timestamp(DateTime::TIMESTAMP_TIME));
 Serial.println("\n");
 lcd.setCursor(0,0);     //  prima riga
 lcd.print(time.timestamp(DateTime::TIMESTAMP_TIME));     
 //Delay 10s
 delay(10000);

}
//:::::::::::::::.:::::::::::::::: end of loop :::::::::::::::::::::::::::::::::::::::::::::::

Prova a spezzare quella riga:

rtc.adjust( DateTime( NTPClient.getEpochTime() ) );

in

uint32_t epoca=NTPClient.getEpochTime();    // ovvero unsigned long
rtc.adjust( DateTime( epoca ) );

mi da sempre il solito errore :

C:\Users\Ambro_PC\AppData\Local\Temp\arduino_modified_sketch_269638\i2c_LCD_rtc_ntp_1.ino: In function 'void loop()':

i2c_LCD_rtc_ntp_1:128:25: error: expected primary-expression before '.' token

uint32_t epoca=NTPClient.getEpochTime(); // ovvero unsigned long

^

Più di una libreria trovata per "Wire.h"
Usata: C:\Users\Ambro_PC\Documents\Arduino\libraries\Wire
Non usata: C:\Users\Ambro_PC\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.5.2\libraries\Wire
exit status 1
expected primary-expression before '.' token

Questo report potrebbe essere più ricco di informazioni abilitando l'opzione
"Mostra un output dettagliato durante la compilazione"
in "File -> Impostazioni"

Se il codice che usi è quello nella risposta #10, mi sa che devi usare :

uint32_t epoca=timeClient.getEpochTime();

Ciao, Ale.

ok, trovato:

uint32_t epoca=timeClient.getEpochTime();    // ovvero unsigned long
rtc.adjust( DateTime( epoca ) );

perfetto: funziona correttamente.
L'ultimo problema rimasto è quello dell' ora legale : rimane indietro di un' ora !
Devo trovare come impostarla...

Grazie mille per la collaborazione.
ciao!

Elesoft:
… L’ultimo problema rimasto è quello dell’ ora legale : rimane indietro di un’ ora !
Devo trovare come impostarla …

Se ne è parlato molte volte qui nella sezione Italiana, fai un po’ di ricerche e trovi routines già pronte.

Guglielmo

Elesoft:
OK, per favore potresti indicarmi che cosa intendi per" RTC e NTPClient devono essere i nomi che tu usi nel tuo sketch" : non sono molto abile con il C....

E questo che ti spiegavo, devi usare i nomi degli oggetti che tu hai nel tuo sketch.
rtc è lo stesso che usi tu, NTPClient invece tu hai usato il nome timeClient.

OK,
capito, grazie mille.
Una ulteriore domanda: C'è la possibilità di sapere se NTP ha fornito dati validi oppure se non ha risposto... al fine di non aggiornare lo RTC con dati errati ? Come si potrebbe fare ?

Grazie di tutto,
ciao

Scusate: non ho capito ancora una cosa:
il mio loop invia ogni 5 secondi i dati su LCD e su Terminale IDE . Il tempo dello RTC e dello NTP vengono visualizzati con un intervallo di 5 secs ed il dato dello NTP incrementa di 5 secs esattamente ad ogni giro del loop.
Ma allora la seguente riga che cosa definisce ?

NTPClient timeClient(ntpUDP, "europe.pool.ntp.org", 7200, 2400000);

Dovrebbe aggiungere 2 ore allo UTC ( 1 di fuso +1 di ora legale)e questo è corretto, e dovrebbe aggiornare il tempo NTP ogni 4 minuti.
Come mai il time dell NTP viene visualizzato aggiornato ogni 5 secondi ( come il loop) ?
Grazie anticipatamente .
Ciao

Mi pare che la libreria fa la furba, vedendo il codice all'interno.
Lei ogni 4 minuti legge dal server, ma tu puoi chiedere comunque il tempo ogni 5 secondi.
E come fa ? Nei 4 minuti, ti da il tempo che aveva letto l'ultima volta + millis() dall'ultimo aggiornamento