Bonjour,
Je reviens sur ce forum, après l'avoir un peu "délaissé", car j'ai passé beaucoup plus de temps sur la mise au point de mon imprimante 3D et sur la mise en place d'un Fab Lab que sur arduino.
Mais chaque chose nécessitant son temps, je ne vais pas tarder à me remettre à l'arduino, et à des projets, notamment la construction de petits robots, maintenant que je peux fabriquer facilement diverses pièces.
Pour en venir au sujet du topic :
Pour mon système de domotique DOMOWEB 2012 - Mon site perso : Guy SINNIG, j'avais le même problème. Comme le système est installé dans le local technique,qui se trouve dans le sous-sol, il aurait été compliqué d'utiliser un DCF77, car il faut une antenne pour capter le signal teuton.
Aussi à chaque "reset" je recale l'horloge en NTP et j'ai "bidouillé" un bout de code pour automatiser le passage à l'heure d'été ou d'hiver.
Je vous livre les fonctions utilisées pour cela.
N'étant pas informaticien, c'est loin d'être optimisé.
// --------------- début de la fonction envoi requête NTP ----------
unsigned long NTP() // retourne le nombre de sec. depuis 1 Jan 1970. (Unix time)
{
EthernetUDP Udp;
// IPAddress timeServer(192, 43, 244, 18); // time.nist.gov NTP server - PB -
// IPAddress timeServer(130, 149, 17, 21); // ntps1-0.cs.tu-berlin.de
IPAddress timeServer(194, 2, 0, 28); // ntp0.oleane.net
// IPAddress timeServer(195, 220, 194, 193); // ntp.sophia.cnrs.fr
const 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); //initialise toute les "case" du tableau à 0
//construction de la requete
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
// 8 bytes of zero for Root Delay & Root Dispersion
packetBuffer[12] = 49;
packetBuffer[13] = 0x4E;
packetBuffer[14] = 49;
packetBuffer[15] = 52;
Udp.begin(8888);
Udp.beginPacket(timeServer, 123); //NTP requests are to port 123
Udp.write(packetBuffer,NTP_PACKET_SIZE);
Udp.endPacket();
delay(1000);
if ( Udp.parsePacket() )
{
Udp.read(packetBuffer,NTP_PACKET_SIZE);
Udp.stop();
const unsigned long seventyYears = 2208988800UL;
unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);
unsigned long secsSince1900 = highWord << 16 | lowWord;
return secsSince1900 - seventyYears;
}
else
{
lcd.clear(); // efface LCD
lcd.setCursor(0,0); // positionne curseur colonne 1, ligne 1
lcd.print("Pb NTP");
}
return 0;
}
// --------------- fin de la fonction envoi requête NTP ----------
// --------------- début de la fonction fonction recherche NTP et mise à jour RTC ----------
void print_NTP_Time(unsigned long epoch) // fonction utilitaire, affiche l'heure UTC
{
lcd.clear(); // efface LCD
lcd.setCursor(0,0); // positionne curseur colonne 1, ligne 1
if (epoch == 0)
{
lcd.print("Defaut NTP");
}
else
{
calculDLS();
lcd.print("NTP = ");
lcd.print(((epoch % 86400L) / 3600) + 1 + DLS);
// Serial.print(':');
lcd.print(':');
if ( ((epoch % 3600) / 60) < 10 ) // In the first 10 minutes of each hour, we'll want a leading '0'
{
lcd.print('0');
}
lcd.print((epoch % 3600) / 60);
lcd.print(':');
if ( (epoch % 60) < 10 ) // In the first 10 seconds of each minute, we'll want a leading '0'
{
lcd.print('0');
}
lcd.print(epoch %60);
RTC.stop(); // Arret du module RTC pour mise à jour des registre interne !!! important, il faut toujours arréter le RTC avant une mise à jour de l'heure.
RTC.set(DS1307_SEC,(epoch %60)); // Réglage des secondes
RTC.set(DS1307_MIN,((epoch % 3600) / 60)); // Réglage des minutes
RTC.set(DS1307_HR,(((epoch % 86400L) / 3600) + 1 + DLS)); // Réglage des heures
RTC.start(); // Re-mise en marche du module RTC
}
}
// --------------- fin de la fonction fonction recherche NTP et mise à jour RTC ----------
// --------------- début de la fonction calcul DLS ----------
void calculDLS() // fonction qui calcule DLS (Day Light Saving : heure d'hiver DLS = 0 , d'heure d'été DLS = 1)
{
if ((mois > 3) && (mois < 10) || ((mois == 3) && (date > 24) && (((date-jour) > 24) || (jour == 7))) || ((mois == 10) && ((date < 25) || (((date-jour) < 25) && (jour != 7)))))
{
DLS =1;
}
else
{
DLS = 0;
}
}
// --------------- fin de la fonction calcul DLS ----------
N'hésitez pas à commenter. Je suis preneur de toute critique, surtout si elle est constructive.
@+