Yahoo refuse tous les emails du site. Si vous avez une adresse chez un autre prestataire, c'est le moment de l'utiliser ;)

En cas de soucis, n'hésitez pas à aller faire un tour sur la page de contact en bas de page.

Topic "Utiliser un module horloge temps réel DS1307 avec une carte Arduino / Genuino"

Flux RSS des posts récents dans ce topic ( Flux Atom)


Photo de profil de skywodd

skywodd

Membre

Membre du staff

#344 | Signaler ce message


Dans ce tutoriel, nous allons apprendre ensemble à utiliser un module horloge temps réel DS1307 avec une carte Arduino / Genuino. En bonus, nous verrons comment utiliser la sortie programmable du module pour générer une base de temps. Nous verrons aussi comment utiliser la mémoire NVRAM du module pour conserver des données.

Lire la suite de l'article sur le site

Derniére modification le par skywodd


Pas de photo de profil

weetoz

Membre

#347 | Signaler ce message


J'en ai rêvé;;; Skywodd le fait!!

Une librairie pour le DS1307 sans objet, trop classe Skywodd! ;)

vivement la suite!


Photo de profil de skywodd

skywodd

Membre

Membre du staff

#348 | Signaler ce message


Une librairie pour le DS1307 sans objet, trop classe Skywodd! ;)

par weetoz

Techniquement, c'est de la programmation orienté objet vu que j'utilise une structure. Maintenant, c'est comme "pain au chocolat" et "chocolatine", la question fait débat ;)


Pas de photo de profil

weetoz

Membre

#350 | Signaler ce message


Techniquement, c'est de la programmation orienté objet vu que j'utilise une structure.

par skywodd

Moi, j'ai rien vu… ;)

Bon, pas de résolveurs de portées (::), pas de méthode, pour les constructeurs et destructeurs, j'y comprends encore rien donc je ne sais pas… Enfin je commence juste en C++, donc…

Toujours est-il, ta librairie est bien plus simple à employé que celle que j'utilise jusque là. Et c'est bien plus pratique en ce moment où je suis en formation d'automatisme qui est chronovore et me laisse peu de temps pour C++.


Pas de photo de profil

weetoz

Membre

#354 | Signaler ce message


Salut Skywodd,

la fonction void adjust_current_datetime(datetime_t *datetime) fonctionne à merveille!

J'ai voulu mettre tes fonctions dans un DS1307.cpp, cependant le compilo me dit que le type byte n'est pas autorisé… Celà vient-il de Sloëber (Eclipse pour arduino)? Ou il y a un problème de portée pour ce type? Il me semble pas obligatoire de déclarer une classe pour une librairie non plus… A moins que j'ai encore lu de travers! ;) Merci d'avance.


Photo de profil de skywodd

skywodd

Membre

Membre du staff

#356 | Signaler ce message


J'ai voulu mettre tes fonctions dans un DS1307.cpp, cependant le compilo me dit que le type byte n'est pas autorisé…

par weetoz

Normal, bytes est un type qui n'existe pas en C/C++. C'est une pure invention du framework Arduino ;)

Ajoute ceci en début de ton cpp :

1
2
3
4
5
6
#if ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#define INPUT_PULLUP 2
#endif

Pas de photo de profil

weetoz

Membre

#362 | Signaler ce message


Merci Skywodd, ça fonctionne impeccable!!! ;)


Pas de photo de profil

Laurent

Membre

#830 | Signaler ce message


Bonjour,

J'ai un DS1307 mais il n'y a pas les bornes SCL et SDA. A la place, j'ai des bornes TX et RX. Le module est visiblement compatible arduino et Raspberry.

En utilisant le code, pas moyen de mettre l'horloge à jour. Tous les paramètres restent à 165 (ou 25 pour l'heure).

Ai-je loupé quelque chose ?

Merci,

Laurent


Pas de photo de profil

weetoz

Membre

#831 | Signaler ce message


Bonjour Laurent, Commence par vérifier que c'est bien une puce DS1307 qui est sûre ton module. Si c'est le cas, inverse les broches RX et TX. ( Je pars du principe qu'il y a une erreur de sérigraphie…) N'hésite pas à poster une photo recto verso de ton module avec une bonne qualité.


Pas de photo de profil

Laurent

Membre

#832 | Signaler ce message


Merci pour la réponse rapide. J'ai déjà essayé d'inverser Tx/Rx, aucun effet. C'est bien un DS1307 dans le module. C'est celui-ci : https://www.gotronic.fr/art-horloge-rtc-114100001-pour-raspberry-et-arduino-25174.htm#complte_desc


Pas de photo de profil

weetoz

Membre

#833 | Signaler ce message


Dans ce cas, post ton code, tu es peut-être passé à côté de quelque chose… N'hésite pas non plus à donner des infos, modèle Arduino, et comment tu as connecté les broches sur quels ports…


Pas de photo de profil

Laurent

Membre

#834 | Signaler ce message


La carte : arduino Uno. J'ai cablé 5V du module sur 5V de l'arduino. GND du module sur GND de l'arduino. Rx du module sur A4. Tx du module sur A5 (J'ai aussi essayé l'inverse pour Tx, Rx). Pour le code, j'ai repris le code de l'article.


Pas de photo de profil

weetoz

Membre

#835 | Signaler ce message


Essaye éventuellement de rajouter des "Pullups de 4.7kOhms sur SDA et SCL peut-être que…


Pas de photo de profil

Laurent

Membre

#836 | Signaler ce message


J'ai testé. Malheureusement, pas d'effet.


Pas de photo de profil

weetoz

Membre

#838 | Signaler ce message


Dans le cas où tu es sûre pour le code, je pencherais pour un module défectueux, mais comme il envoie des données… je suis un peu surpris. Tu es sûre d'avoir le bon "BaudRate" côté console série? (115200 bauds dans l'exemple de skywwodd).


Pas de photo de profil

Laurent

Membre

#839 | Signaler ce message


J'ai essayé 5 codes différents trouvés ici et là : toujours le même résultat. J'ai toujours une date du type 165/165/2165 45:165:165. J'ai placé quelques mouchards dans le code et lorsque j'arrive dans la boucle pour mettre l'horloge à jour, pas d'erreur, tout se passe normalement. Mais, dès que je demande l'heure, je retombe sur l'heure ci-dessus. Donc, je pense que je peux être certain que le code n'est pas en cause.

Au niveau du BaudRate, j'ai contrôlé : identique dans le code et sur le terminal.

J'ai continué mes recherches et j'ai trouvé sur certains forum qu'il pouvait s'agir d'un problème de tension (notamment avec des clones de l'arduino qui ne donnent pas exactement 5V). De mon côté, je n'ai pas un clone et j'ai contrôlé les tensions, j'ai 5.1V (sachant que mon multimètre à peut être une erreur de mesure - je suis dans la gamme 0-20V). J'ai aussi essayé avec une alim indépendante de l'arduino (en gardant la masse commune) : toujours le même souci.

Module défectueux : pourquoi pas mais c'est quand même bizarre qu'il renvoie des informations. Si quel'qu'un à d'autres idées, je suis preneur. Merci !


Pas de photo de profil

weetoz

Membre

#841 | Signaler ce message


Que remets-tu en cause? … Et pour quoi?

Perso, je pense que le module que tu as acheté est défectueux, mais celà ne peux se confirmer qu'avec le test du code que tu as chargé.

Dans l'électronique hobbyiste, la seule certitude que l'on a, c'est que l'utilisateur glisse de petites erreurs qui foutent la pagaille, et ce malgré les compétences et la pratique.

Maintenant, si tune veux pas faire un simple "Ctrl C" et "Ctrl V" du code que tu as chargé dans ta carte de développement dans les balises prévue à cet effet, Je ne pourrais continuer à te guider dans ton dépannage.

J'utilise avec succès le DS1307 depuis plusieurs années sans difficultés, et franchement, le seul problème qu'une tension inexacte peut entrainer, c'est une dérive de temps, qui reste acceptables…

Oups pardon, tu ne t'adressais visiblement pas à moi…

Si quel'qu'un à d'autres idées, je suis preneur. Merci !

Je resterais poli…


Photo de profil de skywodd

skywodd

Membre

Membre du staff

#858 | Signaler ce message


Super bizarre cette histoire !

Je viens de regarder le module en question sur le site de seeed.

En prenant en parallèle le brochage d'une carte Raspberry Pi, il semblerait que le module en question est bien câblé sur les broches Rx et Tx (GPIO 14 et 15) du Rpi, et non sur les broches du bus I2C. Il n’existe pourtant aucune variante du DS1307 ayant une sortie série …

En plus, il y a deux résistance de pull-up de 10K sur la carte, comme avec u bus I2C … Ça n'a absolument aucun sens.


Pas de photo de profil

yumumu

Membre

#868 | Signaler ce message


Bonjour , j'ai un petit soucis , j'ai suivi le tutoriel et un message d'erreur s'affiche :" DateTime_t was not declared in this scope". Je suis novice avec arduino donc je ne connais pas grand chose , quelqu'un pourrait m'aider ? Merci d'avance


Photo de profil de oursgenial

oursgenial

Membre

#869 | Signaler ce message


Bonjour , j'ai un petit soucis , j'ai suivi le tutoriel et un message d'erreur s'affiche :" DateTime_t was not declared in this scope". Je suis novice avec arduino donc je ne connais pas grand chose , quelqu'un pourrait m'aider ? Merci d'avance

par yumumu

As-tu déclaré ta variable dans la partie du sketch qui précède le "setup" ? Par ex DateTime now; Comme cela elle est visible pour le code que tu écris dans le "setup" et dans le "loop"
N'oublie pas qu'un code écrit dans le "setup" n'est pas visible à partir du "loop"

Derniére modification le par oursgenial


Photo de profil de skywodd

skywodd

Membre

Membre du staff

#892 | Signaler ce message


j'ai suivi le tutoriel et un message d'erreur s'affiche :" DateTime_t was not declared in this scope".

par yumumu

Le fichier DS1307.h existe et est au bon endroit ? Bien relire l'encadré d'avertissement qui est avant le code.


Pas de photo de profil

bugsymimi

Membre

#996 | Signaler ce message


bonjour je me trouve confronter au meme probleme que laurent

l h'orloge du module rtc n'est pas activée date : 165/165/2165 Heure : 25:165:165

en ayant fait un simple copier coller des code de lecture et reglage de l'heure avec un shield velleman RTC DS1307 + sd (vma202) https://www.velleman.eu/products/view/?id=435508#options

si quelqu'un a une solution ou une idée

le DS1307.h est present au meme niveau que le ino

Derniére modification le par bugsymimi


Pas de photo de profil

weetoz

Membre

#997 | Signaler ce message


Salut, veux-tu nous mettre ton code (entre balises), Merci.


Pas de photo de profil

bugsymimi

Membre

#998 | Signaler ce message


bien sur voila le code comme je l'ai dit c un simple copier coller de celui du site

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
/**
 * Exemple de code de lecture et d'ajustement de l'heure avec un module RTC DS1307.
 * Compatible Arduino 0023 et Arduino 1.x (et supérieur).
 */

/* Dépendances */
#include <Wire.h>
#include "DS1307.h"


/* Rétro-compatibilité avec Arduino 1.x et antérieur */
#if ARDUINO >= 100
#define Wire_write(x) Wire.write(x)
#define Wire_read() Wire.read()
#else
#define Wire_write(x) Wire.send(x)
#define Wire_read() Wire.receive()
#endif


/** Fonction de conversion BCD -> decimal */
byte bcd_to_decimal(byte bcd) {
  return (bcd / 16 * 10) + (bcd % 16); 
}

/** Fonction de conversion decimal -> BCD */
byte decimal_to_bcd(byte decimal) {
  return (decimal / 10 * 16) + (decimal % 10);
}


/** 
 * Fonction récupérant l'heure et la date courante à partir du module RTC.
 * Place les valeurs lues dans la structure passée en argument (par pointeur).
 * N.B. Retourne 1 si le module RTC est arrêté (plus de batterie, horloge arrêtée manuellement, etc.), 0 le reste du temps.
 */
byte read_current_datetime(DateTime_t *datetime) {
  
  /* Début de la transaction I2C */
  Wire.beginTransmission(DS1307_ADDRESS);
  Wire_write((byte) 0); // Lecture mémoire à l'adresse 0x00
  Wire.endTransmission(); // Fin de la transaction I2C
 
  /* Lit 7 octets depuis la mémoire du module RTC */
  Wire.requestFrom(DS1307_ADDRESS, (byte) 7);
  byte raw_seconds = Wire_read();
  datetime->seconds = bcd_to_decimal(raw_seconds);
  datetime->minutes = bcd_to_decimal(Wire_read());
  byte raw_hours = Wire_read();
  if (raw_hours & 64) { // Format 12h
    datetime->hours = bcd_to_decimal(raw_hours & 31);
    datetime->is_pm = raw_hours & 32;
  } else { // Format 24h
    datetime->hours = bcd_to_decimal(raw_hours & 63);
    datetime->is_pm = 0;
  }
  datetime->day_of_week = bcd_to_decimal(Wire_read());
  datetime->days = bcd_to_decimal(Wire_read());
  datetime->months = bcd_to_decimal(Wire_read());
  datetime->year = bcd_to_decimal(Wire_read());
  
  /* Si le bit 7 des secondes == 1 : le module RTC est arrêté */
  return raw_seconds & 128;
}


/** 
 * Fonction ajustant l'heure et la date courante du module RTC à partir des informations fournies.
 * N.B. Redémarre l'horloge du module RTC si nécessaire.
 */
void adjust_current_datetime(DateTime_t *datetime) {
  
  /* Début de la transaction I2C */
  Wire.beginTransmission(DS1307_ADDRESS);
  Wire_write((byte) 0); // Ecriture mémoire à l'adresse 0x00
  Wire_write(decimal_to_bcd(datetime->seconds) & 127); // CH = 0
  Wire_write(decimal_to_bcd(datetime->minutes));
  Wire_write(decimal_to_bcd(datetime->hours) & 63); // Mode 24h
  Wire_write(decimal_to_bcd(datetime->day_of_week));
  Wire_write(decimal_to_bcd(datetime->days));
  Wire_write(decimal_to_bcd(datetime->months));
  Wire_write(decimal_to_bcd(datetime->year));
  Wire.endTransmission(); // Fin de transaction I2C
}


/** Fonction setup() */
void setup() {
  
  /* Initialise le port série */
  Serial.begin(115200);
  
  /* Initialise le port I2C */
  Wire.begin();
  
  /* Vérifie si le module RTC est initialisé */
  DateTime_t now;
  if (read_current_datetime(&now)) {
    Serial.println(F("L'horloge du module RTC n'est pas active !"));
    
    // Reconfiguration avec une date et heure en dure (pour l'exemple)
    now.seconds = 0;
    now.minutes = 0;
    now.hours = 12; // 12h 0min 0sec
    now.is_pm = 0; 
    now.day_of_week = 4;
    now.days = 1; 
    now.months = 12;
    now.year = 16; // 1 dec 2016
    adjust_current_datetime(&now);
  }
}


/** Fonction loop() */
void loop() {
  
  /* Lit la date et heure courante */
  DateTime_t now;
  if (read_current_datetime(&now)) {
    Serial.println(F("L'horloge du module RTC n'est pas active !"));
  }
  
  /* Affiche la date et heure courante */
  Serial.print(F("Date : "));
  Serial.print(now.days);
  Serial.print(F("/"));
  Serial.print(now.months);
  Serial.print(F("/"));
  Serial.print(now.year + 2000);
  Serial.print(F("  Heure : "));
  Serial.print(now.hours);
  Serial.print(F(":"));
  Serial.print(now.minutes);
  Serial.print(F(":"));
  Serial.println(now.seconds);
  
  /* Rafraichissement une fois par seconde */ 
  delay(1000); 
}

et en farfouillant sur le net et le site constructeur avec les code d'exemple j'ai le meme type d'erreur de retour la console donne

2165/165/165 (Wednesday) 165:165:85 since midnight 1/1/1970 = 2087399889s = 24159d now + 7d + 30s: 2036/3/2 5:48:15

et le code en question est

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
// Date and time functions using a DS1307 RTC connected via I2C and Wire lib
#include <Wire.h>
#include "RTClib.h"

#if defined(ARDUINO_ARCH_SAMD)
// for Zero, output on USB Serial console, remove line below if using programming port to program the Zero!
   #define Serial SerialUSB
#endif

RTC_DS1307 rtc;

char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

void setup () {

#ifndef ESP8266
  while (!Serial); // for Leonardo/Micro/Zero
#endif

  Serial.begin(57600);
  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }

  if (! rtc.isrunning()) {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    // This line sets the RTC with an explicit date & time, for example to set
    // January 21, 2014 at 3am you would call:
    // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
  }
}

void loop () {
    DateTime now = rtc.now();
    
    Serial.print(now.year(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.day(), DEC);
    Serial.print(" (");
    Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
    Serial.print(") ");
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();
    
    Serial.print(" since midnight 1/1/1970 = ");
    Serial.print(now.unixtime());
    Serial.print("s = ");
    Serial.print(now.unixtime() / 86400L);
    Serial.println("d");
    
    // calculate a date which is 7 days and 30 seconds into the future
    DateTime future (now + TimeSpan(7,12,30,6));
    
    Serial.print(" now + 7d + 30s: ");
    Serial.print(future.year(), DEC);
    Serial.print('/');
    Serial.print(future.month(), DEC);
    Serial.print('/');
    Serial.print(future.day(), DEC);
    Serial.print(' ');
    Serial.print(future.hour(), DEC);
    Serial.print(':');
    Serial.print(future.minute(), DEC);
    Serial.print(':');
    Serial.print(future.second(), DEC);
    Serial.println();
    
    Serial.println();
    delay(3000);
}

merci

Derniére modification le par bugsymimi


Pas de photo de profil

weetoz

Membre

#999 | Signaler ce message


Je ferais un tour sur ton code mardi … Le temps de retrouver un module ds1307 et de charger ton programme… Tu utilises quel éditeur?