Stockage de données dans la mémoire EEPROM

Bonjour a tous,

J'ai fait un code pour compter des impulsions lumineuses, et j'aimerai stocker la valeur de mon compteur a chaque fois(pour avoir la valeur de mon compteur stocker en ça de coupure).
Puis j'aimerai que le comptage continue a partie de la valeur stockée

You need to hang some numbers (frequency, number of pulses) on that spec to be of any use.

Be aware that EEPROM has limited life concerning erase/write cycles.

1 Like

Int compteur = 0;

Void Setup {
Serial.begin(9600)
}

Void Loop{

Int IMP = analogRead(A0);

if (IMP>200){
compteur++;
}

}

here is a snippet of my code. I would like to store the counter value every time. and I would like that when my arduino board turns off and on again the counting continues from the last stored value

Bonjour,

Avec ce code ton compteur va s'incrémenter environ toutes les 50µs quand la lumière sera éclairée et si tu stockes ton compteur en eeprom celle ci sera morte en 5 secondes.

Le compteur ne s'incrémente que lorsque la valeur analogique A0 est >200.
En réalité mon code complet permet de comptabiliser des impulsions lumineuses. Il peut ce passer 1 à 2min voir même des heures entre 2 impulsions.

Quand ma carte s'éteind, le comptage recommence a 0; j'aimerai stocker la valeur au furet à mesure, comme ça quand ma carte ce OFF puis ce ON elle s' incrémente a partir de la dernière valeur stockée

100µs

Il s'incrémente tant que la valeur est >200. Donc tu ne comptes pas le nombre d'impulsions mais n'importe quoi (dépendant de la durée des impulsions).

50µs c'est une estimation "à la louche" de la durée de la boucle. Si c'est 100µs le problème est le même.

Int compteur = 0;

Void Setup {
Serial.begin(9600)
}

Void Loop{

Int IMP = analogRead(A0);

if (IMP>200){
compteur++;
delay(1000);
}

}

L'impulsion dure moins d'une seconde
J'ai oublier le delay désolé.

analogRead(A0) == 100µs+ :wink:

The counter only increments when the analog value A0 is >200.
In fact, my complete code allows you to count light pulses. It can spend 1 to 2 minutes or even hours between 2 pulses.
When my card turns off, the count starts again at 0; I would like to store the value as I go, like this when my card this OFF then this ON again it increments from the last stored value

C'est une (très) mauvaise méthode pour compter le nombre d'impulsions. Mais passons, le problème n'est pas là.
Il suffit d'enregistrer le compteur dans l'eeprom à chaque fois qu'il change et de relire l'eeprom dans le setup.

#include <EEPROM.h>

unsigned compteur;

const unsigned adEeprom=0;

void setup() {
  Serial.begin(9600);
  EEPROM.get(adEeprom,compteur);
}

void loop(){
  int IMP = analogRead(A0);

  if (IMP > 200) {
    compteur++;
    EEPROM.put(adEeprom,compteur);
    delay(1000);
  }
}

Il faudra prévoir une procédure pour initialiser la valeur dans l'eeprom à 0.

Pour protéger l’eeprom contre des écritures trop fréquentes, lisez ce tuto

Quelle méthode pouvez vous me suggèrer s'il vous plait?

Merci!

Soit tu fais un petit programme pour initialiser l'eeprom et tu l'exécutes une fois (tu peux aussi le mettre dans la programme principal puis mettre l'instruction en commentaire avant de recharger le programme)..
Soit tu prévoies un bouton qui va lancer une remise à zéro du compteur.

L’usage d’un mot magique est un grand classique pour savoir si la mémoire a été initialisée

Comme l'a suggéré J-M-L au #13, sauvegarder une variable en EEPROM n'a pas d'utilité tant que le logiciel tourne normalement. En cas de coupure d'alimentation, par contre, la valeur serait perdue sans sauvegarde.
Mon article t'aidera à faire les calculs de durée de sauvegarde (elle devrait être très courte pour un seul compteur), afin de dimensionner un condensateur :

La valeur calculée est une valeur minimale, il n'y a pas d'inconvénient à l'augmenter.
Bien entendu, cette sauvegarde n'a pas d'effet en cas de RESET.

La relecture de ton article m'a fait penser à une proposition de modification de schéma.
Si on prend un régulateur dit "ajustable", c’est-à-dire que le pont diviseur qui fixe la tension de sortie est extérieur au circuit intégré, il est possible de déporter la prise d'information de tension directement sur la charge, et ainsi d'avoir réellement 5 V régulés et constant sur la charge.

La tension à appliquer sur ADJ se trouve dans la datasheet du régulateur, elle est souvent de 1,25 V.

Le "drop out" minimal est maintenant celui du régulateur augmenté de la tension Vd. Donc si une diode quelconque est possible, le faible VD des schottky reste un avantage.