Ecrire et lire dans ram ds1307

Bonjour j'ai repris le sketch d'exemple trouvé dans la librairie rtc.lib et je voudrais écrire et lire une valeur nommée pluieJour dans la ram de ce ds1307, cette valeur correspond à une hauteur de pluie tombée en un jour (ex 0,27mm) et est déclarée en float.
Je n'arrive pas avec le code modifié voir ci après à retrouver ma valeur, pouvez vous m'aider ?
je précise que je suis débutant et que mon matériel est wemos d1 mini à base d'esp8266.

// Example of using the non-volatile RAM storage on the DS1307.
// You can write up to 56 bytes from address 0 to 55.
// Data will be persisted as long as the DS1307 has battery power.

#include "RTClib.h"

RTC_DS1307 rtc;
float pluieJour = 0.27;


void setup () {
  Serial.begin(115200);
  delay(2000);

#ifndef ESP8266
  while (!Serial); // wait for serial port to connect. Needed for native USB
#endif

  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    Serial.flush();
    while (1) delay(10);
  }


  // Write some bytes to non-volatile RAM storage.
  // NOTE: You can only read and write from addresses 0 to 55 (i.e. 56 byte values).
  Serial.println("Writing NVRAM values.");
  // Example writing one byte at a time:
  rtc.writenvram(0, pluieJour);
  rtc.writenvram(1, 0xED);

  // Read bytes from non-volatile RAM storage.
  Serial.println("Reading NVRAM values:");
  // Example reading one byte at a time.
  Serial.println(rtc.readnvram(0), pluieJour);
  Serial.println(rtc.readnvram(1), HEX);

}

void loop () {
  // Do nothing in the loop.
}

Merci d'avance pour votre aide, bien cordialement
Philippe

Un float fait 4 octets. Je ne connais pas cette bibliothèque et je ne sais pas si les instructions :

rtc.writenvram(0, pluieJour);

Il enregistre ces 4 octets ou les tronque en un seul octet stocké en position 0x00 de la mémoire.
Si cette instruction fait correctement les choses, vous avez les 4 premiers octets de mémoire occupés, puis l'instruction suivante :

 rtc.writenvram(1, 0xED);

Le script précédent vous corrompt, cette instruction devrait être :

 rtc.writenvram(4, 0xED);

Il faut également en tenir compte lors de la lecture de la mémoire.

Extrait de RTClib.h :

  uint8_t readnvram(uint8_t address);
  void readnvram(uint8_t *buf, uint8_t size, uint8_t address);
  void (uint8_t address, uint8_t data);
  void writenvram(uint8_t address, uint8_t *buf, uint8_t size);

Il faut utiliser les méthodes 2 et 4 :

  rtc.writenvram(0, (uint8_t*)&pluieJour, sizeof(pluieJour));
  rtc.writenvram(sizeof(pluieJour), 0xED);

  // Read bytes from non-volatile RAM storage.
  Serial.println("Reading NVRAM values:");
  // Example reading one byte at a time.
  rtc.readnvram((uint8_t*)&pluieJour, sizeof(pluieJour), 0);
  Serial.println(pluieJour);
  Serial.println(rtc.readnvram(sizeof(pluieJour)), HEX);

Pourquoi s'encombrer avec la RAM d'un DS1307 alors que la librairie EEPROM (émulation) existe ?

Merci à tous les deux pour vos réponses rapides et pertinentes.

à quoi sert cette ligne et celle-ci ?

@gonpezzi bien vu pour les 4 octets d'un float :+1:

@hbachetti j'ai essayé de mettre cette valeur pluieJour dans l'eeprom de mon wemos mais il semble que cela buggue car j'ai cette valeur remise à zéro parfois sans raison.
comme je voulais intégrer un ds1307 pour avoir date, heure etc même sans internet, je profite de tester cette nvram pour stocker cette valeur pluieJour et voir si j'aurai le même buggue avec remise à zéro intempestive !
Votre solution fonctionne pour moi, juste une remarque concernant les 2 lignes citées plus haut, sont elles nécessaires ?

En tout cas merci pour votre temps passé à me lire et répondre.

Auparavant tu écrivais 0xED à l'adresse 1.

Maintenant la valeur sera écrite à l'adresse 4, car sizeof(pluieJour) = 4.

Extrait de la datasheet du DS1307

  • 56-Byte, Battery-Backed, General-Purpose RAM with Unlimited Writes

C'est une bonne raison d'utiliser cette possibilité

Effectivement.

Merci à tous pour vos réponses et explications, mon problème est résolu grâce à vous :+1:, bien cordialement Philippe

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.