Nouvelle version, j'ai amélioré mon programme dans le train ce matin, il est bien plus simple à utiliser maintenant (message explicatif, nettoyage du code, ajout de commentaires plus clairs) :
/*Sketch de lecture et programmation pour horloge RTC I2C DS1307
* utilise la librairie DS1307 disponible sur le forum arduino,et basé sur l'exemple fourni
* avec la lib.
* Librairie DS1307 fournie par mattt et D. Sjunnesson
*
* Programme sous licence GNU GPL
*
* (c) bricofoy 2012
*/
#include <WProgram.h>
#include <Wire.h>
#include <DS1307.h>
void setup() {
Serial.begin(9600);
usage();
lecture_RTC();
}
int valeur=0;
int commande=0;
char truc[2]; //buffer de lecture des valeurs
int i=0;
// explication de l'utilisation
void usage() {
Serial.println("\nUSAGE : u U h[00-23]m[00-59]s[00-59]j0[1-7]D[01-31]M[01-12]A[00-49]");
Serial.println("\nEXEMPLE : h09m35j03 regle l'heure sur 09h35 et jour de la semaine 3 (mardi).");
Serial.println("\nListe des commandes : h** : heure, m** : minutes, s** : secondes, j0* : jour de la semaine");
Serial.println(" D** : jour de la date, M** : mois, A** : annee.");
Serial.println(" u ou U affichent ce message, tout autre caractere affiche l'heure.");
}
// fonction de lecture de l'heure dans le DS1307
void lecture_RTC() {
Serial.print("\nHeure actuelle : ");
Serial.print(RTC.get(DS1307_HR,true)); //read the hour and also update all the values by pushing in true
Serial.print(":");
Serial.print(RTC.get(DS1307_MIN,false));//read minutes without update (false)
Serial.print(":");
Serial.print(RTC.get(DS1307_SEC,false));//read seconds
Serial.print(" "); // some space for a more happy life
Serial.print(RTC.get(DS1307_DOW,false));
Serial.print(" ");
Serial.print(RTC.get(DS1307_DATE,false));//read date
Serial.print("/");
Serial.print(RTC.get(DS1307_MTH,false));//read month
Serial.print("/");
Serial.println(RTC.get(DS1307_YR,false)); //read year
}
// paramétrage de l'horloge
void ecriture_RTC() {
commande = Serial.read();
Serial.print(" "); //ici on envoie 3 espaces sur le terminal, sans ça la lecture suivante est fausse
//sinon il faut envoyer un seul espace avec println et ça marche aussi
for (i=0;i<2;i++) {
truc[i]=Serial.read();
Serial.print(" "); //idem que plus haut : un espace à envoyer sinon ça foire. Ici un seul suffit.
}
valeur = byte((truc[0]-48)*10 + (truc[1]-48)); //-48 car la valeur ascii des chiffres =48 pour le 0, =49 pour le 1, etc
switch (commande) {
case 'h' :
RTC.set(DS1307_HR,valeur);
Serial.print("champ heures regle sur ");
Serial.println(valeur,DEC);
break;
case 'm' :
RTC.set(DS1307_MIN,valeur);
Serial.print("champ minutes regle sur ");
Serial.println(valeur,DEC);
break;
case 's' :
RTC.set(DS1307_SEC,valeur);
Serial.print("champ secondes regle sur ");
Serial.println(valeur,DEC);
break;
case 'D' :
RTC.set(DS1307_DATE,valeur);
Serial.print("champ date regle sur ");
Serial.println(valeur,DEC);
break;
case 'j' :
RTC.set(DS1307_DOW,valeur);
Serial.print("champ jour regle sur ");
Serial.println(valeur,DEC);
break;
case 'M' :
RTC.set(DS1307_MTH,valeur);
Serial.print("champ mois regle sur ");
Serial.println(valeur,DEC);
break;
case 'A' :
RTC.set(DS1307_YR,valeur);
Serial.print("champ annee regle sur ");
Serial.println(valeur,DEC);
break;
case 'u' :
case 'U' :
usage();
break;
default :
break;
}
lecture_RTC();
}
void loop() {
if (Serial.available()) {
ecriture_RTC();
}
}
concernant ton soucis de DS1307 qui se remet à 0:0:0, attention j'ai remarqué que ça arrive quand utilise les fonctions RTC.start() et RTC.stop() de la lib DS1307
les utilises-tu dans ton programme ?
essayes avec mon code, au boot il envoie l'heure, sinon pour afficher l'heure sans rien programmer il suffit d'envoyer un caractère autre que ceux des commandes.