Bonjour,
Tout d'abord merci à tous de m'aider, je viens d'y repasser la journée et cette fois je tiens quelques choses qui fonctionne.
Mais je suis quand même intéressé par ton code et ton aide Bricoleau, puisque tu as déjà été confronté au problème.
Pour la mise en situation, j'ai un PC qui tourne en serveur donc allumé 24/24 et que j'ai configuré pour qu'il me fournisse du NTP, comme ca si la box est HS (si, si c'est déjà arrivé) j'ai quand même mon réseau local qui fonctionne et donc le NTP de dispo.
Voici donc le code qui m'a permit de tester, bien entendu tout n'est pas de moi, et je suis parti du code proposé par Jean-François et dans lequel j'ai ajouté de quoi obtenir le NTP et mettre à jour le RTC.
/*
Permet de mettre une horloge ds1307 en synchronisation avec l'heure NTP
Par le biais d'une application Arduino-Processing
*/
/*
Comporte des parties de code écrites par :
- Maurice Ribble
4-17-2008
http://www.glacialwanderer.com/hobbyrobotics
Pour le ds1307
- X. HINAULT
01/2010
http://www.mon-club-elec.fr
Pour le LCD
- Rendu autonome : 01/2014
Par jean-Luc NAPOLITANO
Note : Cela sous entend d'avoir (attention aux broches communes) :
- Un shield W5100 et une connexion reseau valide
- Un shield afficheur LCD
- Un shield RTC DS1307 (attention broches 4-5 sur Uno, 20-21 sur Mega2560)
- Un Aduino (Uno, Mega etc)
*/
#include <Time.h>
#include <Wire.h>
#define DS1307_I2C_ADDRESS 0x68
// Pour l'accès au reseau
#include <SPI.h>
#include <Ethernet.h>
#include <EthernetUdp.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // Utilisez votre MAC address (pas obligé d'en changer)
byte ip[] = { 192, 168, 0, 177 }; // Pas de DHCP, utilisation d'une IP compatible au reseau local (plus simple)
byte subnet[] = { 255, 255, 255, 0 }; // Masque de sous-reseau
byte gateway[] = { 192, 168, 0, 254 }; // internet access via router (votre box généralement)
//**** liaison pour l'heure NTP ****//
unsigned int localPort = 8888; // Port local pour écouter les paquets UDP
IPAddress timeServer(192, 168, 0, 1); // PC local à paramétrer en serveur NTP ou un serveur NTP sur le net
const int NTP_PACKET_SIZE = 48; // L'horodatage NTP se trouve dans les 48 premiers octets du message
byte packetBuffer[ NTP_PACKET_SIZE]; // Tampon pour maintenir les paquets entrants et sortants
bool maj_heure = false; // Pour la mise à l'heure automatique
bool maj_manu = false; // Pour la mise à l'heure manuelle
// Un exemple UDP pour envoyer et recevoir des paquets UDP
EthernetUDP Udp;
const long timeZoneOffset = -3600L; // Réglez-le sur le décalage en secondes à votre heure locale
//char isodate[25]; // L'heure actuelle au format ISO est stocké ici
// Convert normal decimal numbers to binary coded decimal
byte decToBcd(byte val)
{
return ( (val/10*16) + (val%10) );
}
// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{
return ( (val/16*10) + (val%16) );
}
// Stops the DS1307, but it has the side effect of setting seconds to 0
// Probably only want to use this for testing
/*void stopDs1307()
{
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.send(0);
Wire.send(0x80);
Wire.endTransmission();
}
*/
// 1) Sets the date and time on the ds1307
// 2) Starts the clock
// 3) Sets hour mode to 24 hour clock
// Assumes you're passing in valid numbers
void setDateDs1307(byte second, // 0-59
byte minute, // 0-59
byte hour, // 1-23
byte dayOfWeek, // 1-7
byte dayOfMonth, // 1-28/29/30/31
byte month, // 1-12
byte year) // 0-99
{
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.write(0);
Wire.write(decToBcd(second)); // 0 to bit 7 starts the clock
Wire.write(decToBcd(minute));
Wire.write(decToBcd(hour)); // If you want 12 hour am/pm you need to set
// bit 6 (also need to change readDateDs1307)
Wire.write(decToBcd(dayOfWeek));
Wire.write(decToBcd(dayOfMonth));
Wire.write(decToBcd(month));
Wire.write(decToBcd(year));
Wire.endTransmission();
}
// Gets the date and time from the ds1307
void getDateDs1307(
byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year)
{
// Reset the register pointer
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.write(0);
Wire.endTransmission();
Wire.requestFrom(DS1307_I2C_ADDRESS, 7);
// A few of these need masks because certain bits are control bits
*second = bcdToDec(Wire.read() & 0x7f);
*minute = bcdToDec(Wire.read());
*hour = bcdToDec(Wire.read() & 0x3f); // Need to change this if 12 hour am/pm
*dayOfWeek = bcdToDec(Wire.read());
*dayOfMonth = bcdToDec(Wire.read());
*month = bcdToDec(Wire.read());
*year = bcdToDec(Wire.read());
}
#include <LiquidCrystal.h>
const int RS=8; //declaration constante de broche
const int E=9; //declaration constante de broche
const int D4=3; //declaration constante de broche
const int D5=5; //declaration constante de broche
const int D6=6; //declaration constante de broche
const int D7=7; //declaration constante de broche
LiquidCrystal lcd(RS, E, D4, D5, D6, D7);
int octetReception=0; // variable de stockage des valeurs reçues sur le port Série (ASCII)
char caractereRecu=0; // variable pour stockage caractère recu
//int compt=0; // variable comptage caractères reçus
String chaineReception=""; // déclare un objet String vide pour reception chaine
int oldSecond;
void setup() {
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
Wire.begin(); // initialise 1wire
Serial.begin(115200); // Initialise la communication série
// lit les valeurs de l'horloge pour les replacer si elle est déjà à l'heure
getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
if ((year)== NULL){ // si l'année = NULL
// preinitialise l'horloge mets les valeurs lue précédement (à 0 si premier allumage)
setDateDs1307(int(second), int(minute), int(hour), int(dayOfWeek), int(dayOfMonth), int(month), int(year));
}
//***** LCD *****//
lcd.begin(20,4); // Initialise le LCD avec 20 colonnes x 4 lignes (à changer en 16/2 en fonction de l'afficheur)
delay(10); // pause rapide pour laisser temps initialisation
lcd.print("initialisation") ; // affiche la chaîne texte - message de test
lcd.setCursor(0, 1) ;
lcd.print("de l'horloge") ;
delay(2000); // pause de 2 secondes
lcd.clear(); // efface écran et met le curseur en haut à gauche
delay(100); // pour laisser temps effacer écran
// Connexion au reseau
Ethernet.begin(mac, ip);
Udp.begin(localPort);
Serial.println("waiting for sync");
// ***************** La remise à l'heure par script n'est plus utilisée *****************
// Enlever les REMs pour une utilisation ponctuelle (1ère mise en route par exemple)
// Serial.println('A'); // envoi un "top" à Processing
// while (millis()<5000) { // attente pendant 5 secondes d'une liaison série (ne fonctionne pas en dessous)
// while (Serial.available()>0) { // tant qu'un octet est dans la liaison série
//
// octetReception = Serial.read(); // Lit le 1er octet reçu et le met dans la variable
//
// if (octetReception == 13) { // si l'octet reçu est le retour chariot (CR ou 13)
//
// // converti la chaine en entier pour les valeurs de temps
// second = int((chaineReception.charAt(0)-48)*10)+int(chaineReception.charAt(1)-48) ;
// minute = int((chaineReception.charAt(2)-48)*10)+int(chaineReception.charAt(3)-48);
// hour = int((chaineReception.charAt(4)-48)*10)+int(chaineReception.charAt(5)-48);
// dayOfWeek = 1;
// dayOfMonth = int((chaineReception.charAt(6)-48)*10)+int(chaineReception.charAt(7)-48);
// month = int((chaineReception.charAt(8)-48)*10)+int(chaineReception.charAt(9)-48);
// year = int((chaineReception.charAt(12)-48)*10)+int(chaineReception.charAt(13)-48); //int((chaineReception.charAt(10)-48)*1000)+int((chaineReception.charAt(11)-48)*100)+
//
// // mets le DS1307 en syncronisation avec l'horloge de l'ordinateur
// setDateDs1307(int(second), int(minute), int(hour), int(dayOfWeek), int(dayOfMonth), int(month), int(year));
//
// chaineReception=""; //RAZ de la chaine de réception
// break; // sort de la boucle while
// }
// else { // si le caractère reçu n'est pas un saut de ligne
// caractereRecu=char(octetReception); // convertit l'octet reçu en caractère
// chaineReception=chaineReception+caractereRecu; // ajoute le caratère à la chaine
// }
// }
// }
}