Un problème de plus à l'utilisation de la RAM rtc DS1307

Bonjour à tous les connaisseurs

Je suis encore très balbutiant en matière d’Arduino, mais je me soigne et je m’obstine. :hammer_and_wrench:

A force, j’ai fini par obtenir l’heure, ce que je savais déjà faire sur un autre shield, qui utilise un DS3231. Comme mon application aura besoin de conserver quelques octets en cas de coupure secteur, j’ai choisi le 1307.

Faisant cohabiter les deux, je me suis fait piéger par un conflit. Les deux sont à la même adresse, et, bien entendu, je ne voyais pas apparaître le nouveau avec l’ancien déjà en place. C’est le scanner i2c qui ne voyait rien de plus.

Là, je me suis mis sur un uno qui n’a rien d’autre que mon périphérique.

Voilà le code de ce que j’ai fini par faire tourner et qui me donne bien l’heure sur le moniteur. `// Test_01_1307.ino 2 mai 2021

#include<Wire.h>
#include<RTClib.h>


RTC_DS1307 RTC ;
void printDateTime ( DateTime dateTime ) ;

void setup ()
{
  // put your setup code here, to run once:
  Serial.begin( 115200 ) ;
  Wire.begin () ;
  RTC.begin () ;
}

void loop ()
{
  // put your main code here, to run repeatedly:
  if ( Serial.available () > 0 )
  {
    int instruct = Serial.read () ;
    switch (instruct)
    {
      case'D':
        {
          DateTime now = RTC.now () ;
          printDateTime(now);
          break;
        }
    //  case'S':
       // {
       //   RTC.set ( RTC_MONTH , 6 ) ;
      //    RTC.set ( RTC_HOUR , 16 ) ;
      //    break;
      //  }
    }
  }
  // delay ( 5000 ) ;
}
void printDateTime ( DateTime dateTime )
{
  Serial.print(dateTime.year(), DEC);
  Serial.print('/');
  Serial.print(dateTime.month(), DEC);
  Serial.print('/');
  Serial.print(dateTime.day(), DEC);
  Serial.print(' ');
  Serial.print(dateTime.hour(), DEC);
  Serial.print(':');
  Serial.print(dateTime.minute(), DEC);
  Serial.print(':');
  Serial.print(dateTime.second(), DEC);
  Serial.println();
}`

C’est sur demande du clavier

Comme c’est la RAM à laquelle j’essaie d’accéder, je recherche ce qui s’y rapporte. J’ai trouvé ça, qui ressemble bien à mon besoin, mais je tourne en rond sans pouvoir conclure. Le compilateur refuse certains libellés:

// autre_ram_1307_02.ino

// RAM read and write functions using a DS1307 RTC connected via I2C and Wire lib.
// 2012-11-06 www.idreammicro.com http://opensource.org/licenses/mit-license.php
 
#include <Wire.h>
#include <RTClib.h>
 
RTC_DS1307 RTC ;
 
void setup () {
    Serial.begin ( 115200 ) ;
    Wire.begin () ;
    RTC.begin () ;
     
    // Write bytes in RAM.
    uint8_t data [ 13 ] = 
    {
        'H', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '!', '\n', 
    };
    RTC.writeBytesInRam(0x08, 13, data);
}
 
void loop () {
    // Read bytes in RAM.
    uint8_t data[13] = { 0 };
    RTC.readBytesInRam(0x08, 13, data);
     
    // Print bytes on Serial.
    Serial.write(data, 13);
    delay(5000);
}

Il me sort

B:\__Arduino_tests\Tests_ds1307\autre_ram_1307_02.ino\autre_ram_1307_02.ino.ino: In function 'void setup()':
autre_ram_1307_02.ino:20:9: error: 'class RTC_DS1307' has no member named 'writeBytesInRam'
     RTC.writeBytesInRam(0x08, 13, data);
         ^~~~~~~~~~~~~~~
B:\__Arduino_tests\Tests_ds1307\autre_ram_1307_02.ino\autre_ram_1307_02.ino.ino: In function 'void loop()':
autre_ram_1307_02.ino:26:9: error: 'class RTC_DS1307' has no member named 'readBytesInRam'
     RTC.readBytesInRam(0x08, 13, data);
         ^~~~~~~~~~~~~~
Plusieurs bibliothèque trouvées pour "RTClib.h"
Utilisé : C:\Users\Guy\Documents\Arduino\libraries\RTClib
Non utilisé : C:\Users\Guy\Documents\Arduino\libraries\RTClib-1.12.5
exit status 1
'class RTC_DS1307' has no member named 'writeBytesInRam'

C’est manifestement RTC.writeBytesInRam() et RTC.readBytesInRam() qui posent problème mais comment faire pour les faire accepter?

Merci d’avance pour le déblocage espéré.

Ce serait bien de mettre des liens vers les librairies dont tu parles,
Des librairies RTC il y en a à la pelle.

... Ce serait bien de mettre des liens vers les librairies dont tu parles ... 

C’est sûrement un des problèmes.

Je suppose qu’il y a celui-ci pour rtclib.h http://news.jeelabs.org/code/

Les liens qui figurent en haut des sketches ne sont-ils pas suffisants pour les retrouver?

Ma démarche est de chercher par mots clefs. Quand je trouve quelque chose qui semble correspondre à ma recherche, je copie et je teste.

Quand “ça se passe mal”, je tente de comprendre, mais là, je coince.

Edit: le lien semble ne pas être le bon. Il doit y avoir celui-ci
https://www.idreammicro.com/

Question peut être bête : es-tu sûr que la RAM du DS1307 est sauvegardé par la pile de 3,3 V en cas de coupure d’alimentation ?

… es-tu sûr que la RAM du DS1307 est sauvegardé par la pile de 3,3 V en cas de coupure d’alimentation ? …

Il y a une pile, c’est sûr, et la rtc donne bien la bonne heure/date.

voir ici

ou encore ICI

on peut y voir
Le composant DS1307 de Maxim Integrated est une horloge temps réel série s’interfaçant sur un bus I2C. Outre sa fonction première, le DS1307 offre également quelques octets de mémoire vive (RAM) sauvegardés même en cas de coupure de l’alimentation, si toutefois une pile de sauvegarde est présente.

Oui, mais la pile sauvegarde-t-elle aussi la RAM que tu veux utiliser ?

C’est la question que je me pose, peut-être à tord, mais avant de foncer sur un choix de composant il faut s’assurer que l’on en a bien vérifié le fonctionnement.
Surtout que les utilisations de la RAM ne sont pas légion et donc la documentation est un peu faible sur ce point.

C’est juste un doute que j’ai.

DS : " 56-Byte, Battery-Backed, General-Purpose RAM with Unlimited Writes", comme signélé par @dfgh

… ou encore ICI

C’est très précisément ici que j’ai pompé le sketch qui me pose problème.

C’est dès la compilation que le message d’erreur se manifeste. Donc, peu importe que le chip soit présent ou pas.

Pour 68tjs je confirme que “la littérature” mentionne bien que la mémoire est bien conservée, hors tension quand la pile est bien présente.

Bonjour,

Dans le tuto que tu cites, il y a un lien vers la bibliothèque RTClib utilisée (c’est un fork de la librairie d’adafruit). Il faut que tu utilises cette bibliothèque.

veux tu voir si ce fichier compile chez toi ?

ds1307_ram.zip (4,1 Ko)

Merci.

Pour info il existe la DS3232 avec 256 octets de SRAM.
Le CI a la même précision que le DS3231 et est vendu le même prix que le DS3231 par Texas.
Mais on le trouve très rarement à acheter en module et quand on trouve des modules ils sont à des prix exorbitants.
C’est absurde mais c’est la loi de Panurge : un fait un produit, les autres font la même chose, surtout si le choix de départ n’est pas terrible. :rage:

veux tu voir si ce fichier compile chez toi ?

Non seulement il compile mais il affiche bien le message.

Un rapide survol me montre qu’apparemment, c’est le même que le mien avec les mêmes instructions pour lire et écrire. :smiley:

Le zip fait cohabiter le .h et le .ino

Est-ce la particularité qui “oblige” le compilateur à chercher d’abord dans le dossier d’origine qui permet de choisir le bon?

Je pense que oui. Je viens de renommer le .h pour qu’il ne soit plus choisi et ma compilation n’aboutit pas. Cela veut dire qu’il est inutile “d’installer” des bibliothèques exotiques. Il suffit qu’elles soient dans le même dossier.

C’était une question que je m’étais déjà posée, mais les réponses qui m’avaient été faites étaient compliquées.

Merci pour ce déblocage qui va me permettre de progresser dans mon projet.

oui, c’est bien ça, je me suis douté que tu avais ce problème
dans l’onglet du .ino, il faut inclure le librairie avec des " " au lieu des < >
content que ça te débloque

dans l’onglet du .ino, il faut inclure le librairie avec des " " au lieu des < >
content que ça te débloque …

Je viens de pousser l’essai, et je viens de supprimer l’écriture, de débrancher l’application et de relancer. Le monde continue de me saluer.

Bravo pour l’aide et le petit “détail” des guillemets. :heart_eyes:

ce qui confirme que la pile sauvegarde bien la RAM :+1:

En fait un ds1307 a une ram de 64 octets dont les 8 premiers sont utilisés pour le rtc et les 56 derniers dispo, ce qui peut justifier son usage face au ds3231, surtout quand le montage peut faire régulièrement la mise à jour auto de l’heure pour compenser la dérive catastrophique de ce circuit.
Perso je l’ai trouvée hyper pratique pour détecter les coupures d’électricité et déterminer leur durée.
Veiller à stocker une constante ou un crc dans la nvram pour vérifier la consistance des données récupérées au démarrage.

Oui mais la DS1307 est un veau coté dérive et devra être régulièrement remise à l’heure.
C’est bien dommage que l’on ne trouve pas facilement des DS3232 avec 256 octets de RAM que Texas commercialise au même prix que le la DS3231.

HBacheti a proposé une autre solution avec une eeprom et “un prolongement” de l’alim par capa ou pile je ne sais plus trop mais qui laissait le temps d’écrire des données essentielles dans l’eeprom.
Tous les modules RTC (ou quasiment tous) sont livrés avec une eeprom à coté de la RTC.

@68tjs
tu es sur qu’on ne peut pas utilser la 24C32 qui est sur les 3231?
texte sur un site vendeur

Module de mémoire d’horloge de précision en temps réel DS3231 pour Arduino, avec interface IIC, HTR, puce AT24C32, 1 pièce, nouveau, original

il y a aussi des 3232 mais le ci est vendu seul (pas sur platine)

Bien sûr que si on peut, mais ce n’est pas de la RAM c’est de l’eeprom.
L’eeprom n’est faite pour être réécrite en permanence, j’ai toujours considéré qu’avec les RTC l’eeprom devait servir à enregistrer les dates de mises à l’heure.

Et c’est pour cela que je citai l’article d’Henri qui à fait un montage assez astucieux pour qu’en cas de coupure de l’alim il maintient “une alim de secours” le temps d’enregistrer les données importante dans l’eeprom.

Henri tu es Là ?