Valeur compteur stocker en eeprom

Bonjour a tous,

Mon petit compteur fonctionne desormais parfaitement, mais j'aimerais stocker ce compteur en mémoire eeprom lorsque j'actionne un interrupteur (interrupteur qui arrête le processus) afin de récuperer le compteur au redemarrage du processus même en cas de coupure de l'alimentation.

Une fois le redemarrage aprés coupure de l'alimentation lorsque l'arduino redémarre il irait lire la dernière valeur sauvegardé.

Je bute surtout sur l'adresse où stocker ce compteur...

Et inversement pour aller le relire...

Merci pour votre aide

bonjour,
un peu de lecture

Petit rappel une adresse de l'eeprom est constituer de 8 bits d'information ce qui constitue un nombre ne dépassent pas 255 donc si tu veut un compteur qui va au delà il te faudra décomposer ton nombre en plusieurs fois 8 bits pour ensuite les enregistrés, et a la prochaine lecture les ré-assembler pour obtenir le nombre que tu avais enregistré,

voici un lien qui ma beaucoup aider lors d'un projet similaire au tien << - Arduino Reference.
bonne chance.

Mon nombre va augmenter de 1 jusqu'a 15 000 000 (maximum que je me suis fixé).

En gros je divise le chiffre maximum par 255 pour obtenir le nombre de bits ?

Le probleme c'est que je ne sais pasqu'elle sera la valeur du compteur a un instant T

le nombre de bit doit être fixer dé le départ en fonction du type de variable que tu souhaite manipuler

long 32 bit
int 16 bit /dans le cas de l'Arduino
char 8 bit

Dans le cadre de mon projet j'ai choisi long ( +2 147 483 647)
tu aura besoin décrire deux fonction une pour (dé-assemblage enregistrée) qui recevra ta variable et une pour (assemblage lecture) qui renverra une variable,

il va te falloir utiliser les opérateurs bitshift left et right qui serve retirée des bits ou ajouter des bits
par exemple si tu a le nombre 30 qui vaut en binaire 11110 et que tu utilise les opérateur suivant
11110<< 3 = 11110000 en décimal vaut 240
11110>> 3 = 11 en décimal vaut 3

En résumer les opérateurs te servirons a couper ta variable si tu en fais bonne usage et que tu trouve les bon calcule tu devrais obtenir des tranche de 8 bit qui une fois mi lun a coter de l'autre dans le bonne ordre recréera ta variable d'origine.

Pour les deux fonction je n'ai utiliser que l'opérateur bitshift la soustraction pour le dé-assemblage et l'addiction et l'opérateur bitshift pour l'assemblage.

Si tu compte utiliser l'eeprom interne au micro-controleur sache que le nombre d'écritures garanties est plus faible qu'avec une Eeprom externe.

Si tu veux continuer à utiliser l'Eeprom interne sache qu'il n'y a pas que la librairie Wiring/Arduino dans la vie.
Il faut de temps en temps retourner aux sources : l'avr-libC
http://www.nongnu.org/avr-libc/
et en ce concerne ton besoin
http://www.nongnu.org/avr-libc/user-manual/group__avr__eeprom.html

La librairie Wiring/Arduino ne fait rien de plus qu'appeler une seule des fonctions fournies par Atmel et te cache l’existence des autres qui peuvent te simplifier la vie.

Je n'ai plus qu'une sortie de libre sur la carte Arduino Uno... est-ce que ça suffit pour ajouter une eeprom externe ?

Mais de toute façon, je n'ai que 3 à 5 écritures par jours à faire, même à 50 écritures par semaine, la carte devrait durer 38 ans.

Donc pas de soucis pour écrire dans l'Eeprom interne. J'aimerais de toute façon conserver ma sortie libre pour éventuellement ajouter un voyant.

Avec une seul sortie la seul solution qu'il te reste est l'eeprom interne, et comme tu le dit toi même si peu d'enregistrement reste acceptable.

Bonjour,

Voila de quoi occuper ton dimanche :wink:
http://playground.arduino.cc/Code/EEPROMWriteAnything
http://playground.arduino.cc/Code/EEPROMLoadAndSaveSettings

Et un peu de doc sur le bitwise :

Je vais éplucher ça cette après midi, je vous donnerais le code en fin de journée.

Merci pour vos idées !

Bon j'ai lu relu et éplucher une la plupart des liens qui m'ont été donnés et j'ai pas mal googolé cette après midi.

ça rentre, petit à petit.

Je dois lire la valeur de l'eeprom dans le setup et l'écrire dans le void loop. Je peux donc incrémenter mon compteur avec la fonction compteur ++ (qui actuellement fonctionne parfaitement) et avec la fonction :

EEPROM.write (adresse, compteur);

je suis normalement capable d'écrire la valeur du compteur en mémoire morte afin de pouvoir la relire après extinction puis rallumage de l'arduino.

Tout ce complique avec l'adresse...

Si j'écris EEprom.write (0.compteur);

Et que mon compteur affiché sur l'écran LCD est = à : 520 000, la valeur stockée dans l'Eeprom sera bien 520 000 et non "compteur" ?

Et lorsque je vais redémarré l'Arduino, il ira bien lire à l'adresse "0" la valeur 520 000 ?

Voilà une fois que j'aurais ces précisions je commencerai à coder... mais il me reste encore une ou deux questions... mais j'attends un peu, je ne veux pas vous faire peur :slight_smile:

Merci de m'éclairer.

Une adresse ne dépasse pas 8 bits donc 255 en décimal, du moins avec les fonctions fournit par Arduino,
Pour répondre a ta question si tu enregistre 520 000 (1111110111101000000) tu obtiendra a la lecture 64 (01000000).
Si ta variable ce nomme compteur ce sera ce quelle contiendra qui sera enregistrée et non compteur

Pour ce qui est de la solution avr qui ta été proposer par "68tjs" je ne peux pas te répondre car je programme exclusivement via l'ide de l'Arduino.

Donc la solution n'est pas à regarder du coté de l'Eeprom mais plutôt du coté de la mémoire flash ?

Parce que 520 000 c'est juste un exemple. L'arduino est branché pour contrôler un appareil de production sur lequel on doit intervenir à environ 10 000 000 de cycle pour une grande révision. Faire la révision avant est inutile est couteuse et passer le cap faire encourir des risques.

D'où l'intérêt de compter electroniquement et de prévenir lorsque le compteur arrive au chiffre indiqué. Stocker en Eeprom était donc la solution facile, maintenant en flash peut-être ?

l'eeprom à l'avantage de conserver ce chiffre en mémoire ses donc très pratique pour le consulté même après une panne de courent,
Couper ta variable en 4 comme je te l'ai proposer n'est pas très compliquer pour exemple je peu te montrer mes deux fonctions sauf si tu préfère tenter de le faire par tes propre code ?

A je veux bien si ça ne te gêne pas, car je suis loin d'être un expert....

Je me débrouille au prix de dizaine d'heure de surf....

D'ailleurs quelqu'un connait un bon livre pour programmer en C qui serait utile pour l'arduino ?

Voici les fonctions
Elle ne sont pas optimiser pour tout type d'utilisation à toi de les adapter en fonction de tes besoins

void eeprom_ecriture(long valeur)
{
  long part_1 = valeur >> 8;
  part_1 = part_1 << 8;
  int result_1 = valeur - part_1;
  
  long part_2 = valeur >> (8*2);
  part_2 = part_2 << (8*2);
  int result_2 = (valeur - part_2)>>8;
  
  long part_3 = valeur >> (8*3);
  part_3 = part_3 << (8*3);
  int result_3 = (valeur - part_3)>>16;
  
  long result_4 = valeur >>(8*3);
  
   EEPROM.write(0,result_1);
   EEPROM.write(1,result_2);
   EEPROM.write(2,result_3);
   EEPROM.write(3,result_4);
}

long eeprom_lecture()
{
  long resultat = (EEPROM.read(0) + (EEPROM.read(1)<<8) + (EEPROM.read(2)<<16) + (EEPROM.read(3)<<24));
  
  return resultat;
}

Pour ce qui est de l'apprentissage du c je l'ai apprise sur http://www.siteduzero.com/ ils y'a des années avant même d'avoir un Arduino, je te conseille le c++ car l'orienter objet est très utile dans la conception de librairie pour l'arduino, il existe un tutoriel sur le site exprès rédiger pour les utilisateurs d'arduino, pour ce qui est des livres le site du zero publie des versions livre des tutoriels les plus populaires.

Merci Lacolombenoir !!!

Je vais essayer ça même si ça me parait un peu du chinois...

Edit :

Je viens de télécharger le tuto du language C++ sur le site du zero, je vais le lire, si je vois que ça rentre, je commanderai leur livre.

Je m'aperçois qu'il faut quand même une base de programmation dès l'instant qu'on veut vraiment faire quelque chose de sérieux.

Oui la programmation c'est le seul moyen de communiquer avec une machine,
Le jour ou tout le monde l'aura comprit des topics du genre "comment faire un jeu sans programmer" disparaitrons. XD (je dit pas sa pour toi rassure toi)

Salut je suis revenu car j'ai découvert un moyen plus efficace pour découper une variable, sa ce nomme le "masquage" il requinque l'opérateur ET le principe est explique dans ce tutoriel si sa t'intéresse http://www.siteduzero.com/sciences/tutoriels/arduino-pour-bien-commencer-en-electronique-et-en-programmation/programmons-pour-utiliser-ce-composant.

Merci !!!

Je vais etudier ça ce week-end, j'espère que ce sera la solution ultime !