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)
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
#347 |
J'en ai rêvé;;; Skywodd le fait!!
Une librairie pour le DS1307 sans objet, trop classe Skywodd!
vivement la suite!
#348 |
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
#350 |
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++.
#354 |
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.
#356 |
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
|
#830 |
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
#831 |
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é.
#832 |
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
#833 |
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…
#834 |
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.
#835 |
Essaye éventuellement de rajouter des "Pullups de 4.7kOhms sur SDA et SCL peut-être que…
#838 |
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).
#839 |
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 !
#841 |
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…
#858 |
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.
#868 |
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
#869 |
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
#892 |
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.
#996 |
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
#997 |
Salut, veux-tu nous mettre ton code (entre balises), Merci.
#998 |
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
#999 |
Je ferais un tour sur ton code mardi … Le temps de retrouver un module ds1307 et de charger ton programme… Tu utilises quel éditeur?