Sauvegarder des données sur Arduino Uno

Pour si peu, ce serait dommage d'utiliser la rtclib

const uint8_t adresse_DS1307 = 0x68; //Adresse du DS1307 sur le bus I2C

void ecrireDS1307(uint8_t adresseRAM, uint8_t nb_octets, uint8_t octets[])
{
  Wire.beginTransmission(adresse_DS1307);
  //Le premier octet transmis positionne le pointeur d'adresse interne au DS1307 sur l'adresse désirée
  Wire.write(adresseRAM);
  //Les octets suivants sont écrits dans la RAM du DS1307 à partir de l'adresse précédente
  for (uint8_t i=0; i<nb_octets; i++) Wire.write(octets[i]);
  Wire.endTransmission(); //Tester le code retour de cette fonction pour gérer les erreurs de transmission
}

void lireDS1307(uint8_t adresseRAM, uint8_t nb_octets, uint8_t octets[])
{
  //On positionne le pointeur d'adresse interne au DS1307 sur l'adresse désirée
  Wire.beginTransmission(adresse_DS1307);
  Wire.write(adresseRAM);
  Wire.endTransmission();//Tester le code retour de cette fonction pour gérer les erreurs de transmission
  
  //On lit n octets à partir de là
  if (Wire.requestFrom(adresse_DS1307, nb_octets) == nb_octets)
  {
    for (uint8_t i=0; i<nb_octets; i++) octets[i] = Wire.read();
  }
  else
  {
    //Erreur de transmission
  }
}

Et prendre en compte le fait que :

  1. les adresses RAM 0 à 7 du DS1307 sont réservées au stockage de la date / heure
    Donc ne pas les utiliser pour stocker des données, sous peine de voir leur contenu s'incrémenter "tout seul" :slight_smile:

  2. à vérifier dans le datasheet, mais il est probable que si on tente accidentellement de lire ou d'écrire au-delà de l'adresse 63, on reboucle sur l'adresse 0 et donc sur mon point 1)

  3. la bibliothèque Wire de l'IDE arduino limite la taille des messages I2C à 30 octets. Donc pour lire ou écrire l'intégralité de la RAM du DS1307 il faut s'y prendre à plusieurs fois

bricoleau:
@Jambe : là tu pinailles.

Pas du tout Bricoleau, je me suis posé vraiment la question

Moi j'ai du mal à comprendre votre truc sachant que tous les appareils modernes utilisent ce que j'ai mentionné, à savoir que les boutons marche/arrêt n'agissent pas directement sur la coupure du circuit de puissance, mais commandent une fonction, qui sauvegarde les données et qui ensuite décide de couper le circuit puissance via un relais.

Regardez les smatphones, les ordinateurs, bref, pleins d'appareils du quotidien fonctionnent sur ce principe qui permet la sauvegarde avant l'extinction.

sylvainmahe:
Moi j'ai du mal à comprendre votre truc sachant que tous les appareils modernes utilisent ce que j'ai mentionné, à savoir que les boutons marche/arrêt n'agissent pas directement sur la coupure du circuit de puissance, mais commandent une fonction, qui sauvegarde les données et qui ensuite décide de couper le circuit puissance via un relais.

Regardez les smatphones, les ordinateurs, bref, pleins d'appareils du quotidien fonctionnent sur ce principe qui permet la sauvegarde avant l'extinction.

Dans mon application, il n'y a pas de bouton, simplement une cible en position que l'utilisateur entre sur le PC. La sauvegarde des données permet, en cas de coupure de l'alimentation pendant le cycle, de conserver la dernière position de l'arbre moteur.

Ah d'accord donc la coupure de courant est un événement involontaire dans ton projet, dans ce cas pourquoi ne pas mettre un onduleur? :slight_smile:

Tu peux aussi utiliser un bulldozer pour écraser une mouche.

Ce que je veux dire par là, c'est qu'il faut toujours chercher à adopter la solution la plus simple pour répondre à un besoin donné.
Ici, nous avons quelqu'un qui a un système dont il souhaite sauvegarder l'état (qui pèse 2 octets) toutes les 50 ms.
Ca c'est le besoin
Et pour y répondre, il n'est pas nécessaire de mettre en place des moyens surdimensionnés.

sylvainmahe:
Ah d'accord donc la coupure de courant est un événement involontaire dans ton projet, dans ce cas pourquoi ne pas mettre un onduleur? :slight_smile:

L'onduleur c'est plus adapté quand la coupure est critique pour le système qui en plus laisse "juste" le temps d'arrêter le système proprement si le courant ne revient pas

Du coup j'ai du mal à cerner ton problème, à la fois une batterie de secours n'est pas possible, et à la fois un inter qui permet la sauvegarde avant l'extinction n'est pas possible non plus? :slight_smile:

En aéromodélisme sur les modèles importants on met 2 batteries, une qui sert normalement durant le vol et une autre qui prend le relais en cas de coupure de l'autre, avec indicateur qu'on est sur la batterie de secours..

sylvainmahe:
Du coup j'ai du mal à cerner ton problème, à la fois une batterie de secours n'est pas possible, et à la fois un inter qui permet la sauvegarde avant l'extinction n'est pas possible non plus? :slight_smile:

En aéromodélisme sur les modèles importants on met 2 batteries, une qui sert normalement durant le vol et une autre qui prend le relais en cas de coupure de l'autre, avec indicateur qu'on est sur la batterie de secours..

Comme dit précédemment, mon moteur entraîne une vis. Un encodeur me donne l'angle de rotation effectué par l'arbre moteur. J'aimerai être capable, après redémarrage de l'Arduino, de connaître l'angle de mon arbre moteur. Actuellement, à chaque redémarrage, l'angle de départ correspond à 0, même si auparavant j'ai tourné de x degrés.