Skyduino:~#
Articles
arduino, Corrigé, programmation, projet, python, tutoriel

[Tutoriel Arduino] Horloge RTC (DS1307) + librairie LiquidCrystal

Le contenu de cet article a été entièrement réécrit et mis à jour sur le site Carnet du Maker.

Liens vers les nouveaux articles :

N.B. Les commentaires de l’article ont été pris en compte lors de la rédaction des nouveaux articles 😉

Discussion

125 réflexions sur “[Tutoriel Arduino] Horloge RTC (DS1307) + librairie LiquidCrystal

  1. bonjour,
    et avec ds1302 rtc module+pcd8544 monochrome sur arduino uno
    quel sont les modif a faire pour que cela fonctionne?
    je rencontre un probleme pour garde l heure avec la pile apres un reset

    Publié par axel_67 | 8 janvier 2012, 12 h 14 min
  2. Super article !

    pour l’utilisation de PROGMEM, un petit lien sur ce que c’est permet de mieux comprendre les mécaniques en oeuvre. J’ai toruvé ce lien http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=38003

    Publié par coliss | 8 janvier 2012, 16 h 25 min
  3. bonjour.
    très intéressant votre projet.
    la routine de clignotement est super!!!

    void blinkPoint1(unsigned long interval, byte x, byte y) {
    093 static unsigned char state = 0;
    094 static unsigned long prevMillis = 0;
    095 unsigned long curMillis = millis();
    096 if(curMillis – prevMillis > interval) {
    097 prevMillis = curMillis;
    098 lcd.setCursor(x, y);
    099 lcd.write(state ? ‘:’ : ‘ ‘);
    100 state = !state;
    101 }
    je voudrai remplacer les « : » par la valeur d’une variable est ce possible ?
    j’ai essayé lcd.write(state ? ‘ ma variable : ‘ ‘) pas possible!!!!
    avez vous une idée?
    merci de votre lecture

    Publié par moni | 11 juin 2012, 14 h 03 min
    • Il suffit de remplacer lcd.write() par lcd.print().

      Ps: ne pas oublier de remplacer ‘ ‘ par une chaine de caractére vide de la longueur de la variable 😉
      Sinon il restera des morceaux de l’ancienne valeur par moment 😉

      Publié par skywodd | 11 juin 2012, 14 h 07 min
  4. merci SKYWODD.

    Publié par moni | 12 juin 2012, 6 h 58 min
  5. Cool ce progamme !!
    Felicitation au concepteur…
    J’aimerai ajouter un capteur de temperature (LM35 ou DS1631) a ce systeme et afficher la temperature sur le LCD…
    Pourriez vous m’aider ?

    Publié par bulletshit17 | 22 juin 2012, 14 h 16 min
  6. Bonsoir,
    Dites le code en python, comment l’ajoute t-on au programme ?
    Helpe me !

    Et s’il vous plaît où trouver la librairie pgmspace

    Publié par bulletshit17 | 22 juin 2012, 22 h 26 min
  7. Bonjour,
    Merci pour ce tutoriel.

    J’ai un problème au niveau de la déclaration de ma libraire structure.h.
    J’ai bien mis la libraire dans le même fichier que mon .ino
    Mais j’ai le message d’erreur « error: structure.h: No such file or directory »
    Je l’appelle bien par #include « structure.h » pourtant … (et le nom est bien orthographié)
    L’erreur disparaît lorsque j’écris #include , mais c’est sans effet (il ne connaît pas la structure Date lorsque je l’utilise).

    Une idée de comment corriger ce problème ?

    Publié par Spirale | 25 juin 2012, 16 h 18 min
    • >> J’ai bien mis la libraire dans le même fichier que mon .ino
      >> Mais j’ai le message d’erreur “error: structure.h: No such file or directory”

      J’ai bien précisé dans l’article :
      Ps: si lors de la compilation vous avez une erreur au niveau de la structure, c’est normal, un bug dans l’ide arduino fait qu’il est impossible d’utiliser une structure en la déclarant dans un sketch, il faut obligatoirement la placer dans un .h dans le même dossier que le .pde (ou .ino) puis l’inclure avec #include “monheader.h” par exemple.

      La structure doit être déclaré dans un fichier structure.h présent dans le même dossier que le .ino, mais pas dans le .ino.

      Publié par skywodd | 25 juin 2012, 18 h 37 min
      • Oui c’est ce que j’ai fait, désolé je me suis mal exprimé.
        J’ai un dossier avec dedans mon .ino et mon .h (structure.h).

        Publié par Spirale | 26 juin 2012, 9 h 06 min
  8. J’ai réussi à corriger le problème.
    En fait il fallait placer le .h dans le dossier où se trouve le dossier contenant le .ino (et pas dans le même dossier que le .ino).
    Par contre j’ai un autre problème. La librairie Wire.h ne connaît pas pas « Wire.send(donnee) », et me « conseille » d’utiliser « Wire.write(donnee) ».
    Quand je regarde dans la libraire, ça me semble en effet être juste. Tu peux me confirmer que ça a bien le même effet ?

    Merci pour ton aide en tout cas.

    Publié par Spirale | 26 juin 2012, 9 h 28 min
    • >> En fait il fallait placer le .h dans le dossier où se trouve le dossier contenant le .ino (et pas dans le même dossier que le .ino).

      Oui c’est ça, pourquoi tu avais un dossier dans le dossier ?

      >> Par contre j’ai un autre problème. La librairie Wire.h ne connaît pas pas “Wire.send(donnee)”, et me “conseille” d’utiliser “Wire.write(donnee)”.
      >> Quand je regarde dans la libraire, ça me semble en effet être juste. Tu peux me confirmer que ça a bien le même effet ?

      Tu est sous arduino 1.0 ?
      Il y a eu des modifications entre 0023 et 1.0 :
      – Wire.send est devenu Wire.write
      – Wire.receive est devenu Wire.read
      Il suffit juste de remplacer send / receive par write / read 😉

      Publié par skywodd | 26 juin 2012, 15 h 42 min
  9. Bonsoir,
    Pourrais-tu nous aider, pour nous qui n’avons pas de connaissance sur le langage python, en nous montrant concrètement la manip qu’il faut faire avec le code python pour la synchronisation de l’heure ?
    PS. La procédure à suivre
    Merci !

    Publié par bulletshit17 | 28 juin 2012, 6 h 29 min
    • 1 – Installer python 2.7.x
      2 – Modifier le script pour que le port série correspondent à celui de l’arduino
      SERIALPORT = « LeNomDuPortSérieIci »
      3 – Brancher l’arduino
      4 – Enregistrer et lancer le script
      5 – Enjoy

      Il n’y a absolument rien à comprendre dans le script python, juste changer le port série et exécuter le tout 😉

      Publié par skywodd | 28 juin 2012, 10 h 03 min
  10. Bonjour
    Totalement novice dans la programmation j’ai le probleme ci dessous
    sketch_jun30a.cpp:2:98: error: structure.h: No such file or directory
    sketch_jun30a:-1: error: variable or field ‘ecrire’ declared void
    sketch_jun30a:-1: error: ‘Date’ was not declared in this scope
    sketch_jun30a:-1: error: ‘date’ was not declared in this scope
    sketch_jun30a:-1: error: variable or …… etc
    Merci de bien vouloir m’aider

    Publié par Dominique | 30 juin 2012, 9 h 28 min
  11. ok merci mais je comprend pas tout le dossier structure je ne le trouve pas je le doit le crée comment ? il vas bien dans le dossier librarie ?
    merci

    Publié par dominique | 30 juin 2012, 13 h 44 min
    • Les fichiers sont agencé comme ceci :
      – Ma_super_horloge (-> le dossier contenant le programme arduino)
      | – Ma_super_horloge.ino (-> le programme arduino)
      | – structure.h (-> le code de structure.h)

      Publié par skywodd | 30 juin 2012, 13 h 51 min
  12. Bonsoir,

    j´ai adoré votre tutoriel je suis entrain de l´adapter pour mes besoin ( car je n´ai pas de lcd mais plus pour faire du data loggin sur carte SD)

    par contre en lisant votre code j´ai du mal a comprendre cette ligne de code:

     » date->heures = bcd2dec(Wire.receive() & 0b111111);  » (ligne 39)

    j´ai du mal a comprende pouquoi est il necesseraire de faire  » & 0b111111  » ?

    je vous remercie d´avance

    Publié par Thierry | 26 janvier 2013, 3 h 29 min
    • C’est pour ignorer le bit 6 qui contient le flag du mode « 24h/12h ».
      Si on ne le masque pas avec ce ET logique il viendrait fausser la valeur.

      Publié par skywodd | 26 janvier 2013, 12 h 13 min
  13. Bonsoir, j’essaye de voir comment votre code fonctionne.
    j’ai une carte mega 2560. Apres quelques modifs, le code fonctionne sur l’arduino et affiche l’heure (non à jours). Maintenant, j’essaye de lancer le code sous python pour mettre à l’heure et j’ai un problème :
    Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)] on win32
    Type « copyright », « credits » or « license() » for more information.
    >>> ================================ RESTART ================================
    >>>

    Traceback (most recent call last):
    File « C:\Users\Rodolphe\Documents\Arduino\ds1307\ds1307\Nouveau document texte.txt », line 2, in
    import serial, datetime, time
    ImportError: No module named serial
    >>>

    Pourtant j’ai bien modifé le port serie à « com16 », je ne vois pas ou est le probleme,
    merci de votre aide.

    Publié par Rodolphe | 16 février 2013, 0 h 50 min
  14. C’est bon j’ai trouvé.
    J’avais un problème d’installation de Py-serial, ça fonctionne maintenant 😉

    Par contre, j’ai un problème avec l’année, affiché à 01 ???

    Publié par Rodolphe | 16 février 2013, 11 h 08 min
    • A priori, la ligne : print « Current year: %d » % int(str(now.year)[-2]) me renvoie juste « 1 »

      Avec un peu d’aide exterieur avec cette ligne ca fonctionne : print « Current year: %s » % str(now.year)[-2:]

      Publié par Rodolphe | 18 février 2013, 22 h 07 min
      • Petit problème avec wordpress et la balise code désolé …

        La ligne devrait être :

        print "Current year: %d" % int(str(now.year)[-2:])
        

        Publié par skywodd | 18 février 2013, 22 h 42 min
      • et rajouter le : sur la ligne
        arduino.write(chr(int(str(now.year)[-2:])))
        j’avais le bug de l’année 01 sans.

        Publié par RB | 30 Mai 2013, 21 h 35 min
  15. Bonjour, quand je rentre ton code complet arduino dans le logiciel Arduino 1.5.2 il me trouve des erreurs a la ligne 13 ,
    il me dit sa :

    HelloWorld:55: error: variable or field ‘synchronisation’ declared void
    HelloWorld:55: error: ‘Date’ was not declared in this scope
    HelloWorld:55: error: ‘date’ was not declared in this scope

    merci de ton aide et ton tuto et parfait, continue comme sa

    Publié par tomlaves | 19 février 2013, 21 h 27 min
    • La version 1.5.2 (encore en beta) de l’ide arduino est réservé à l’arduino DUE en priorité, pour une utilisation avec les cartes arduino « autres » il faut la version 1.0.3.

      Sinon concernant l’erreur il faut faire un fichier .h séparé pour la déclaration de la structure Date, est-ce que tu l’as fait ?

      Publié par skywodd | 19 février 2013, 21 h 32 min
  16. Merci pour ce tuto très complet!
    Mais…étant débutant(j’ai 17 ans et l’arduino est imposé dans mon projet pour le BAC, je découvre) j’aimerais savoir pour le code python, où le placer et dans quoi colle t’on le code, car au lancement de python j’ai une console qui me propose juste les copyright, la licence et les crédits… :/

    Publié par Benjamin | 20 mars 2013, 22 h 33 min
    • C’est bon j’ai trouvé, mais j’ai un problème pour installer pyserial 2.6 comme un commentaire plus haut mais je ne sais pas comment le résoudre 😦

      Publié par Benjamin | 21 mars 2013, 9 h 56 min
  17. Quand je lance le code python dans python shell, il m’affiche:
    « import serial, datetime, time
    ImportError: No module named serial », sans doute a cause de la libraire pyserial et je ne sais pas comment (bien) l’installer

    Publié par Benjamin | 21 mars 2013, 19 h 11 min
    • Manifestement PySerial n’est pas installé …

      Il suffit de ce rendre sur le site de PySerial, télécharger l’installateur pour ta version de python (j’utilise python 2.7 personnellement) et le reste ce fait tout seul normalement.

      Publié par skywodd | 21 mars 2013, 19 h 38 min
      • c’est ce que j’ai fait mais ça n’a pas marché, rien ne c’est fait, j’ai finalement trouvé une solution sur internet mais c’etait plutôt compliqué…Je pense que ça marche mais je confirmerais demain avec les arduinos du lycée

        Publié par Benjamin | 21 mars 2013, 19 h 40 min
  18. Maintenant que j’ai réussi a tout téléversser, j’ai un autre problème…
    L’afficheur me met 4 espace vide puis 15 / 15 / 15 puis à la ligne 45 : 15 :15
    Comment ajuster l’heure et la date? :/

    Publié par Benjamin | 22 mars 2013, 15 h 31 min
    • Il faut lancer le script python au moins une fois avec la carte arduino connecter en usb.
      C’est lui qui se charge de mettre à jour l’heure, la date et le jour en fonction de l’horloge de l’ordinateur.

      Publié par skywodd | 22 mars 2013, 16 h 06 min
      • C’est ce que j’ai fais, mais python m’affiche à son exécution la bonne date et la bonne heure mais a mon avis ne le transmet pas à l’arduino et donc ne l’affiche pas sur l’afficheur…

        Publié par Benjamin | 22 mars 2013, 19 h 14 min
      • Essaye un code d’exemple de la librairie RTClib pour tester ton module RTC 😉

        Publié par skywodd | 22 mars 2013, 19 h 16 min
  19. Mon erreur doit venir de là, je n’ai pas la librarie RTClib. Les arduinos étant au lycée(je ne peux presque rien tester sans), je testerais ça une autre fois.
    Merci beaucoup!

    Publié par Benjamin | 22 mars 2013, 19 h 29 min
  20. Avec le prof, je me suis rendu compte que l’heure et la date dépende des résistances placés sur SCL et SDA.(l’heure changeait tout le temps ou restait fixe mais il était 45 : 15 : 15). Il faut mettre quel résistance pour que ça marche?

    Publié par Benjamin | 28 mars 2013, 12 h 53 min
    • 10K marche sans probléme normalement.

      C’est surement une erreur de câblage, vérifie que les lignes SCL et SDA ne sont pas inversée et qu’elles soit bien sur A4 et A5 (broches analogique).

      Sinon c’est peut être le DS1307 qui est défectueux ?

      Publié par skywodd | 28 mars 2013, 13 h 06 min
      • Avec 10k il était 45 :15 15, avec 2.2k l’heure et la date changeais toute les secondes. Donc je pense que le module peut être défectueuse mais le module est neuf… :/ (sur les broches, je suis sur de ne pas m’être trompé)

        Publié par Benjamin | 28 mars 2013, 19 h 58 min
      • Essaye sans résistances, elle sont peut être déjà intégré dans ton module 😉

        Publié par skywodd | 28 mars 2013, 20 h 00 min
  21. C’est un module sparkfun, j’essayerais la semaine prochaine(je peut pas avant T.T), j’ai vu un schéma où ça marche sur un autre microcontroleur merci 😉

    Publié par Benjamin | 28 mars 2013, 20 h 03 min
  22. J’ai toujours un problème x_x
    J’ai remarqué qu’en fait l’affichage de l’heure et la date dépend de la « forme » du câble, quand je déplace le câble(en le laissant connecté) quelques rares fois(mais très rare et environ 2 secondes) l’affichage de l’heure et la date est bon (sauf l’année mais je n’en ai pas besoin). Comment faire pour pouvoir réussir a l’avoir sans toucher au câble?changer la breadboard?

    Publié par Benjamin | 8 avril 2013, 18 h 58 min
    • C’est un probléme de câblage, c’est sûr, check tes câbles et tes connections je peut pas t’aider plus …

      Publié par skywodd | 8 avril 2013, 19 h 02 min
      • J’ai déjà vérifier mes câbles très souvent, ça doit être la breadboard. Merci de ton aide quand même 🙂
        (j’ai quand même assez « pollué » les commentaires, tu peux en supprimer quelques un de moi si tu veux 😉 )

        Publié par Benjamin | 8 avril 2013, 19 h 06 min
  23. (désolé de t’embêter encore^^) en fait le programme marche uniquement (je l’ai découvert par hasard) lorsque la masse est débranché sur le module d’horloge. C’est assez étrange mais j’aimerais juste savoir s’il n’y a aucun risque sur le montage du coup…

    Publié par Benjamin | 11 avril 2013, 8 h 46 min
    • Un circuit sans masse ne devrait pas pouvoir marcher … Tu as définitivement un probléme avec ton montage 😉

      Publié par skywodd | 11 avril 2013, 9 h 05 min
  24. bonjour
    je suis à la recherche du logiciel qui me permetra de simuler mes montages avec arduino

    merci pour….

    Publié par FRETAX | 25 avril 2013, 12 h 28 min
    • VirtualBreadboard c’est le seul logiciel qui simule une carte Arduino + circuit.
      Mais c’est pas franchement terrible, rien ne vaut un test réel.

      Publié par skywodd | 25 avril 2013, 12 h 56 min
  25. Bonjour et merci de ce tuto génial. Je débute et j’ai un pb sur la synchro date/heure de l’appli python au niveau de la ligne while not « SYNC » in ligne: où « SYNC » n’est pas reconnu. Le message d’erreur obtenu est :

    while not « SYNC » in ligne:
    TypeError: Type str doesn’t support the buffer API

    Heeeeelp merci d’avance !

    Publié par RB | 30 Mai 2013, 15 h 51 min
  26. Effectivement c’est une version 2.7. Pourquoi la 33 n’est pas compatible ? branche ???

    Publié par RB | 30 Mai 2013, 19 h 53 min
  27. Bonjour,
    Merci pour cette excellent article, je débute, pouvez vous me dire comment je peux télécharger les librairie.
    j’ai fait un copier coller dans ARDUINO 1.5 et j’ai plein d’erreur, je pens qu’il manque les librairie

    Merci pour votre réponse

    Charles

    Publié par ROUX CHARLES | 10 juin 2013, 19 h 52 min
    • Arduino 1.5 c’est UNIQUEMENT pour l’arduino Due qui utilise un processeur bien différent des autres cartes et qui est encore en beta.
      Si tu veut utiliser mon code sur une carte classique utilise l’ide « classique » 1.0.5.

      Publié par skywodd | 10 juin 2013, 19 h 55 min
      • Bonsoir,
        j’ai installé la version 1.0.5 d’arduino, j’ai carte UNO
        j’ai fait un copier coller
        et voilà les fautes, je pense qu’il me manque quelquechose

        sketch_jun10a.ino:2:98: error: structure.h: No such file or directory
        sketch_jun10a:12: error: variable or field ‘ecrire’ declared void
        sketch_jun10a:12: error: ‘Date’ was not declared in this scope
        sketch_jun10a:12: error: ‘date’ was not declared in this scope
        sketch_jun10a:13: error: variable or field ‘lire’ declared void
        sketch_jun10a:13: error: ‘Date’ was not declared in this scope
        sketch_jun10a:13: error: ‘date’ was not declared in this scope
        sketch_jun10a:14: error: variable or field ‘synchronisation’ declared void
        sketch_jun10a:14: error: ‘Date’ was not declared in this scope
        sketch_jun10a:14: error: ‘date’ was not declared in this scope
        sketch_jun10a:19: error: variable or field ‘affichage’ declared void
        sketch_jun10a:19: error: ‘Date’ was not declared in this scope
        sketch_jun10a:19: error: ‘date’ was not declared in this scope
        sketch_jun10a:10: error: ‘Date’ does not name a type
        sketch_jun10a:23: error: variable or field ‘ecrire’ declared void
        sketch_jun10a:23: error: ‘Date’ was not declared in this scope
        sketch_jun10a:23: error: ‘date’ was not declared in this scope
        sketch_jun10a:38: error: variable or field ‘lire’ declared void
        sketch_jun10a:38: error: ‘Date’ was not declared in this scope

        Il faudrait que je puise chargé la librairie structure .h

        Charles

        Publié par ROUX CHARLES | 10 juin 2013, 22 h 15 min
  28. Bonsoir,
    j’ai fait un copier coller de structure .h dans un fichier avec wordpad, que j’ai copié dans le répertoire du fichier principale et là les erreurs ont evoluées

    Horloge_RTC__DS1307____librairie_LiquidCrystal.ino:2:98: error: structure.h: No such file or directory
    Horloge_RTC__DS1307____librairie_LiquidCrystal:12: error: variable or field ‘ecrire’ declared void
    Horloge_RTC__DS1307____librairie_LiquidCrystal:12: error: ‘Date’ was not declared in this scope
    Horloge_RTC__DS1307____librairie_LiquidCrystal:12: error: ‘date’ was not declared in this scope
    Horloge_RTC__DS1307____librairie_LiquidCrystal:13: error: variable or field ‘lire’ declared void
    Horloge_RTC__DS1307____librairie_LiquidCrystal:13: error: ‘Date’ was not declared in this scope
    Horloge_RTC__DS1307____librairie_LiquidCrystal:13: error: ‘date’ was not declared in this scope
    Horloge_RTC__DS1307____librairie_LiquidCrystal:14: error: variable or field ‘synchronisation’ declared void
    Horloge_RTC__DS1307____librairie_LiquidCrystal:14: error: ‘Date’ was not declared in this scope
    Horloge_RTC__DS1307____librairie_LiquidCrystal:14: error: ‘date’ was not declared in this scope
    Horloge_RTC__DS1307____librairie_LiquidCrystal:19: error: variable or field ‘affichage’ declared void
    Horloge_RTC__DS1307____librairie_LiquidCrystal:19: error: ‘Date’ was not declared in this scope
    Horloge_RTC__DS1307____librairie_LiquidCrystal:19: error: ‘date’ was not declared in this scope
    Horloge_RTC__DS1307____librairie_LiquidCrystal:10: error: ‘Date’ does not name a type
    Horloge_RTC__DS1307____librairie_LiquidCrystal:23: error: variable or field ‘ecrire’ declared void
    Horloge_RTC__DS1307____librairie_LiquidCrystal:23: error: ‘Date’ was not declared in this scope
    Horloge_RTC__DS1307____librairie_LiquidCrystal:23: error: ‘date’ was not declared in this scope
    Horloge_RTC__DS1307____librairie_LiquidCrystal:38: error: variable or field ‘lire’ declared void
    Horloge_RTC__DS1307____librairie_LiquidCrystal:38: error: ‘Date’ was not declared in this scope
    Horloge_RTC__DS1307____librairie_LiquidCrystal:38: error: ‘date’ was not declared in this scope
    Horloge_RTC__DS1307____librairie_LiquidCrystal:55: error: variable or field ‘synchronisation’ declared void
    Horloge_RTC__DS1307____librairie_LiquidCrystal:55: error: ‘Date’ was not declared in this scope
    Horloge_RTC__DS1307____librairie_LiquidCrystal:55: error: ‘date’ was not declared in this scope

    là je pense qu’il me manque le fichier LiquidCristal.ino

    Charles

    Publié par ROUX CHARLES | 10 juin 2013, 22 h 26 min
    • 1er ligne :
      « error: structure.h: No such file or directory »

      En gros le fichier structure.h n’existe pas dans le dossier de ton code arduino.

      Publié par skywodd | 11 juin 2013, 9 h 30 min
  29. salut, je test ton tuto pour l’introduire dans un projet, et je n’arrive pas a utiliser ton script python, j’ai un
    I2C DS1307 que j’ai cablé comme ton tuto, mais lorsque je lance le script sa reste bloqué sur Booting up arduino …

    aurais tu une idée ? pour m’aider ?

    Merci

    Publié par Mcolivia | 30 octobre 2013, 12 h 51 min
  30. sa marche, j’avais mal cablé dsl et merci encore SKYWOOD!!

    Publié par Mcolivia | 30 octobre 2013, 13 h 36 min
  31. par contre j’ai l’année qui m’affiche 01 au lieu de 13 alors que j’ai bien Current year: 13

    Publié par Mcolivia | 30 octobre 2013, 13 h 39 min
    • A la ligne :

      arduino.write(chr(int(str(now.year)[-2])))
      

      Ajoute un : (double point) âpres -2.

      arduino.write(chr(int(str(now.year)[-2:])))
      

      Publié par skywodd | 30 octobre 2013, 20 h 48 min
  32. Bonjour Skywodd, et bravo pour ton superbe tutoriel. C’est vraiment une aide précieuse pour tous les débutants qui se lancent dans l’électronique

    J’ai moi aussi quelques soucis avec mon RTC.

    Après quelques adaptations,
    – création d’une variable « int zero =0; » et remplacement des « Wire.send(0); » par « Wire.send(zero); »
    – remplacement des Wire.send et Wire.receive par Wire.write et Wire.read
    le sketch compile sans alertes et semble tourner correctement.

    Le script Python se déroule normalement jusqu’au « bye bye », mais l’heure ne s’ajuste pas comme prévu.
    Mon écran LCD affiche irrémédiablement 13/15/2031…

    Quelques infos sur mon setup :
    – Arduino Uno R3
    – module « TinyRTC by Waiwan » sur base de DS1037 avec l’I2C connecté aux ports A4 et A5 de l’arduino
    – j’ai aussi un module barometrique BMP085 qui fonctionne sur ce bus, sans soucis.
    – j’ai vérifié les connections, tout semble bon. La pile du RTC est neuve…

    Aurais-tu une idée ?

    J’ai aussi des petites questions complémentaires :
    – Dans ton code, je vois plusieurs fois la même instruction avec des significations différentes :
    Wire.send(0); // Arrête l’oscillateur du DS1307
    Wire.send(0); // Redémarre l’oscillateur du DS1307
    Wire.send(0); // Demande les info à partir de l’adresse 0 (soit toutes les info)
    Quelle en est l’explication ?
    – J’ai essayé de régler le RTC manuellement via le serial monitor. Si je veux programmer la date du 01/01/2001, dois-je entrer 010101 ou 111 ? Comment le RTC fait-il la distinction ?
    Cela fait-il une différence si j’envoie chaque byte séparément, ou si je tape tout à la file ?

    Merci d’avance !

    Publié par Max | 26 novembre 2013, 3 h 36 min
    • Pourquoi avoir créé une variable « zero » ?
      Wire.send((byte) 0); au lieu de Wire.send(zero); devrait résoudre quelques soucis à mon avis 😉

      Pour les autres questions c’est très simple :
      – Ce n’est pas parce que l’instruction est la même que le contexte et la signification est le même.
      Suivant où et quand tu envois « 0 » dans un registre le résultat est totalement différent, c’est la doc constructeur qui dit quoi faire et quand 😉

      – Tu ne peut pas changer l’heure manuellement avec le serial monitor. Il faut transmettre les valeurs sous forme d’octets bruts, pas de caractères. « 010101 » ça fait 6 octets en ASCII par exemple 😉
      Si tu veut faire le changement manuellement il te faut un vrai terminal série qui permet d’envoyer des données brutes au lieu de texte ASCII.

      Publié par skywodd | 1 décembre 2013, 18 h 22 min
  33. Salut, merci d’avoir pris le temps de répondre à mes questions.

    J’ai créé la variable « zero » afin d’éviter le message d’erreur suivant :
    « RTC.cpp:39:15: error: call of overloaded ‘write(int)’ is ambiguous »

    En fouillant sur le web, plusieurs sources expliquaient que ce message indique que le compilateur ne sait pas quel type de variable utiliser. Je me suis dit qu’en utilisant un entier déclaré au début du programme, le doute serait levé.

    Wire.send((byte) 0) me renvoie une erreur, mais effectivement, avec Wire.write((byte) 0) c’est plus simple et il n’y a pas d’erreur au compilage.

    Par contre, je n’arrive toujours pas à un résultat correct.
    Les secondes défilent bien, le temps continue à s’incrémenter quand je débranche l’arduino, mais le réglage de la date ne se fait pas 😦

    Infos à tout hasard : après l’exécution du script Python, l’écran LCD reste noir. Il faut que je reset manuellement l’arduino.

    Aurais-tu une autre idée ?

    Publié par MAX | 4 décembre 2013, 15 h 56 min
    • Revérifie ton câblage à mon avis il y a un truc qui va pas. Le code devrait marcher en remplaçant Wire.send par Wire.write et en ajoutant le (byte) 0 où il faut, il y a rien d’autre à faire normalement.

      Publié par skywodd | 6 décembre 2013, 20 h 23 min
  34. Salut SKYWODD , et Salut a tous
    Super code BRAVO très belle réalisation,
    mais j’aimerais l’intégrer dans mon programme en menu veille et étant novice j’aimerai savoir comment il faut que je m’y prenne.
    J’ai tenté d’ajouté une fonction void veille(){ ton code } mais sans résultat

    cordialement un novice arduino

    Publié par nico | 6 avril 2014, 10 h 54 min
    • Le contenu de loop() permet de lire la date et de l’afficher.
      Si tu as une fonction qui est appelée lors de la veille il te suffit de mettre le code dedans pour faire l’affichage.

      /!\ Si cette fonction n’est pas appelée en boucle comme pour loop() il faudra que tu fasse toi même une boucle avec une condition de fin pour quitter le mode veille (sinon tu resteras éternellement en mode veille).

      Publié par skywodd | 9 avril 2014, 11 h 44 min
  35. OK géniale désoler de ne pas avoir répondu tout de suite merci pour ta raiponce ça fonctionne par contre comment avec la fonction:
    lire(&date); peut t’ont comparer l’heure actuel pour créer une interruption suivant l’heure actuel.
    Par exemple: si il est 22h fait ceci

    cordialement

    Publié par nico | 19 avril 2014, 18 h 09 min
  36. Merci de ta raiponce,
    en revanche que faut t’il apporter comme librairie
    car il me met en erreur
    in function ‘ void loop() ‘:
    error: expected primary-expression before ‘<' token
    error: 'span' was not declared in this scop
    error: expected ')' before 'class'

    merci pour ton aide
    cordialement

    Publié par nico | 21 avril 2014, 16 h 26 min
  37. OK,
    finalement c’est bon j’ai trouvé mon erreur
    en revanche autre problème comment faire pour que le code ne s’exécute une seule fois par jour car j’ai écris

    void loop(){
    lire(&date);
    if(date.heures == 22) {
    digitalWrite(led, HIGH);
    delay(10000);
    digitalWrite(led, LOW);
    }
    et le code s’exécute en boucle sur une heure
    y a t’il un moyen de cassé la boucle mais quelle reparte la prochaine fois que 22h00 arrive

    si non je suis obliger d’écrire (bien que ce ne soit pas dérangent)
    c’est juste pour accroître mes faible connaissance car le code dessous fonctionne
    void loop(){
    lire(&date);
    if(date.heures == 22)&&(date.minutes==1)&&(date.secondes==1) ) {
    digitalWrite(led, HIGH);
    delay(10000);
    digitalWrite(led, LOW);
    }

    cordialement

    Publié par nico | 21 avril 2014, 17 h 15 min
    • Tu as deux solutions :
      – soit tu test les heures/minutes/secondes
      – soit tu fait une variables dans laquelle tu stocks le jour de la dernière exécution.

      Ensuite le code deviendrait quelques chose dans ce style :
      lire(&date);
      if(date.heures == 22 && data.jour != lastJour) {
      digitalWrite(led, HIGH);
      delay(10000);
      digitalWrite(led, LOW);
      lastJour = date.jour;
      }

      Publié par skywodd | 21 avril 2014, 19 h 59 min
  38. Bonjour,
    Merci pour ces exemples très utiles.
    Est-il possible de décaler l’horloge en milli-secondes sans réinitialiser ?
    Cela pour le réglage à l’aide de boutons + et – par exemple.
    Cordialement.

    Publié par Hasler | 22 avril 2014, 18 h 17 min
  39. Salut SKYWOOD
    merci pour ta raiponce,
    Que pence tu du bouclier LCD 16*2 sainsmart?
    A tu déjà travailler avec?
    Car j’ai un petit soucis lors des appuie sur mes bouton
    j’ai essayer avec un condensateur 10nF derrière en touchant les soudure et rien n’y fait et suivant comment j’appuie sur les bouton mon texte passe de affichage jour a mode incendie aurait tu une idée?

    void menu(){
    key = read_LCD_buttons(); //lecture des boutons déclarer ligne 24 à 33
    lcd.clear();//efface l’afficheur LCD pour enlever les charactère qui ne seront pas remplacer.
    lcd.setCursor(0,0);
    lcd.print( » MENU »);
    while(key != btnRIGHT){
    key = read_LCD_buttons();
    switch(key){

    case btnDOWN:{
    if(key == btnDOWN)
    {afficheur = afficheur++;}
    }

    case btnUP:{
    if (key == btnUP)
    {afficheur = afficheur–;}
    }

    if(afficheur <= 0)
    {
    afficheur = 0 ;
    }
    affiche(afficheur);
    }

    }}
    void affiche(int valeurRecue)
    {
    if(valeurRecue ==1)
    {
    key = read_LCD_buttons();
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print(" ESPACE JOUR");
    lcd.setCursor(0,1);
    lcd.print(" OK RETOUR");
    while(key != btnRIGHT){
    key = read_LCD_buttons();
    switch(key){
    case btnLEFT:{
    if(key == btnLEFT)
    {voletEspaceJourUP();}
    }}}}

    if(valeurRecue ==2)
    {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print(" ESPACE NUIT");
    lcd.setCursor(0,1);
    lcd.print(" OK RETOUR");
    }
    if(valeurRecue ==3)
    {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("TOUS LES VOLETS");
    lcd.setCursor(0,1);
    lcd.print(" OK RETOUR");
    }
    if(valeurRecue ==4)
    {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print(" MODE INCENDIE");
    lcd.setCursor(0,1);
    lcd.print(" OK RETOUR");
    }
    }

    Publié par nico | 22 avril 2014, 20 h 49 min
  40. Pour le LCD 16*2 sainsmart, il vaut mieux analyser l’entrée analogique A0 et faire ce que l’on souhaite…

    Publié par Hasler | 24 avril 2014, 21 h 08 min
  41. Bonjour ,
    Actuellement j’ai comme « projet » de développer un logger pour un capteur solaire.
    En ce moment j’ai câblé l’arduino DUE et l’horloge RTC … j’ai commencé par faire un premier programme que je vous le laisserai ci-dessous. mon programme doit mettre a l’heure le système manuellement ensuite l’ envoyer a l’horloge puis régler la fréquence d’acquisition et lancer les mesures. Je dois récupérer et afficher les mesures puis arrêter les mesures quand je veux.
    Voici le premier sketch:
    #include « Wire.h »
    #define DS1307_I2C_ADDRESS 0×68
    //Pour convertir des nombres décimaux normal à des nombres décimaus codés binaire
    byte decToBcd(byte val)
    {
    return ( (val/10*16) + (val%10) );
    }
    //Pour convertir des nombres binaires à des nombres normales
    byte bcdToDec(byte val)
    {
    return ( (val/16*10) + (val%16) );
    }

    void setDateDs1307
    (byte seconde, // 0 à 59 secondes
    byte minute, // 0 à 69 minutes
    byte heure, // 1 à 23 heures
    byte joursdanslasemaine, // 1 à 7 jours
    byte joursdanslemois, // 1 à 28jours ou 1 à 29jours ou 1 à 30jours ou 1 à 31jours
    byte mois, // 1 à 12mois
    byte annee) // 0-99
    {
    Wire.beginTransmission(DS1307_I2C_ADDRESS);
    Wire.write(0);
    Wire.write(0×80);
    Wire.write(decToBcd(seconde));
    Wire.write(decToBcd(minute));
    Wire.write(decToBcd(heure));
    Wire.write(decToBcd(joursdanslasemaine));
    Wire.write(decToBcd(joursdanslemois));
    Wire.write(decToBcd(mois));
    Wire.write(decToBcd(annee));
    Wire.endTransmission();
    }
    // Obtient la date et l’heure du DS1307.
    void getDateDs1307
    (byte *seconde,
    byte *minute,
    byte *heure,
    byte *joursdanslasemaine,
    byte *joursdanslemois,
    byte *mois,
    byte *annee)
    {
    // Réinitialiser le pointeur de registre.
    Wire.beginTransmission(DS1307_I2C_ADDRESS);
    Wire.write(0);
    Wire.endTransmission();
    Wire.requestFrom(DS1307_I2C_ADDRESS, 7);

    *seconde = bcdToDec(Wire.read() & 0x7f);
    *minute = bcdToDec(Wire.read());
    *heure = bcdToDec(Wire.read() & 0x3f); //Besoin de changer cela si 12 heures am / pm
    *joursdanslasemaine = bcdToDec(Wire.read());
    *joursdanslemois = bcdToDec(Wire.read());
    *mois = bcdToDec(Wire.read());
    *annee = bcdToDec(Wire.read());
    }
    void setup()
    {
    byte seconde, minute, heure, joursdanslasemaine, joursdanslemois, mois, annee;
    Wire.begin();
    Serial.begin(9600);

    seconde = 4;
    minute = 3;
    heure = 7;
    joursdanslasemaine = 5;
    joursdanslemois = 17;
    mois = 4;
    annee = 8;
    setDateDs1307(seconde, minute, heure, joursdanslasemaine, joursdanslemois, mois, annee);
    }
    void loop()
    {
    byte seconde, minute, heure, joursdanslasemaine, joursdanslemois, mois, annee;
    getDateDs1307(&seconde, &minute, &heure, &joursdanslasemaine, &joursdanslemois, &mois, &annee);
    Serial.print(heure, DEC);
    Serial.print(« : »);
    Serial.print(minute, DEC);
    Serial.print(« : »);
    Serial.print(seconde, DEC);
    Serial.print( » « );
    Serial.print(mois, DEC);
    Serial.print(« / »);
    Serial.print(joursdanslemois, DEC);
    Serial.print(« / »);
    Serial.print(annee, DEC);
    Serial.print( » jours_dans_lasemaine: »);
    Serial.println(joursdanslasemaine, DEC);
    delay(1000);
    }

    Mon problème c’est que je n’arrive pas à avoir la date et l’heure du pc mais que des 0 partout.
    Il me semble que l’horloge n’arrive pas à démarrer !!!
    Voici ce que m’affiche le port com :
    0:0:0 0/0/0 jours_dans_lasemaine:0
    0:0:0 0/0/0 jours_dans_lasemaine:0
    0:0:0 0/0/0 jours_dans_lasemaine:0
    0:0:0 0/0/0 jours_dans_lasemaine:0
    0:0:0 0/0/0 jours_dans_lasemaine:0
    0:0:0 0/0/0 jours_dans_lasemaine:0
    0:0:0 0/0/0 jours_dans_lasemaine:0

    HEEEELP pouvez-vous m’aider svp 😦 😦

    Publié par HAITOF | 7 Mai 2014, 11 h 35 min
  42. Juste un mot pour dire merci Skywodd 😉

    Publié par Alomamabobo | 6 juillet 2014, 11 h 59 min
  43. Bonjour,
    J’ai installé le code dans un Arduino Due Ide V 1.5.8,
    J’ai le message de défaut suivant:

    Clock_Sky.ino: In function ‘void synchronisation(Date*)’:
    Clock_Sky.ino:74:22: error: ‘ecrire’ was not declared in this scope
    Clock_Sky.ino:80:10: error: ‘lire’ was not declared in this scope

    Pour tester j’ai éliminé la partie du code concernée, j’arrive à lancer Python qui me renvoie les bonnes infos, une trame avec des zéros et points clignotants sont affichés sur le display ce qui est sans doute normal.
    J’ai bien lu précédemment que la version Ide V1.5.8 posait problème, j’avais exactement le même problème avec la fonction « date » mais le fichier.h n’était pas installé correctement, maintenant le fichier.h semble fonctionner, mais il ne me reste que cette erreur.

    D’avance merci de votre attention et aide.
    Cordialement.

    Publié par Janno | 5 novembre 2014, 15 h 24 min
    • D’aprés le message d’erreur, il manque le code des deux fonctions lire et ecrire dans le fichier .ino

      Publié par Skywodd | 13 novembre 2014, 23 h 13 min
      • Bonjour,
        Désolé pour le retard, j’étais absent.
        J’ai le message de défaut suivant:

        Clock_Sky.ino: In function ‘void ecrire(Date*)’:
        Clock_Sky.ino:27:8: error: ‘class TwoWire’ has no member named ‘send’ de ligne 27 à 35.

        Clock_Sky.ino:42:8: error: ‘class TwoWire’ has no member named ‘send’
        Clock_Sky.ino:47:33: error: ‘class TwoWire’ has no member named ‘receive’ de ligne 47 à 53.

        J’ai essayé des modifs suivant les commentaires précédents mais j’ai davantage de défauts.
        D’avance merci de ton attention et aide.

        Publié par Janno | 1 décembre 2014, 19 h 34 min
      • Remplace Wire.send() par Wire.write() et Wire.receive() par Write.read() si tu utilises une version d’arduino IDE supérieur ou égale à 1.0.

        Publié par Skywodd | 10 décembre 2014, 11 h 22 min
  44. Merci bcp

    Publié par BOUMLI | 9 novembre 2014, 22 h 16 min
    • Bonjour,
      Si je masque les lignes de code contenant « wire.send », « wire.recieve », »wire.send(0) », j’arrive à transférer via Python la date et heure du Pc mais elle reste fixe ce qui est à mon avis normal, elle se réinitialise à chaque fois que je relance Python.
      J’ai un doute avec la Duino Due et sa version V1.5.8 mais je suis totalement incapable de le confirmer.
      D’avance merci de m’aider à aboutir ce tutoriel qui m’apprend énormément.

      Publié par Janno | 5 décembre 2014, 14 h 36 min
  45. Bonjour je suis sur Arduino 1.0.6 et quand je copie le programme il y a une erreur à ce niveau  » hour = bcdToDec(Wire.read() & 0x3f);  » le programme que j’ai copié est: C’est mon PPE de TSI j’ai besoin d’aide je ne trouve pas merci d’avance 🙂

    #include

    int clockAddress = 0x68; // This is the I2C address
    int command = 0; // This is the command char, in ascii form, sent from the serial port
    long previousMillis = 0; // will store last time Temp was updated
    byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
    byte test;

    // Convert normal decimal numbers to binary coded decimal
    byte decToBcd(byte val)
    {
    return ( (val/10*16) + (val%10) );
    }

    // Convert binary coded decimal to normal decimal numbers
    byte bcdToDec(byte val)
    {
    return ( (val/16*10) + (val%16) );
    }

    // 1) Sets the date and time on the ds1307
    // 2) Starts the clock
    // 3) Sets hour mode to 24 hour clock
    // Assumes you’re passing in valid numbers,
    // Probably need to put in checks for valid numbers.
    void setDateDs1307()
    {
    // Use of (byte) type casting and ascii math to achieve result.
    second = (byte) ((Serial.read() – 48) * 10 + (Serial.read() – 48));
    minute = (byte) ((Serial.read() – 48) *10 + (Serial.read() – 48));
    hour = (byte) ((Serial.read() – 48) *10 + (Serial.read() – 48));
    dayOfWeek = (byte) (Serial.read() – 48);
    dayOfMonth = (byte) ((Serial.read() – 48) *10 + (Serial.read() – 48));
    month = (byte) ((Serial.read() – 48) *10 + (Serial.read() – 48));
    year= (byte) ((Serial.read() – 48) *10 + (Serial.read() – 48));
    Wire.beginTransmission(clockAddress);
    Wire.write(byte(0x00));
    Wire.write(decToBcd(second)); // 0 to bit 7 starts the clock
    Wire.write(decToBcd(minute));
    Wire.write(decToBcd(hour)); // If you want 12 hour am/pm you need to set
    // bit 6 (also need to change readDateDs1307)
    Wire.write(decToBcd(dayOfWeek));
    Wire.write(decToBcd(dayOfMonth));
    Wire.write(decToBcd(month));
    Wire.write(decToBcd(year));
    Wire.endTransmission();
    }

    // Gets the date and time from the ds1307 and prints result
    void getDateDs1307() {
    // Reset the register pointer
    Wire.beginTransmission(clockAddress);
    Wire.write(byte(0x00));
    Wire.endTransmission();

    Wire.requestFrom(clockAddress, 7);

    // A few of these need masks because certain bits are control bits
    second = bcdToDec(Wire.read() & 0x7f);
    minute = bcdToDec(Wire.read());53

    // Need to change this if 12 hour am/pm
    hour = bcdToDec(Wire.read() & 0x3f);
    dayOfWeek = bcdToDec(Wire.read());
    dayOfMonth = bcdToDec(Wire.read());
    month = bcdToDec(Wire.read());
    year = bcdToDec(Wire.read());

    Serial.print(hour, DEC);
    Serial.print(« : »);
    Serial.print(minute, DEC);
    Serial.print(« : »);
    Serial.print(second, DEC);
    Serial.print( » « );
    Serial.print(month, DEC);
    Serial.print(« / »);
    Serial.print(dayOfMonth, DEC);
    Serial.print(« / »);
    Serial.print(year, DEC);

    }

    void setup() {
    Wire.begin();
    Serial.begin(57600);
    }

    void loop() {
    if (Serial.available()) { // Look for char in serial que and process if found
    command = Serial.read();
    if (command == 84) { //If command = « T » Set Date
    setDateDs1307();
    getDateDs1307();
    Serial.println( » « );
    }
    else if (command == 81) { //If command = « Q » RTC1307 Memory Functions
    delay(100);
    if (Serial.available()) {
    command = Serial.read();

    // If command = « 1 » RTC1307 Initialize Memory – All Data will be set to 255 (0xff).
    // Therefore 255 or 0 will be an invalid value.
    if (command == 49) {

    // 255 will be the init value and 0 will be cosidered an error that
    // occurs when the RTC is in Battery mode.
    Wire.beginTransmission(clockAddress);

    // Set the register pointer to be just past the date/time registers.
    Wire.write(byte(0x08));
    for (int i = 1; i <= 27; i++) {
    Wire.write(byte(0xff));
    delay(100);
    }
    Wire.endTransmission();
    getDateDs1307();
    Serial.println(": RTC1307 Initialized Memory");
    }
    else if (command == 50) { //If command = "2" RTC1307 Memory Dump
    getDateDs1307();
    Serial.println(": RTC 1307 Dump Begin");
    Wire.beginTransmission(clockAddress);
    Wire.write(byte(0x00));
    Wire.endTransmission();
    Wire.requestFrom(clockAddress, 64);
    for (int i = 1; i <= 64; i++) {
    test = Wire.read();
    Serial.print(i);
    Serial.print(":");
    Serial.println(test, DEC);
    }
    Serial.println(" RTC1307 Dump end");
    }
    }
    }
    Serial.print("Command: ");
    Serial.println(command); // Echo command CHAR in ascii that was sent
    }

    command = 0; // reset command
    delay(100);
    }

    Publié par Namiop | 20 janvier 2015, 16 h 43 min
  46. Bonjour,

    Lorsque je compile avec la version IDE 1.6.0, ayant remplacé au send et receved par write et read,
    j’obtiens :

    horloge.ino:15:16: error: variable or field ‘lcd_print’ declared void
    horloge.ino:15:16: error: ‘prog_uchar’ was not declared in this scope
    horloge.ino:15:28: error: ‘data’ was not declared in this scope
    horloge.ino:80:16: error: variable or field ‘lcd_print’ declared void
    horloge.ino:80:16: error: ‘prog_uchar’ was not declared in this scope
    horloge.ino:80:28: error: ‘data’ was not declared in this scope
    Erreur lors de la compilation.

    De même, le programme Python tourne en rond et n’abouti à rien :
    ~ Arduino Clock – Sync Tool ~
    Created by SkyWodd

    Openning serial port … OK !
    Booting up arduino … [et là plus rien……]

    J’utilise un DS1302 et un Arduino Uno avec CLK -> A5 et DAT -> A4 …

    Help ;-)))

    Merci

    Publié par Christophe | 6 mars 2015, 13 h 42 min
    • Essaye de remplacer les prog_uchar par des « unsigned char ». La mise à jour du compilateur a du faire le ménage dans les types PROGMEM.

      Publié par Skywodd | 10 mars 2015, 7 h 35 min
      • J’ai remplacé prog_uchar par unisgned char et voici le résultat :

        In file included from C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/WString.h:29:0,
        from C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Print.h:26,
        from C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Stream.h:26,
        from C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\Wire/Wire.h:26,
        from horloge.ino:1:
        horloge.ino: In function ‘void affichage(Date*)’:
        horloge.ino:6:61: error: variable ‘__c’ must be const in order to be put into read-only section by means of ‘__attribute__((progmem))’
        horloge.ino:129:15: note: in expansion of macro ‘PSTR2’
        horloge.ino:6:61: error: variable ‘__c’ must be const in order to be put into read-only section by means of ‘__attribute__((progmem))’
        horloge.ino:133:15: note: in expansion of macro ‘PSTR2’
        horloge.ino:6:61: error: variable ‘__c’ must be const in order to be put into read-only section by means of ‘__attribute__((progmem))’
        horloge.ino:137:15: note: in expansion of macro ‘PSTR2’
        horloge.ino:6:61: error: variable ‘__c’ must be const in order to be put into read-only section by means of ‘__attribute__((progmem))’
        horloge.ino:141:15: note: in expansion of macro ‘PSTR2’
        horloge.ino:6:61: error: variable ‘__c’ must be const in order to be put into read-only section by means of ‘__attribute__((progmem))’
        horloge.ino:145:15: note: in expansion of macro ‘PSTR2’
        horloge.ino:6:61: error: variable ‘__c’ must be const in order to be put into read-only section by means of ‘__attribute__((progmem))’
        horloge.ino:149:15: note: in expansion of macro ‘PSTR2’
        horloge.ino:6:61: error: variable ‘__c’ must be const in order to be put into read-only section by means of ‘__attribute__((progmem))’
        horloge.ino:153:15: note: in expansion of macro ‘PSTR2’
        Erreur lors de la compilation.

        …. oups…

        Christophe

        Publié par Christophe | 11 mars 2015, 14 h 01 min
      • Ajoute le mot clef « const » avant la déclaration, j’avais oublié que le nouveau compilateur avait remis les choses au propre de ce côté là aussi.

        Publié par Skywodd | 17 mars 2015, 13 h 19 min
  47. Bonjour,

    Super ton tuto’.

    Peux tu me dire pourquoi tu as privilégié le langage python au langage c pour faire la mise à jour du DS1307 ?

    Publié par Yvohero | 11 mars 2015, 11 h 12 min
    • Parce que c’est simple à écrire, simple à exécuter et multiplateformes.

      Publié par Skywodd | 17 mars 2015, 13 h 18 min
      • bonjour
        bravo pour tous le travail que vous faite
        pouver vous m’aider
        pour afficher l’heure sur un ecran GLCD lib=
        tous les exemple sont en serial print
        ou
        en lcd.print
        comment faire pour les convertir en
        myGLCD.print
        merci

        Publié par adam | 26 mars 2015, 14 h 56 min
      • Si la lib c’est vraiment GLCD (du playground arduino.cc) :

        // ...
        GLCD.CursorTo(13, 2); // place le curseur à X=13, Y=2 pixels
        GLCD.Puts("le texte");
        // ...
        

        Publié par Skywodd | 27 mars 2015, 10 h 33 min
  48. quelqu’un sais où je peux télécharger la librairie Wire svp ?

    Publié par melanouille | 23 mars 2015, 15 h 13 min
  49. salut
    oui
    ça je sais faire
    mais il faut afficher une variable
    exemple
    ////
    lcd.print(RTC.get(DS1307_HR,true));
    lcd.print(« H »);
    lcd.print(RTC.get(DS1307_MIN,false));
    //////
    .myGLCDprint(RTC.get(DS1307_HR,true),10,10);
    la il y’a erreur
    comment faire pour myLGCD ?

    Publié par adam | 27 mars 2015, 12 h 14 min
    • Essaye de passer par une sprtinf(), pas sur que ça marche mais on sait jamais.

      char str[32];
      sprintf(str, ‘%s H’, RTC.get(DS1307_HR, true))
      myGLCD.print(str, 10, 10);

      Publié par Skywodd | 9 avril 2015, 13 h 47 min
      • bonjour
        oui j’ai pas mal d »exemples
        mais je n’arrive pas a les inserer dans le code
        car moi et la programmation on est vraiment pas copain
        plutot electronique

        est dans setup ou loop
        ou avant

        Publié par adam | 10 avril 2015, 13 h 33 min
  50. Bonjour,
    J’utilise l’ide 1.6.3 et Progmen pose des problèmes de compilation.
    Peux-tu apporter plus de précisions dans la réponse que tu as déjà fait. :

    « remplacer les prog_uchar par des « unsigned char ». » dans la fonction lcd_print ?

    « Ajoute le mot clef « const » avant la déclaration » quelle déclaration ? toujours dans lcd_print ?

    La ligne #define PSTR2(2) …. parait bien complexe peux-tu la décrire .

    Sinon, bravo pour tous les tutos que tu réalise.

    Publié par Denis | 13 Mai 2015, 8 h 43 min
    • >> « remplacer les prog_uchar par des « unsigned char ». » dans la fonction lcd_print ?

      Recherche, « prog_uchar », Remplacer par « unsigned char ». C’est pas plus compliqué.

      >> « Ajoute le mot clef « const » avant la déclaration » quelle déclaration ? toujours dans lcd_print ?

      Devant la déclaration de la constante PROGMEM.
      Exemple : const unsigned char toto PROGMEM = …….

      >> La ligne #define PSTR2(2) …. parait bien complexe peux-tu la décrire

      C’est une fonction pre-processeur qui ajoute une constante à la volé à chaque appel de PSTR2 dans le code.
      C’est tiré d’une doc de ATMEL, c’est de la magie noire sauce GCC que je ne peux moi même expliquer.

      Par contre avec le changement de version du compilateur dans l’ide arduino, il va surement falloir faire une petite modif (ajouter un const) :

      #define PSTR2(s) (__extension__({static const unsigned char __c[] PROGMEM = (s); &__c[0];}))

      Publié par Skywodd | 18 Mai 2015, 16 h 14 min
      • Bonjour,
        Le transfert s’effectue correctement sur une carte Due, si je transfert vers une carte Mega Adk j’ai le même problème, j’ai respecté les remplacements préconisés ci-dessus, voici une des erreurs remontée:

        Horloge.ino:153:15: note: in expansion of macro ‘PSTR2’
        Horloge.ino:84:6: error: initializing argument 1 of ‘void lcd_print(unsigned char*)’ [-fpermissive]
        Horloge.ino:7:89: error: invalid conversion from ‘const unsigned char*’ to ‘unsigned char*’ [-fpermissive]

        D’avance merci d’une aide.

        Publié par Janno | 4 juin 2015, 14 h 06 min
  51. Bonjour

    voila j’ai regler le probleme
    /////////////////////////////////
    #include
    #include
    #include
    #include

    RTC_Millis RTC;
    #define myGLCD_WIDTH 20
    #define myGLCD_HEIGHT 4
    char myGLDbuf[myGLCD_WIDTH];

    uint8_t DsHour ,DsMin ,DsSec;
    uint8_t Dsday ,Dsmon ,Dsyear;

    extern uint8_t SmallFont[];
    extern uint8_t BigFont[];
    UTFT myGLCD(ITDB32S,38,39,40,41);

    RTC_DS1307 rtc;

    void setup()
    {
    Serial.begin(9600);
    Wire.begin();
    rtc.begin();
    RTC.begin(DateTime(__DATE__, __TIME__));
    myGLCD.InitLCD();
    myGLCD.clrScr();
    }

    void GetTimeFromRTC()
    {
    DateTime now = rtc.now();
    DsHour = now.hour();
    DsMin = now.minute();
    DsSec = now.second();
    Dsday = now.day();
    Dsmon = now.month();
    Dsyear = now.year();
    }
    void loop(){
    GetTimeFromRTC();
    myGLCD.setFont(BigFont);
    myGLCD.setColor(255,255,0);
    myGLCD.print(myGLDbuf,180,30);
    sprintf(myGLDbuf, « %.2d:%.2d:%.2d »,Dsday ,Dsmon ,Dsyear);
    myGLCD.setColor(255,255,255);
    myGLCD.print(myGLDbuf,100,5);
    myGLCD.print(« IL est : »,10,30);
    sprintf(myGLDbuf, « %.2d:%.2d:%.2d »,DsHour,DsMin,DsSec);

    delay(2000);
    }
    comme ça il tourne bien
    a part la date IL
    affiche le jour le moi,
    mais il affiche 222 pour l’année
    y’à il un solution ?

    Publié par adam | 15 Mai 2015, 13 h 05 min
  52. bonjour
    ce fichier ou programe ,fonctione t il sur win10 64 bit
    merci http://pypi.python.org/pypi/pyserial

    Publié par cbelfort | 8 septembre 2015, 11 h 07 min
    • Il fonctionne sur Win8.1 64 bits à condition d’installer Python 32 bits. Donc dans les même conditions il devrait fonctionner sur Win10.

      Publié par Skywodd | 13 septembre 2015, 14 h 07 min
  53. Bonjour S’il vous plaît, je cherche comment Alardueno programmation pour les jours de l’année, ou même pour une seule journée m’a aidé et je vous remercie
    smailbouziane22@gmail.com

    Publié par smail | 1 Mai 2016, 20 h 50 min

Rétroliens/Pings

  1. Pingback: RTC : gérez l'heure et la date avec votre Arduino - 4 septembre 2014

  2. Pingback: Horloge | Pearltrees - 2 novembre 2015

  3. Pingback: RTC : gérez l'heure et la date avec votre Arduino - 30 janvier 2017

Skyduino devient Carnet du Maker

Le site Carnet du Maker remplace désormais le blog Skyduino pour tout ce qui touche à l'Arduino, l'informatique et au DIY.