Ciao tutti,
premetto che sono un programmatore amatoriale, per giunta per lo più “lato web”, quindi spero perdonerete le eventuali baggianate che forse dirò
Vorrei usare la ethernet shield ENC28J60 (con la libreria EtherCard) per prendere l’orario da un server NTP e aggiornare l’RTC in modo da visualizzare poi data e ora su un display LCD. Per ora “mi accontenterei” di modificare lo sketch softrtc della libreria RTClib, magari in seguito potrei “farmi male” aggiungendo un DS1307 che ho. Visualizzare anche i secondi, però, mi riesce soltanto se invio al server una richiesta al secondo appunto, il che non mi sembra una cosa molto carina. E non mi sembra abbia senso inviare anche una richiesta al minuto, no? Dovrebbe bastarne una a ogni avvio dello sketch/ogni reset (penso...).
Avrei quindi pensato di effettuare la richiesta NTP nel setup anziché nel loop e, dopo aver trasformato il timestamp, settare l’ora nell’RTC - software o hardware che sia - e lasciare a questo il compito di far scorrere i secondi sul display, fino al prossimo reset o a fino a un eventuale aggiornamento programmato, che fare con la libreria looper. L’immondo e banale codice per ottenere il timestamp (frutto di mix di esempi trovati in giro) è il seguente:
#include <EtherCard.h>
static byte mymac[] = {0x00,0x1A,0x4B,0x38,0x0C,0x5C};
byte Ethernet::buffer[700];
static byte ntpServer[] = {193,204,114,232};
static byte srcPort = 0;
uint32_t timeStamp;
#define INTERVAL 10000
unsigned long lastTime = 0;
void setup () {
Serial.begin(57600);
Serial.println("NTP Demo");
if (!ether.begin(sizeof Ethernet::buffer, mymac, 4))
Serial.println( "Failed to access Ethernet controller");
else
Serial.println("Ethernet controller initialized");
if (!ether.dhcpSetup())
Serial.println("Failed to get configuration from DHCP");
else
Serial.println("DHCP configuration done");
ether.printIp("IP Address:\t", ether.myip);
ether.printIp("Netmask :\t", ether.mymask);
ether.printIp("Gateway :\t", ether.gwip);
ether.ntpRequest(ntpServer, srcPort);
ether.ntpProcessAnswer(&timeStamp, srcPort);
Serial.println("NTP answer received");
Serial.println();
Serial.print("Timestamp: ");
Serial.println(timeStamp);
}
void loop(){
ether.packetLoop(ether.packetReceive());
}
Uhm… cosa mi sfugge? Se le metto nel loop, le richieste NTP funzionano… non capisco :~
Nello sbattimento mentale, avevo addirittura pensato di usare la libreria looper per creare due "eventi di aggiornamento", uno subito e uno magari che so... ogni ora.. ma non funziona uguale, visto che l'addjob del looper va chiamato nel setup(), o almeno così mi pare...
Grazie in anticipo a chi mi darà un chiarimento…