DS1307 modifier l'heure dans le programme

bonjour, je suis entrain de travailler sur un projet qui intègre une horloge a base de DS1307
tout marche nikel!

Mais un problème subsiste!! Pour le passage a l'heure d'hiver j'utilise des lignes de code qui definnissent ;si heure d'hiver ou d'été en fonction de la date, du jour et de l'heure...
Mais je n'arrive pas à intégrer la modification dans mon code de lecture de l'heure...

Pourriez vous m'aider à integrer une variable heure hiver/été dans le code du DS1307??

Merci merci d'avance, je bug sur ça depuis 2 mois!!!! GRRRRRR!!!!!!

j'utilise ce code:

//Mise à l'heure RTC

// http://www.worldofgz.com/electronique/gerez-lheure-date-arduino-rtc/

#include <Wire.h>
#include "RTClib.h"

RTC_DS1307 RTC; //Classe RTC_DS1307

void setup () {
Serial.begin(57600); //Démarrage de la communication
Wire.begin(); //Démarrage de la librairie wire.h
RTC.begin(); //Démarrage de la librairie RTClib.h

//Si RTC ne fonctionne pas
if (! RTC.isrunning()) {
Serial.println("RTC ne fonctionne pas !");

//Met à l'heure à date à laquelle le sketch est compilé
RTC.adjust(DateTime(DATE, TIME));
//Cela fonctionne également :
//RTC.adjust(DateTime("Dec 5 2012","12:00:00"));
//RTC.adjust(DateTime(2014, 1, 21, 3, 0, 0));
}
}

void loop() {
//Affichage de l'heure
DateTime now = RTC.now();
Serial.print(now.day(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.year(), DEC);
Serial.print(' ');
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();
delay(3000);
}

essais ça

       //passage a l heure d ete 
if ((heure == 2) && (minute == 0) && (seconde == 0) && (jour_semaine == 0) && (mois == 3) && (jour > 24)) {
      heure = 3;
      RTCsetTime();
    }

    // passage à l'heure d'hiver -1 heure
    if ((heure == 3) && (minute == 0) && (seconde == 0) && (jour_semaine == 0) && (mois == 10) && (jour > 24) && (mem_chg_heure == 0)) {
      heure = 2;
      RTCsetTime();
      mem_chg_heure = 1;
    }

  
        mem_chg_heure = 0;

adapte tes variables en fonction

merci pour votre reponse!

j'ai adapté et fait plein de test et modif sans resultat.

j'utilise la librairie "RTClib.h"

mais je suis pas sur quelle est la fonction "SET"...

DateTime now = RTC.now();
//passage a l heure d ete
if ((now.hour() == 2) && (now.minute() == 0) && (now.second() == 0) && (now.dayOfWeek() == 0) && (now.month() == 3) && (now.day() > 24)) {
// now.hour() = 3;
RTCsetTime(DS1307_HR,3);
}

// passage à l'heure d'hiver -1 heure
if ((now.hour() == 3) && (now.minute() == 0) && (now.second() == 0) && (now.dayOfWeek() == 0) && (now.month() == 10) && (now.day() > 24) && (mem_chg_heure == 0)) {
// now.hour() = 2;
RTCsetTime(DS1307_HR,2);
mem_chg_heure = 1;
}

mem_chg_heure = 0;

message d'erreur :

sketch_dec17a.ino: In function 'void loop()':
sketch_dec17a:293: error: 'DS1307_HR' was not declared in this scope
sketch_dec17a:293: error: 'RTCsetTime' was not declared in this scope
sketch_dec17a:297: error: 'mem_chg_heure' was not declared in this scope
sketch_dec17a:299: error: 'DS1307_HR' was not declared in this scope
sketch_dec17a:299: error: 'RTCsetTime' was not declared in this scope
sketch_dec17a:304: error: 'mem_chg_heure' was not declared in this scope
'DS1307_HR' was not declared in this scope

j'avais fait un essai avec cela:

DateTime now = RTC.now();

sprintf(message,"%2d:%2d:%2d",(now.hour()+heures),(now.minute()),(now.second())); //met le message dans la chaine à transmettre, le"-1" c'est pour le changement d'heure

en faite je rajoute ou je retire une heure en fonction de hiver ou été.
mais si heure origine en été et on met -1h car on est en hiver:
il est 10h -1h donc 9h c'est ok ça marche.

mais à minuit: 0h -1h ça affiche -1h aulieu de 23h!

Tu fais un if heure == 0 >> heure affichée = 23

Plutot si heure_affichee==-1 alors heure_affichee=23

Effectivement, c'est pas bête!! Pourquoi faire compliquer quand on peut juste modifier le -1!!!
Je vais regarder cela!!

J'avais essayer de trouver un tuto pour monter un shield ethernet et me connecter à un site qui envoi l'heure afin de gérer le décalage d'heure et la dérive de l'horloge, mais là ça va au delà de mes compétences!!! :wink:

Merci pour le coup de main !!

Bonjour,

il faut aussi que la ligne:

"DateTime now = RTC.now();"

soit activée pendant cette seconde précise pour que le if soit pris en compte.
Sinon, le changement se fera peut-être l'année suivante...

A vérifier, si le programme peut être occupé à autre chose, au-dela d'1 seconde.

Et l'arduino sous tension à cette heure-là....

ah oui papybricol! c pas faux,il faut que je mette une boucle de rattrapage!!!

là j'en suis là:

void AFFICHAGE_HEURE() // lecture heure et affichage LCD
{
//******************************************* AFFICHAGE DE L'HEURE ***************************************

INTEGRATION_DE_LHEURE();

sprintf(message,"%2d:%2d:%2d",(heures),(minutes),(secondes));
lcd.home(); //met le curseur en position (0;0) sur l'écran
lcd.setCursor(12,3); //place le curseur aux coordonnées
lcd.write(message); //envoi le message sur l'écran

//******************************************* FIN AFFICHAGE DE L'HEURE ***************************************
}

void INTEGRATION_DE_LHEURE()
{
DateTime now = RTC.now();

// ++++++++++ Gestion de l'heure d'été pour la France ++++++++++
// En France le changement d'heure fonctionne selon la règle suivante :
// Le dernier dimanche de mars à 3 heure on ajoute une heure,
// Le dernier dimanche d'octobre à 3 heure on retranche une heure

jour_semaine = (now.dayOfWeek());
mois = (now.month());
jours = (now.day());
heures = (now.hour());
minutes =(now.minute());
secondes =(now.second());

//passage a l heure d ete
if ((heures == 2) && (minutes == 0) && (secondes == 0) && (jour_semaine == 0) && (mois == 3) && (jours > 24))
{
heures = (heures + 1);
ete = 1;
hiver = 0;
}

// passage à l'heure d'hiver -1 heure
if ((heures == 3) && (minutes == 0) && (secondes == 0) && (jour_semaine == 0) && (mois == 10) && (jours > 24) && (mem_chg_heure == 0))
{
heures = (heures -1);
mem_chg_heure = 1;
ete = 0;
hiver = 1;
}

if ((heures == 5) && (minutes == 0) && (secondes == 0) && (jour_semaine == 0) && (mois == 10) && (jours > 24))
{
mem_chg_heure = 0; //reset de la variable
}

//rectification pour ne pas avoir minuit - 1h = -1H aulieu de 23h
if (heures == (-1))
{
heures == 23;
}

}

Jour de la semaine == 0 c'est lundi? Ou tous les jours de la semaine? Et lundi c'est 1?

Bonjour,

ça tourne de 0 à 6

Donc la correspondance, entre le nombre (0-6) et le mot du jour, est libre.
C'est toi qui décide.

0 pour dimanche ou lundi ou.....ce que tu veux

Bonjour

J'aime bien votre cheminement de réflexion.
Quelques uns avant vous ont suivi le même :smiley:

Pour ma part, j'en ai conclu que le plus simple est de stocker l'heure UTC dans le DS1307, et de calculer l'heure locale suite à chaque lecture du DS1307.

Re bonjour, que veux tu dire par: c'est moi qui décide?

Je fais une mise à l'heure avec l'heure de la compilation,
Penses tu que ça intégré aussi la date et le jour de la semaine?

J'ai pas le montage sous les yeux pour tester! Je suis dans le train!

Avec RTClib La date? oui elle est intégrée pendant la compilation ,

Le jour "dayOfWeek" , ça j'ai un gros doute, pour l'intégration pendant la compilation (en survolant le fichier .cpp de la lib) . En revanche, avec les fonctions RTCnow() et now.dayOfWeek() tu récupères la valeur. Mais à condition qu'elle ait été initialisée!!!
A vérifier en lisant "dayOfWeek" et voir son évolution.

Utilisant des RTC3231, assez précises dans la durée, je mets à l'heure "manuellement" en écrivant directement dans les registres, avec un switch, au top d'une horloge lue sur le web.
Car la mise à l'heure avec "RTClib", pendant la compilation, entraîne un décalage (plusieurs dizaines de secondes et variable suivant le programme) avant le "téléversement".

Avec la RTC1307, vu sa dérive au cours du temps, le décalage n'est pas un problème.

Voir tutorial-using-ds1307 comment écrire et lire les registres.

bennurre:
Re bonjour, que veux tu dire par: c'est moi qui décide?

Pour le jour de la semaine, la RTC fournit un nombre qui s'incrémente chaque jour de 0 à 6. Puis le cycle reprends de 0 à 6

Quand tu mets à l'heure, tu indiques le nombre du jour courant que tu choisis:
exemple: 0 pour dimanche, jeudi sera donc le nombre 4 etc...
ou 0 pour lundi, jeudi sera le nombre 3 ...

Et bien un grand merci!! Tu es vraiment au top, je vois que tu maîtrise vraiment bien ton sujet!! Je vais aller voir le tuto qui tu m'indiques!!

J'utilise ça pour la mise à l'heure:

RTC.adjust(DateTime(DATE, TIME));
//Cela fonctionne également :
//RTC.adjust(DateTime("Dec 5 2012","12:00:00"));
//RTC.adjust(DateTime(2014, 1, 21, 3, 0, 0));

Comment veux tu que j'indique le jour courant?

Il faut que je fasse un affichage des données d'heures dates etc...

j'ai fait un affichage de dayofweek et ça marche bien!!!! cool!!! merci pour ton aide!!
j'ai fais des modifs pour appliquer tout ça et j'ai ajouter une sécurité si comme tu avais dit, si à cette seconde là il n'intégre pas l'heure...

et voici la derniere version qui a l'air de marcher!!!
(ci-joint que la partie concernée)

//arduivolet46 version 45 nettoyé

#include "LiquidCrystal.h" //ajout de la librairie
#include <Wire.h>
#include "RTClib.h"

RTC_DS1307 RTC;

//Vérifier les broches !
LiquidCrystal lcd(43, 45, 47, 49, 51, 53); //liaison 4 bits de données

char message[16] = "";

int jour_semaine = 0;
int mois = 0;
int jours = 0;
int heures = 0; //variable pour modification des heures
int minutes = 0;
int secondes = 0; //variable pour modification des minutes
int ete = 0; //mettre a 1 si compilation en ete sinon 0
int hiver = 1; //mettre a 1 si compilation en hiver sinon 0

int premiereFoisETE;
int premiereFoisHIVER;

//******************************************* SETUP **********************************************************
//******************************************* SETUP **********************************************************
//******************************************* SETUP **********************************************************

void setup()
{
boolean premiereFoisETE = false;
boolean premiereFoisHIVER = false;

//******************************************* CODE HORLOGE *****************************************************
Wire.begin(); //Démarrage de la librairie wire.h
RTC.begin(); //Démarrage de la librairie RTClib.h
//Si RTC ne fonctionne pas
if (! RTC.isrunning())
{
lcd.write("RTC ne fonctionne pas !");

//Met à l'heure à date à laquelle le sketch est compilé
// RTC.adjust(DateTime(DATE, TIME));
}
//******************************************* FIN CODE HORLOGE **************************************************

lcd.begin(20, 4); //declaration des lignes du lcd écran 20 colonnes et 4 lignes

}

//******************************************* LOOP **********************************************************
//******************************************* LOOP **********************************************************
//******************************************* LOOP **********************************************************

void loop()
{

//RTC.adjust(DateTime(DATE, TIME)); // mise a l'heure du PC attention variable à definir: ete ou hiver 1 ou 0

AFFICHAGE_HEURE();

delay(100);

}
//*********************************** END LOOP **********************************************************************
//*********************************** END LOOP **********************************************************************
//*********************************** END LOOP **********************************************************************

void AFFICHAGE_HEURE() // lecture heure et affichage LCD
{
//******************************************* AFFICHAGE DE L'HEURE ***************************************

INTEGRATION_DE_LHEURE();

sprintf(message, "%2d:%2d:%2d", (heures), (minutes), (secondes));
lcd.home(); //met le curseur en position (0;0) sur l'écran
lcd.setCursor(12, 3); //place le curseur aux coordonnées
lcd.write(message); //envoi le message sur l'écran

DateTime now = RTC.now();
if (now.dayOfWeek() == 0)
{
lcd.setCursor(8, 3);
lcd.write("DIM");
}
if (now.dayOfWeek() == 1)
{
lcd.setCursor(8, 3);
lcd.write("LUN");
}
if (now.dayOfWeek() == 2)
{
lcd.setCursor(8, 3);
lcd.write("MAR");
}
if (now.dayOfWeek() == 3)
{
lcd.setCursor(8, 3);
lcd.write("MER");
}
if (now.dayOfWeek() == 4)
{
lcd.setCursor(8, 3);
lcd.write("JEU");
}
if (now.dayOfWeek() == 5)
{
lcd.setCursor(8, 3);
lcd.write("VEN");
}
if (now.dayOfWeek() == 6)
{
lcd.setCursor(8, 3);
lcd.write("SAM");
}

if ( ete == 1 && hiver == 0 ) //affichage de S ou W si été ou hiver
{
lcd.setCursor(19, 0);
lcd.write("S");
}
if ( ete == 0 && hiver == 1 )
{
lcd.setCursor(19, 0);
lcd.write("W");
}

//******************************************* FIN AFFICHAGE DE L'HEURE ***************************************
}

void INTEGRATION_DE_LHEURE()
{
DateTime now = RTC.now();

// ++++++++++ Gestion de l'heure d'été pour la France ++++++++++
// En France le changement d'heure fonctionne selon la règle suivante :
// Le dernier dimanche de mars à 3 heure on ajoute une heure,
// Le dernier dimanche d'octobre à 3 heure on retranche une heure

jour_semaine = (now.dayOfWeek());
mois = (now.month());
jours = (now.day());
heures = (now.hour());
minutes = (now.minute());
secondes = (now.second());

//passage a l heure d ete
if ((heures == 3) && (minutes == 0) && (secondes < 5) && (jour_semaine == 0) && (mois == 3) && (jours > 24) && (premiereFoisETE = false))
{
heures = (heures + 1);
ete = 1;
hiver = 0;
premiereFoisETE = true;
}

// passage à l'heure d'hiver -1 heure
if ((heures == 3) && (minutes == 0) && (secondes < 5) && (jour_semaine == 0) && (mois == 10) && (jours > 24) && (premiereFoisHIVER = false))
{
heures = (heures - 1);
ete = 0;
hiver = 1;
premiereFoisHIVER = true;
}

if ((heures == 5) && (minutes == 0) && (secondes < 5) && (jour_semaine == 0) && (mois == 3) && (jours > 24))
{
premiereFoisETE = false; //reset de la variable
}

if ((heures == 5) && (minutes == 0) && (secondes < 5) && (jour_semaine == 0) && (mois == 10) && (jours > 24))
{
premiereFoisHIVER = false; //reset de la variable
}

//rectification pour ne pas avoir minuit - 1h = -1H aulieu de 23h
if (heures == (-1))
{
heures = 23;
}

//rectification pour ne pas avoir minuit 24h aulieu de 00h
if (heures == 24)
{
heures = 0;
}

}

Bonsoir, la variable jour de semaine ne va pas de 0 à 6 mais de 1 à 7
voir :
http://datasheets.maximintegrated.com/en/ds/DS1307.pdf
en page 8: Table 2. Timekeeper Registers

Et de manière général le 1er jour de la semaine est le dimanche (chez les anglais) !

Bonjour,

C'est bien ce que j'avais lu dans la doc (DS3231) donc appliqué dans le programme.
Mais le résultat c'est que la RTC m'a retourné systématiquement la valeur 0 après le jour 6, et ainsi de suite en circulaire.

En pratique ça marche avec 0 à 6, ça marche pas avec 1 à 7.
J'en déduis une erreur dans la doc de la RTC.

Je n'ai pas vérifié avec une 1307, mais si notre ami est satisfait avec le cycle 0 à 6, alors ... :wink: