Problèmes avec RTC

Bonjour,

Je voulais tester TinyRTC v1.1 suivant

http://www.dfrobot.com/wiki/index.php?title=Real_Time_Clock_Module_(DS1307)_V1.1_(SKU:DFR0151)

On lit:

Please download and install the Arduino library

mais lorsque je veux inclure Arduino library.zip dans IDE 1.6.7 je reçois le message:

La bibliothèque « Arduino library » ne peut être utilisée.
Les noms de bibliothèques ne doivent contenir que des lettres et des chiffres.
(ASCII seulement sans espace, et ne peuvent commencer par un chiffre)

Que faire?
Merci.
Cdt
Georges

As tu essayer en renommant le zip tout simplement "DS1307.zip" ?

c'est la fonction "import library" ?

suffit de renommer le zip sans espace entre arduino et library, ou mettre n'importe quel nom sans caracteres spéciaux, sans commencer par un chiffre,comme le nom suggéré par 68tjs, encore faut-il savoir renommer un nom de fichier zip

C'est : inclure une bibliotheque > Ajouter la bibliotheque.zip

J'ai donc renommer: Arduino library.zip en Arduinolibrary.zip que j'importe et j'obtiens:

Le dossier spécifié ne contiens pas de bibliothèque valide

Les 2 dossiers: DS1307 et Onwire faut-il les importer séparément ?

Merci de votre aide.

bonjour,
pourquoi se faire ch.... a utiliser cette fonction?
dezippe le fichier et regardes ce qu'il y a dedans et si librairies dedans, place les rep dans le rep librairies

Dans ton "schetchbook" tu as un répertoire "Libraries"
Tu dézippe ton zip --> tu obtients un répertoire --> tu déplace ce répertoire dans ce dossier "libraries".

C'est fait exprès de le mettre chez toi, sinon a la prochaine mise à jour tous serait écrasé.

Si tu ne compte pas te resservir de cette librairie il y a une autre solution (non documentée) mais encore plus simple:
Chaque projet est mis dans un répertoire qui porte le même nom que le fichier ino.
Copie les fichiers h et cpp dans ce répertoire.
Quand tu ouvrira l'IDE tu verra apparaître ces fichiers à coté de ton fichier UNO. Tu les ignores mais ne t'inquiète pas le compilateur les verra et les utilisera.

info : F.Fissore a quitté arduino fin décembre, espérons que les mises à jours buggées vont se calmer.

Bonjour,

infobarquee ton invective était une avancée sauf ch.....!!!
68tjs 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.

Toutefois l'horloge semble compter: Date(dd:mm:yy) 1:1:0: Time(hh:mm:ss) 0:11:59

Lorsque je compile voilà ce que je reçois comme message:

ds1307_example:25: error: 'ds1307' does not name a type

ds1307 DS1307;

^

C:\Users...\Mirko_Prosseda_DS1307_Microrobot_MR\DS1307\Examples\ds1307_example\ds1307_example.ino: In function 'void setup()':

ds1307_example:35: error: expected unqualified-id before '.' token

DS1307.resume(); // turn on the internal clock

^

C:\Users...\Mirko_Prosseda_DS1307_Microrobot_MR\DS1307\Examples\ds1307_example\ds1307_example.ino: In function 'void loop()':

ds1307_example:40: error: expected unqualified-id before '.' token

DS1307.getDate(buffer);

^

exit status 1
'ds1307' does not name a type

infobarquee ton invective était une avancée sauf ch…!!!

ce n’était pas une invective, mais réellement, avant de mettre une librairie, je regarde toujours ce quelle contient dans le zip.

mets le code entre balise code </> je vois pas dans l’exemple de resume()

/*####################################################################
 FILE: ds1307.ino
 VERSION: 1.0
 PURPOSE: Real Time Clock module with DS1307 test sketch

 Description:
 * Communicates with the DS1307 rtc via the I2C bus
 * Time and date are displayed on the Serial Monitor

 Connections:
 * BOARD -> ARDUINO
 * Vcc   -> 5V
 * GND   -> GND
 * SDA   -> A4
 * SCL   -> A5

 HISTORY:
 Mirko Prosseda - Original version (23/06/2013)
#######################################################################*/


#include <ds1307.h>
#include <Wire.h>

ds1307 DS1307;

uint8_t buffer[7]; // receiving buffer

void setup()
{
    Serial.begin(9600);
    Wire.begin();
    Serial.println("Real Time Clock module with DS1307 test sketch");

    DS1307.resume();   // turn on the internal clock
}

void loop()
{
    DS1307.getDate(buffer);

    Serial.print("Date(dd:mm:yy) ");
    Serial.print(buffer[4], DEC);    // day
    Serial.print(':');
    Serial.print(buffer[5], DEC);    // month
    Serial.print(':');
    Serial.print(buffer[6], DEC);    // year
    Serial.print(':');
    Serial.print(" Time(hh:mm:ss) ");
    Serial.print(buffer[2], DEC);    // hours
    Serial.print(':');
    Serial.print(buffer[1], DEC);    // minutes
    Serial.print(':');
    Serial.println(buffer[0], DEC);  // seconds

    delay(1000);
}

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;
}

D’abord merci pour cette “grosse” explication, j’avoue ne pas tout comprendre…!

J’ai installé le programme et aucun message l’erreur, c’est vrai qu’il n’y a pas de libraries…
et ça semble fonctionner: voilà le résultat.

nAffichage de la date
Jour = 1
Date = 1
Mois = 1
Annee = 0
nAffichage de l’heure
Heure = 2
Minutes = 42
Secondes = 45

Questions: (pour l’instant!)
Il lit les registres, mais comment afficher les données exactes du temps?

Il faut mettre le DS1307 à la bonne date et la bonne heure.
Il y a des fonctions pour dans le programme que j’ai transmis .
J’ai aussi écrit dans les commentaires que ces fonctions ne sont à appeller qu’une seule fois → bien évidement dans la mesure où la pile de sauvegarde est en bon état.

Pour mettre la RTC à l’heure il faut dé-commenter les fonctions de réglage de l’heure et de la date.

C’est du rustique : tu fixes les paramètres dans le code et tu lance le télé-versement au bon moment.
Cela revient à dire que tout sera oK sauf les secondes qui seront approximatives.
Il existe des méthodes plus évoluées mais c’est plus compliqué.

Bien évidement il faudra re-commenter ces fonctions de réglage sinon à chaque lancement du programme il se produira une mise à l’heure qui sera fausse si tu ne modifie pas le code. La pile est justement là pour éviter de remettre la RTC à l’heure a chaque mise sous tension.

Attention la Ds1307 n’est pas réputée pour sa précision, au même prix on trouve la DS3231 dont le quartz est interne au boîtier et compensé en température, sa dérive max est de +/- 2 minutes par an dans toute l’étendue de la gamme de température -40 °C/ + 80 °C…

Idem pour la fonction de lecture des registres qui est commentée.
Les registres je les ai lu une seule fois, j’ai pu vérifier que le mode 24 h était actif et c’est ce que je voulais donc pour mes besoins ce n’était pas la peine d’aller plus loin.

Je te met en garde : c’est un petit programme qui ne gère que ce que j’avais besoin d’une RTC.

C’est pour l’exemple, c’est pour démystifier l’utilisation d’un module I2C.

C’est pour dire qu’avec un peu de réflexion et une lecture de la datasheet du composant il n’est pas OBLIGATOIRE de se jeter dans une bibliothèque (library) souvent monstrueuse et rarement exempte de bug et jamais correctement documentée. Là s’il y a des bugs je n’ai qu’à m’en prendre qu’à moi même.

C’est certain que ce qui est valable pour des circuit aussi simples que les RTC ne l’est pas pour tous.
Il ne me viendrait pas à l’idée de réécrire la bibliothèque Wire → ce n’est pas l’envie qui manque ,c’est les compétances. Mais à chaque nouveau module je lis systématiquement la datasheet et j’avise.

68tjs, ça fonctionne!
bravo et un grand merci pour ta précieuse aide...!

Un petit ?
ligne 50 : regle_date(JJ,Date;MM,AA) que représente Date??

Je reviendrais encore dessus pour quelques conseils mais maintenant au lit.....
Bonsoir!

jour : c'est jour de la semaine (0: dimanche, 1 :lundi, 2 : mardi etc
Date : et bien aujourd'hui on est le 24