module DS1307, bibliothèque RTClib.h et port I2C
bonjour à tous,
je suis débutant et suis occupé à relire des projets que j'ai fait voici deux mois.
j'avais utilisé un projet trouvé sur un blog (http://electroniqueamateur.blogspot.ca/2013/06/une-horloge-pour-votre-arduino-real.html).
en voici le code :
le module ds1307 est câblé sda/scl sur les broches a4 et a5.
or dans ce croquis, on ne définit nulle part l'adresse i2c du ds1307 (il en d'ailleurs 2 : 0x50 et 0x68).
je voulais brancher un deuxième périphérique i2c, l'afficheur lcd 16*2 i2c du numéro d'avril de elektor (0x27). d'où mon étonnement de ne pas trouver d'adresse pour le module.
et pourtant cela marche
?
pouvez-vous m'expliquer ?
je vous en remercie d'avance.
je suis débutant et suis occupé à relire des projets que j'ai fait voici deux mois.
j'avais utilisé un projet trouvé sur un blog (http://electroniqueamateur.blogspot.ca/2013/06/une-horloge-pour-votre-arduino-real.html).
en voici le code :
code: [select]
horloge arduino
horloge simple avec un arduino, un module breakout
rtc ds1307 et un afficheur lcd.
branchements du breakout rtc ds1307:
gnd --> gnd
vcc --> 5 v
sda --> analog pin a4
scl --> analog pin a5
branchements de l'afficheur lcd:
lcd rs pin --> digital pin 12
lcd enable pin --> digital pin 11
lcd d4 pin --> digital pin 5
lcd d5 pin --> digital pin 4
lcd d6 pin --> digital pin 3
lcd d7 pin --> digital pin 2
lcd r/w pin --> ground
http://electroniqueamateur.blogspot.ca/2013/06/une-horloge-pour-votre-arduino-real.html
***************************************************/
#include <liquidcrystal.h>
#include <wire.h>
#include <rtclib.h>
rtc_ds1307 rtc;
liquidcrystal lcd(12, 11, 5, 4, 3, 2);
void setup() {
wire.begin();
rtc.begin();
lcd.begin(16, 2);
}
void loop() {
datetime = rtc.now();
// l'heure sur la premiêre ligne du lcd
lcd.setcursor(0, 0);
lcd.print(now.hour());
lcd.print(":");
if (now.minute() < 10) {
lcd.print("0");
}
lcd.print(now.minute());
lcd.print(":");
if (now.second() < 10) {
lcd.print("0");
}
lcd.print(now.second());
// la date sur la deuxième ligne du lcd
lcd.setcursor(0, 1);
lcd.print(now.day());
lcd.print(" ");
switch (now.month()) {
case 1:
lcd.print("janvier");
break;
case 2:
lcd.print("fevrier");
break;
case 3:
lcd.print("mars");
break;
case 4:
lcd.print("avril");
break;
case 5:
lcd.print("mai");
break;
case 6:
lcd.print("juin");
break;
case 7:
lcd.print("juillet");
break;
case 8:
lcd.print("aout");
break;
case 9:
lcd.print("septembre");
break;
case 10:
lcd.print("octobre");
break;
case 11:
lcd.print("novembre");
break;
case 12:
lcd.print("decembre");
break;
}
lcd.print(" ");
lcd.print(now.year());
delay(1000);
lcd.clear();
}
le module ds1307 est câblé sda/scl sur les broches a4 et a5.
or dans ce croquis, on ne définit nulle part l'adresse i2c du ds1307 (il en d'ailleurs 2 : 0x50 et 0x68).
je voulais brancher un deuxième périphérique i2c, l'afficheur lcd 16*2 i2c du numéro d'avril de elektor (0x27). d'où mon étonnement de ne pas trouver d'adresse pour le module.
et pourtant cela marche

pouvez-vous m'expliquer ?
je vous en remercie d'avance.
pour la rtc si vous regardez le .h de la librairie vous verrez
#define ds1307_address 0x68
c'est donc câblé en dur dans la librairie (de nombreuses adresses sont déjà attribuées par les fabricants). l'adresse i²c du module ds1307 est non modifiable. elle est codée en dur dans le module et elle est identique pour tous les modules ds1307.
la notion de 2 adresses pour le module est toute relative: l'octet d'adressage peut être scindé en deux parties:
les sept premiers bits correspondent à l'adresse proprement dite, le dernier bit est nommé r/w :
s'il est à 0, le maître signale qu'il va envoyer des octets, et donc que l'esclave doit les lire,
s'il est à 1, le maître indique qu'il veut recevoir des octets, et donc que l'esclave doit les fournir.
on peut également considérer que l'adresse est codée sur les 8 bits, chaque esclave alors deux adresses, l'adresse paire qui sert à lui envoyer des données, l'adresse impaire pour lui demander d'en envoyer.
c'est généralement pour cela que l'on parle de ses 2 adresses mais dans votre cas, l'autre adresse 0x50 est l'ic atmel correspondant à l'eeprom du module car votre rtc offre un peu de mémoire aussi
pour le second point - au vu de la déclaration de votre instance lcd, liquidcrystal lcd(12, 11, 5, 4, 3, 2); vous n'utilisez pas l'i2c mais le mode avec les 4 broches de données (d2 à d5) et 2 broches de commandes (rs=12et e=11)
#define ds1307_address 0x68
c'est donc câblé en dur dans la librairie (de nombreuses adresses sont déjà attribuées par les fabricants). l'adresse i²c du module ds1307 est non modifiable. elle est codée en dur dans le module et elle est identique pour tous les modules ds1307.
la notion de 2 adresses pour le module est toute relative: l'octet d'adressage peut être scindé en deux parties:
les sept premiers bits correspondent à l'adresse proprement dite, le dernier bit est nommé r/w :
s'il est à 0, le maître signale qu'il va envoyer des octets, et donc que l'esclave doit les lire,
s'il est à 1, le maître indique qu'il veut recevoir des octets, et donc que l'esclave doit les fournir.
on peut également considérer que l'adresse est codée sur les 8 bits, chaque esclave alors deux adresses, l'adresse paire qui sert à lui envoyer des données, l'adresse impaire pour lui demander d'en envoyer.
c'est généralement pour cela que l'on parle de ses 2 adresses mais dans votre cas, l'autre adresse 0x50 est l'ic atmel correspondant à l'eeprom du module car votre rtc offre un peu de mémoire aussi
pour le second point - au vu de la déclaration de votre instance lcd, liquidcrystal lcd(12, 11, 5, 4, 3, 2); vous n'utilisez pas l'i2c mais le mode avec les 4 broches de données (d2 à d5) et 2 broches de commandes (rs=12et e=11)
Arduino Forum > International > Français (Moderators: jfs, Snootlab) > module DS1307, bibliothèque RTClib.h et port I2C
arduino
Comments
Post a Comment