j’ai copié les fichiers décompressés ds1307.h et ds1307.cpp à la racine de ds1307.ino
Car c’est un vrai “fouilli” de librairies pour le rtc1307.
Pour le fouilli je suis entièrement d’accord.
Attention une bibliothèque (library) n’est pas toujours constituée d’un seul fichier h et d’un seul fichier cpp, ces fichiers peuvent être multiples.
Normalement (est-ce que ce mot existe dans le monde des bibliothèques pour arduino ?), normalement dis je, la structure du répertoire décompressé doit être compatible “IDE Arduino” et il peut être mis “sorti de décompression” dans le répertoire “libraries” du “schechbook”.
Effectivement je modère mes propos : la deuxieme méthode est plus simple si et seulement si on est sûr qu’il n’y a qu’un seul fichier h et qu’un seul fichier cpp.
La deuxieme méthode est intéressante à connaître si tu veux découper ton programme en plusieurs fichiers.
1 fichier ino (indispensable pour l’IDE) et des fichiers cpp avec ou sans leur fichiers h associé. Ce n’est obligatoire d’écrire un fichier h associé à un fichier cpp, tout peut se mettre dans le cpp, c’est recommandé parce que c’est plus clair et plus c’est clair moins on a de risque de créer des bugs.
A titre d’exemple d’utilisation d’une RTC sans bibliothèque mais avec lecture de la datasheet je joins un petit programme pour lire une DS3231 ( cela doit passer avec une DS1307).
Je ne fais que :
- Lire les registres → à la réception de la bête pour savoir dans quel état elle est → Attention le DS1307 a moins de registres que le DS3231
- Régler l’heure
- Régler la date
- Lire l’heure
- Lire la date
Attention il y a un"petit plaisir" dans le mot “tocante”
Le nom de la classe qui gére l’ I2C est TwoWire.
Wire n’est pas pas une classe mais un objet pré-instancié de la classe TwoWire.
Le mot “Fil” me parait ridicule d’autant qu’il en faut 2 (sda et scl) et 3 avec la masse.
Qu’Atmel n’utilise pas le terme I2C parce qu’il ne veut pas payer sa cotisation au consortium I2C c’est une chose, mais je trouve ridicule que les auteurs de la classe gérant l’I2C emboîtent le pas à Atmel .
Pour le plaisir j’ai instancié un autre objet que j’ai appelé “tocante” :
TwoWire tocante ;
J’aurai tout aussi bien pu écrire :
TwoWire I2C
Qui aurait été plus réaliste.
Tu peux bien évidement faire comme tout le monde et utiliser directement le terme Wire a la place de “tocante” puisque Wire est préinstancié.
Wire.beginTransmission(adresse_du_module);
Le code :
/**
* Lecture des registres d'une RTC DS3231
* Mises à l'heure et à la date
* Lecture de l'heure et de la date
* a la réception d'Ebay
* Pile en état 3,3 Volt
* 10/01/2016
* */
#include<Wire.h>
#define DEBUG_materiel 1 // Signal de synchro pour l'Analyseur logique
#define DEBUG_propramme 1 //Affichage sur console
typedef struct
{
uint8_t secondes;
uint8_t minutes;
uint8_t heures;
} ds3231_heure;
typedef struct
{
uint8_t jour;
uint8_t date;
uint8_t mois;
uint8_t annee;
} ds3231_date;
uint8_t lecture[19] ;
uint8_t registre ;
uint8_t tour ;
uint8_t tour_max =1 ;
TwoWire tocante ;
ds3231_heure Heure;
ds3231_date Date ;
void setup()
{
pinMode(A0, OUTPUT); //signal pour la synchro
digitalWrite(A0, 0); // analyseur logique
Serial.begin(9600);
tocante.begin();
tour = 1 ;
//regle_heure(16,33,0); // --> ne se fait qu'une seule fois
//regle_date(3,20,1,16); // --> ne se fait qu'une seule fois
//lecture_registres(); // --> se fait à la demande
}
void loop()
{
if (DEBUG_materiel)
{
digitalWrite(A0, 1); //signal pour la Synchro
digitalWrite(A0, 0); // analyseur logique
}
lit_heure();
//delay(100);
if (DEBUG_materiel)
{
digitalWrite(A0, 1); //signal pour la Synchro
digitalWrite(A0, 0); // analyseur logique
}
lit_date();
if (DEBUG_materiel)
{
digitalWrite(A0, 1); //signal pour la Synchro
digitalWrite(A0, 0); // analyseur logique
}
affiche_heure();
affiche_date();
delay(3);
}
//void affiche_heure(ds3231_heure Heure)
void affiche_heure()
{
Serial.println("Affichage de l'heure");
Serial.print("Heure = "); Serial.println(Heure.heures);
Serial.print("Minutes = "); Serial.println(Heure.minutes);
Serial.print("Secondes = "); Serial.println(Heure.secondes);
Serial.print("n");
}
void affiche_date()
{
Serial.println("Affichage de la date");
Serial.print("Jour = "); Serial.println(Date.jour);
Serial.print("Date = "); Serial.println(Date.date);
Serial.print("Mois = "); Serial.println(Date.mois);
Serial.print("Annee = "); Serial.println(Date.annee);
Serial.print("n");
}
void regle_heure(uint8_t heures, uint8_t minutes, uint8_t secondes)
{
tocante.beginTransmission(0x68);
tocante.write(0);
tocante.write(bin_bcd(secondes));
tocante.write(bin_bcd(minutes));
tocante.write(bin_bcd(heures));
tocante.endTransmission();
}
void lit_heure()
{
uint8_t lecture[2] ;
tocante.beginTransmission(0x68);
tocante.write(0);
tocante.endTransmission();
tocante.requestFrom(0x68, 3);
for(uint8_t registre = 1; registre <=3; registre++)
{
lecture[registre]= tocante.read();
}
Heure.secondes = bcd_bin(lecture[1]);
Heure.minutes = bcd_bin(lecture[2]);
Heure.heures = bcd_bin(lecture[3]);
}
void regle_date(uint8_t jour, uint8_t date, uint8_t mois, uint8_t annee)
{
tocante.beginTransmission(0x68);
tocante.write(3);
tocante.write(bin_bcd(jour));
tocante.write(bin_bcd(date));
tocante.write(bin_bcd(mois));
tocante.write(bin_bcd(annee));
tocante.endTransmission();
}
void lit_date()
{
tocante.beginTransmission(0x68);
tocante.write(3);
tocante.endTransmission();
tocante.requestFrom(0x68, 4);
for(uint8_t registre = 1; registre <=4; registre++)
{
lecture[registre]= tocante.read();
}
Date.jour = bcd_bin(lecture[1]);
Date.date = bcd_bin(lecture[2]);
Date.mois = bcd_bin(lecture[3]);
Date.annee = bcd_bin(lecture[4]);
}
void lecture_registres()
{
for (uint8_t i = 0 ; i <= 19; i++ )
{
lecture[i] = 0 ;
}
registre = 0x00 ;
tocante.beginTransmission(0x68);
tocante.write(registre);
tocante.endTransmission();
tocante.requestFrom(0x68, 19);
while(registre <=19 )
{
lecture[registre]= tocante.read();
registre++ ;
}
while(tour <= tour_max)
{
for (uint8_t i = 0 ; i<=18 ; i++ )
{
Serial.print("Registre : "); Serial.print(i);
Serial.print(" "); Serial.println(lecture[i], BIN);
}
tour++;
}
}
uint8_t bin_bcd(uint8_t binaire)
{
//Dizaines
uint8_t bcd ;
bcd |= ((binaire/10) << 4) ;
binaire = (binaire - (binaire/10)*10) ;
//Unitées
bcd |= binaire;
return(bcd) ;
}
uint8_t bcd_bin(uint8_t bcd)
{
uint8_t binaire = 0;
binaire += ((bcd&0xf0)>>4)*10;
binaire += (bcd&0x000f);
return binaire;
}