Ancora NTP!

Dico ancora perchè vedo che il forum è pieno di richieste cone la mia, ma nessuna delle precedenti funziona con me!!

Mi spiego meglio: ho già il mio software con data e ora che funziona con un RTC, ma ho visto che l’orologio mi sballa di circa 1 minuto avanti al giorno. La mia scatoletta con Arduino, già collegata in rete con ethernet shield e un router client della TP-link, andrà posizionata in un posto inaccessibile, dunque vorrei che ogni tanto (ogni 24 ore) si sincronizzasse con un server NTP.

Ho trovato tanti sketch e ho provato a farli funzionare un po’ tutti, ma ho un grande problema: nessuno mi viene compilato per errori vari.
So che l’errore è nel caricare le librerie giuste, ma ancora ho difficoltà a trovare le librerie che vengono citate (udp.h, ethercard.h etc.)
C’è qualcuno che mi dà una mano, che mi linka uno sketch con una funzione e con le relative librerie da scaricare?

Infine: se ho la IDE aperta e copio le librerie, mi vneogno caricate o devo per forza chiudere la IDE per farmele riconoscere?

Grazie!
Max

vedo che il forum è pieno di richieste cone la mia, ma nessuna delle precedenti funziona con me!!

Le ide cambiano di continuo ciò che andava ieri oggi è molto probabile che non vada.

Che ide usi?

se ho la IDE aperta e copio le librerie, mi vneogno caricate o devo per forza chiudere la IDE per farmele riconoscere?

ovvio, se aggiungi una lib ... devi riavviare l'ide, ma non è una novità, è sempre stato così.

Ho appena reinstallato la IDE 1.5.7
La mia cartella di libraries però ha un pok' di robaccia...

Uno degli sketch che volevo provare è questo(che mi pare recente):

ma non trovo la EtherCard.h

che scheda ethernet hai ?

Vorrei usare la ethernet shield ENC28J60 (con la libreria EtherCard)...ma non trovo la EtherCard.h

quell' utente usa una ENC28J60 che non è quella ufficiale

Comunque per dialogare col server NTP non ti serve una lib, al massimo una RTC per usare l'orologio e aggiornarlo che credo già tu abbia.

PS: Ti faccio presente che aspetto una risposta a questo treadh :slight_smile: http://forum.arduino.cc/index.php?topic=250235.15

Grande Pablos, che mi fai da angelo custode :slight_smile: :slight_smile: :slight_smile: Quello è l'altro argomento ancora aperto, e ti rispondo da lì!
Hai un esempio per il NTP, funzionante con la IDE 1.5.7? Ancora meglio se fosse già una funzione richiamabile....
Max

L'IDE 1.5.7 soffre del passaggio alla nuova toolchain un po' come il passaggio dalla 0023 alla 1.0.5.
Molte librerie sono da riscrivere o modificare per renderle compatibili con nuovo compilatore avr-gcc.
Se hai problemi di compilazione usa la 1.0.5-r2 o la 1.5.6-r2. E' un po' presto per la 1.5.7, a meno che non sappia dove mettere le mani.

Comunque non hai detto che shield Ethernet hai. Da quello dipende quale lib Ethernet installare.

Ok … leggendo l’atro tuo treadh si capisce che hai uno shield con wiznet, quindi lascia stare quel link di prima.
L’aggiornamento all’NTP funziona anche su 1.5.7 come prima, alla fine NTP_PACKET è sempre lo stesso l’unica cosa che cambia è:

non è più necessario ~~#include <EthernetUdp.h> ~~ è incorporata e richiamata dalla Ethernet.h/cpp
è sufficiente Udp.begin(port); la porta remota del server è sempre la 123

Sei già allo stretto, questo comporta altri buffers e altra ram … sicuro di volerlo fare?

Gli esempi inclusi nell'IDE con le librerie ufficiali ovviamente compilano e funzionano anche con la 1.5.7.
Il problema a cui alludevo è con le librerie di terze parti che si appoggiano su comandi o funzioni deprecate nel nuovo compilatore.

posso illuminarti poco

  1. perchè il SAM (arduino DUE) ha già un orologio interno
    2)non uso librerie per RTC esteni e non le conosco

comunque in linea di principio questo è quanto dovrai adattare, guarda la libreria che usi, cerca i get…() e cambiali se necessario, prendi un modello in rete del tuo RTCXXXX" e adattalo in base a queste info … questo metodo lo sto attualmente usando e funziona bene a parte il giorno della settimana che LEO non ha completato e quella funzione non è richiamabile :slight_smile: appena ho un po’ di tempo mi ci metto

#include <SPI.h>
#include <Ethernet.h>
#include <RTC**********.h>

// ------------------
// ethernet dati
//------------------

IPAddress ip_ntp_1(x,x,x,x); 
EthernetUDP Udp;

byte ore = 0 ;
byte minuti = 0 ;
byte secondi = 0;
byte giorno = 1;
byte mese = 1;
int anno = 2014;
byte gg_sett; // non funziona 

void setup() {
 delay(1000);
 Serial.begin(9600);
// ------------------
// ethernet setup
//------------------

 aggiorna_NTP() ;
}

void loop() {
  // put your main code here, to run repeatedly:

// ------------------
// stampa ore minuti sec ......
delay(1000);
//------------------

}

void time() 
{
 ore = (rtc.getHours());
 minuti = (rtc.getMinutes());
 secondi = (rtc.getSeconds());
 gg_sett = (rtc.weekDay()); // non funziona
 giorno = (rtc.getDay());
 mese = (rtc.getMonth());
 anno = (rtc.getYear());
}

void aggiorna_NTP() 
{  
  Udp.begin(8888); 
  int NTP_PACKET_SIZE= 48; // NTP time stamp is in the first 48 bytes of the message
  byte packetBuffer[ NTP_PACKET_SIZE]; //buffer to hold incoming and outgoing packets  
     
  memset(packetBuffer, 0, NTP_PACKET_SIZE); 
  packetBuffer[0] = 0b11100011;   // LI, Version, Mode
  packetBuffer[1] = 0;     // Stratum, or type of clock
  packetBuffer[2] = 6;     // Polling Interval
  packetBuffer[3] = 0xEC;  // Peer Clock Precision
  packetBuffer[12]  = 49; 
  packetBuffer[13]  = 0x4E;
  packetBuffer[14]  = 49;
  packetBuffer[15]  = 52;
  
  Udp.beginPacket(ip_ntp_1, 123); //NTP requests are to port 123
  Udp.write(packetBuffer,NTP_PACKET_SIZE);
  delay(1);
  Udp.endPacket(); 
   
  delay(500);   //se fallisce provare con 1000 - 2000 
  if ( Udp.parsePacket()) {  
    Udp.read(packetBuffer, NTP_PACKET_SIZE);      // New from IDE 1.0,
    unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
    unsigned long lowWord =  word(packetBuffer[42], packetBuffer[43]); 
    unsigned long secsSince1900 = highWord << 16 | lowWord;  
    const unsigned long seventyYears = 2208988800UL;   
    unsigned long epoch = secsSince1900 - seventyYears; 
       
    rtc.setClockWithTimestamp(epoch, 1970); // epoch+3600 aggiungo 1 ora 
    
    err_ntp=0;
    Serial.print("Aggiornamento a server NTP riuscito ");//debug
   }
  else{
   
    Serial.println("Aggiornamento a server NTP fallito"); //debug  
  }    
    time();    
    //-------------------debug-----------------------
    tempo_out = (String)gg_sett + "  "+(String)giorno + "/" + (String)mese + "/" + (String)anno + " " + (String)ore + ":" + (String)minuti + ":" + (String)secondi;  
    Serial.println(tempo_out); //debug  
    //-----------------------------------------------
}

pablos:
posso illuminarti poco

  1. perchè il SAM (arduino DUE) ha già un orologio interno
    2)non uso librerie per RTC esteni e non le conosco

comunque in linea di principio questo è quanto dovrai adattare, guarda la libreria che usi, cerca i get....() e cambiali se necessario, prendi un modello in rete del tuo RTCXXXX" e adattalo in base a queste info ... questo metodo lo sto attualmente usando e funziona bene a parte il giorno della settimana che LEO non ha completato e quella funzione non è richiamabile :slight_smile: appena ho un po' di tempo mi ci metto

Non mi pare che menzioni la DUE, comunque è vero: il SAM ha un RTC interno, ma il suo problema è che se salta l'alimentazione della scheda, salta anche l'RTC interno. Quindi serve una batteria tampone per l'intera scheda Arduino.

Non so a quale mia lib ti riferisci, ma sia la swRTC che la Rtc.h contenuta nella advancedFunctions per la Due hanno già la funzione che calcola il giorno della settimana.

Questo è quello che maxpcc mi ha chiesto.

maxpcc:
Ora Pablos saresti veramente tanto gentile se mi illumini anche sul NTP, sull'altro thread (magari un link ad uno sketch che funziona con le librerie della IDE 1.5.7)!

Intanto grazie!

il suo problema è

maxpcc:
-l'orologio che mi sgarra di un minuto scarso al giorno, da sincronizzare con NTP
Allego qualche link con alcune soluzioni, che però con me ancora non hanno funzionato. I prossimi giorni dovrò dedicargli più attenzione (appena risolvo il problema del NTP smiley-wink)

quindi in risposta ho detto:
Ho la DUE che usa 1.5.7 con l RTC interno, quindi non posso dare uno sketch completo che funzioni sul suo arduino. Il principio comunque è sempre lo stesso della mega e delle versioni IDE precedenti, la richiesta UDP al server NTP è identica che abbia la DUE, la MEGA, un ARIAG25 o un Raspberry Pi, perciò una volta ricavato il suo epoch deve adattarlo alla libreria che usa per creare il suo RTC, non so se ha un orologio esterno con batteria o lo ricava dall'oscillatore, questo non l'ha detto.
Il perno della risposta si rivolge al 1.5.7

Se poi gli utenti ti rispondono una volta a settimana sulle risposte ai loro problemi, la confusione è inevitabile :roll_eyes:

ciao

Scusa ma forse ho frainteso. Ho risposto citandoti perché mi avevi chiamato in causa:

questo metodo lo sto attualmente usando e funziona bene a parte il giorno della settimana che LEO non ha completato e quella funzione non è richiamabile

Però, come ti ho detto, nelle 2 lib temporali che ho scritto il giorno della settimana io l'ho implementato. Ma forse non ho capito nulla io :sweat_smile:

In teoria si ti ho chiamato in causa ahahaha, perchè io postandogli un pezzo che ricava anche il Giorno della settimana, ho specificato che non funziona il metodo di richiamo del giorno.
Per non aprire un tradh sulla questione o scriverti in privato ho lanciato l'esca qui pensando che prima o poi l'avresti letto :slight_smile:

in pratica sull'advancedfunction non si riesce a prelevare il giorno o almeno non ho capito io come :slight_smile:

ciao

Il giorno della settimana lo ricavi partendo dal TimeStamp NTP.

Dalle Advanced Functions di Leo.

//return the day of the week giving a timestamp
uint8_t myRTC::weekDay(uint32_t timestamp) {
  return ((timestamp / 86400UL) + 4 ) % 7;
}

Se non ricordo male Leo, ti detti una mano per il calcolo del giorno. :grin: :grin:

Mi pare che 0 corrisponda a Domenica.

Se non ricordo male Leo, ti detti una mano per il calcolo del giorno. smiley-mr-green smiley-mr-green

azz che memoria, si, il calcolo sbagliava sull'anno bisestile

return ((timestamp / 86400UL) + 4 ) % 7; non c'è il GetweekDay, non è un void come gli altri Get**** e non so come andarlo a prendere :slight_smile:

se metto la funzione dentro allo sketch funziona, ma solo se faccio una richiesta NTP mi si aggiorna

EDIT: ho risolto aggiungendo un Get_weekDay(void), dopo tanto ce l'ho fatta :slight_smile:

La funzione ha in ingresso il timestamp e restituisce il numero del giorno della settimana avendo come convensione la domenica pari a 0, lunedì 1, ecc…
Non è void. :astonished:

Sì, esatto. Vuole un timestamp e lui ti restituisce il giorno della settimana.

@Paolo:
puoi fare una chiamata annidata a 2 metodi della classe:

byte giorno_della_settimana = rtc.weekDay(rtc.getTimestamp());

Certo può anche fare

String  giorno_della_settimana = array_day[rtc.weekDay(rtc.getTimestamp())];

dove in array_day ci sono i nomi dei giorni della settimana.

[MODALITA' FRUSTA ON]
String non si usa, se ti legge Guglielmo.... :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes:
[/MODALITA' FRUSTA OFF]

Sì, poi il risultato di weekDay() lo usa come più gli confà. Non so che deve farci.

PaoloP:
La funzione ha in ingresso il timestamp e restituisce il numero del giorno della settimana avendo come convensione la domenica pari a 0, lunedì 1, ecc..
Non è void. :astonished:

certo che non è void questo lo avevo capito, infatti ho risposto :

se metto la funzione dentro allo sketch funziona, ma solo se faccio una richiesta NTP mi si aggiorna

Quindi significa che il timestamp glielo passavo ......
però il time stamp ce l'ho solo una volta ogni 5 giorni, (solo quando lo chiedo al server) quindi per 5 giorni è sempre venerdì.

il timestamp che serve per tirare fuori il giorno della settimana deve essere elaborato all'interno della lib (nella funzione setClockWithTimestamp), non ha senso che glielo passo io da sketck che tra l'altro il timestamp non ce l'ho :fearful:

ora lo è diventato void, ho detto prima che ho aggiunto una funzione

nella myRtc.h

uint8_t get_g_settimana(void);

e questo myRtc.cpp (rinominata RtcDue per distinguerla da quelle per gli AVR)

uint8_t g_settimana;
****
****
uint8_t RtcDue::setClockWithTimestamp(uint32_t timestamp, uint16_t epoch) {
***
***
***
g_settimana = ((timestamp / 86400UL) + 4 ) % 7; // il timestamp aggiornato al secondo ce l'ho solo qui dentro
}

***
***
uint8_t RtcDue::get_g_settimana() {
    return g_settimana;
}

leo72:
Sì, poi il risultato di weekDay() lo usa come più gli confà. Non so che deve farci.

E' importantissimo avere il giorno della settimana se si creano delle operazioni pianificate giornaliere/settimanali, ci sono alcune cose che possono essere ripetute il Lun, Mer, Ven alle 17.00 e altre Mar, Gio, Sab alle 13.00 e una solo di Dom alle 19.00
Come ti dissi tempo fa quando sviluppavo il programma sulla MEGA, ci sono 800 timer programmabili spalmati su 365gg e sapere che giorno è .... è fondamentale

anche questa va bene, Grazie

byte giorno_della_settimana = rtc.weekDay(rtc.getTimestamp());

Io ho cercato di arrangiarmi :slight_smile: ... non sono un mastro libraio, purtroppo continuo aa andare poco daccordo con le classi.

ciao