Utiliser une carde SD pour sauvegarder les variables

Bonjour.

J'ai fait une recherche pour trouver une réponse a ma question mais en vain.

Voici mon problème.

J'utilise une carte arduino NANO pour faire fonctionner un compteur sur une machine mais le HIC c'est que lorsque l'on coupe l'alimentation sur la machine en question, les valeurs enregistrées s'effacent et le compteur repart a zéro.

Y'a t'il un moyen simple d'ajouter une carte SD ou une clé USB pour enregistrer la valeur de la variable et de la récupérer lors de la remise en marche de l'Arduino ?

Merci de votre aide, c'est très appréciés.

et Joyeuses fêtes

Jacques3012

Écrire la variable en EEPROM serait beaucoup plus simple :

https://www.arduino.cc/en/Reference/EEPROM

Par contre l'EEPROM a une durée de vie : 100,000 cycles.

Tu peux jeter un œil ici pour sauvegarder la variable seulement quand on coupe l'alimentation :
arduino-sauvegarde-de-donnees-en-eeprom

WOW un gros MERCI pour votre réponse rapide, j'apprécie

Aux nombres de cycle, je serai bon pour 280 ans car c'est normalement une fois par jour 345 jours par années.

Je m'en vais lire les textes dans les liens que vous m'avez donné mais je vais certainement avoir besoin de votre aide pour avancer dans ce projet car je n'ai pas beaucoup de connaissance en programmation et encore moins avec les EEPROM.

Et oui, ca serai que deux variables seulement a conserver en mémoire, rien de plus.

Je vous reviens rapidement car c'est vraiment intéressant de pouvoir enregistrer des données. Par contre, je ne comprend pas que les concepteurs des Arduino n'ai pas intégré une puce pour enregistrer les variables directement sur le module Arduino. Mais bon, déja que c'est de très bonnes plaquettes, nous devons nous adapter.

Si je comprend bien, c'est une puce externe (IC) que je devrai ajouter ? et si oui, vous avez un numéro de chips a me conseiller que je puisse commencer a regarder ça ? Et un Arduino NANO n'est pas compatible pour ça ?

Merci encore et passez de très joyeuses fêtes hbachetti.

Jacques3012

ar contre, je ne comprend pas que les concepteurs des Arduino n'ai pas intégré une puce pour enregistrer les variables directement sur le module Arduino.

Si. L'EEPROM est intégrée à la puce ATMEGA. difficile de faire plus.

Joyeuses fêtes.

Oups, j'ai écrit en même temps que vous me répondiez.

La puce ATMEGA, elle est déja sur la carte Arduino ? Désolé pour ma question, je débute dans ce domaine. Je suis plus accoutué aux automates.

Merci !

Jacques3012:
Oups, j’ai écrit en même temps que vous me répondiez.

La puce ATMEGA, elle est déja sur la carte Arduino ? Désolé pour ma question, je débute dans ce domaine. Je suis plus accoutué aux automates.

Merci !

Bonsoir
l’atmega c’est le coeur d’une carte arduino (le MCU)
toi tu utilise un arduino nano
c’est donc un atmega328 (le MCU )
et ce MCU embarque une zone EEPROM de 1Kbytes

Ouf ça semble très complexe, la je parle du code. J'ai que deux valeurs a conserver disont T et N que l'on changera que très rarement de valeur mais qui doivent être enregistrés.

Alors, si c'est possible, on enregistre les valeurs qu'en appuyant sur une touche style touche ENTRÉE et on va relire ses valeurs au démarrage de l'Arduino.

C'est possible ça ?

Merci pour votre aide.

Jacques3012

Oui, possible sans problème en mémorisant, sur demande, les valeurs de N et T dans l'EEPROM interne du microcontroleur.
Voir içi l'utilisation de EEPROM.write() et EEPROM.read(), c'est très simple

Voila mon code. Finalement c’est les variables D et N qui doivent être enregistrées.

J’ai un autre petit problème. Lorsque j’incrémente les deux valeurs, lorsque c’est rendu a 10, le maximum que je permet, lorsque je redescend les valeurs en bas de 10, le 0 reste apparent et je ne sais pas comment afficher 9 par exemple car ça affiche 90 et 0 affiche 00.

Et pour la sauvegarde des valeurs, je vais essayer de modifier mon code et je vous reviens avec mes résultats. Ce n’est pas compliqué pour vous les experts mais pour des gens ayant moins de connaissance, c’est pas si facile ;).

Merci pour votre aide, c’est bien apprécié, croyez moi.

Joyeuses fêtes a tous.

#include <EEPROM.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>

LiquidCrystal_I2C lcd(0x27,16,2);

int D=0;
int N=0;

void setup() {

  lcd.begin(16,2);
  
  pinMode(9,INPUT);
  pinMode(10,INPUT);
  pinMode(11,INPUT);
  pinMode(12,INPUT);
  digitalWrite(19,HIGH);
  digitalWrite(10,HIGH);
  digitalWrite(11,HIGH);
  digitalWrite(12,HIGH);
  D=0;
  N=0;
  lcd.clear();
  lcd.backlight();
  lcd.setCursor(0,0);
  lcd.print(D);
  lcd.setCursor(0,1);
  lcd.print(N);
  lcd.clear();
  
}

void loop() {
  lcd.setCursor(0,0);
  lcd.print("Delai:");
  lcd.setCursor(0,1);
  lcd.print("Nombres:");

  if ((digitalRead(11)==HIGH)&& (D>=0) && (D<10))
  {
    D++;
    lcd.setCursor(7,0);
    lcd.print(D);
    delay(250);} 
  
  
  if ((digitalRead(12)==HIGH) && (D>0) && (D<=10))
  { 
    D--;    
    lcd.setCursor(7,0);
    lcd.print(D);
    delay(250);}  

     if (digitalRead(9)==HIGH)
  {
    N++;
    lcd.setCursor(9,1);
    lcd.print(N);
    delay(250);}    
  
  if (digitalRead(10) ==HIGH)
  {
    N--;
    lcd.setCursor(9,1);
    lcd.print(N);
    delay(250);}
  
}

Jacques3012

Bonjour,

Tout simplement tu affiches un espace derrière.
Quand la valeur est supérieure à 10 ça ne sert a rien, quand la valeur est inférieure à 10, ça efface l'éventuel zéro précédent.
Tu peux aussi n'afficher l'espace que si la valeur est inférieure à 10.

Good Merci kamill, ça fonctionne a mon goût.

Reste juste mes variables a enregistrer.

Jacques3012

J'ai beau lire la documentation concernant l'écriture et la lecture sur EEPROM et faire des essais mais je ne comprend rien et ça ne fonctionne pas.

Serait t'il possible de me mettre le code ici pour enregistrer la valeur de N dans EEPROM lorsque j'appui sur un interrupteur branché sur la pin #6 par exemple et de lire cette valeur et la remettre dans la variable N lors de la mise en route de l'Arduino ?

Ça m'aiderai beaucoup parce que je ne suis pas programmeur de micro-contrôleur mais programmeur d'automate Omron a l'occasion et dans les automates, il est très facile de sauvegarder des valeurs dans les Data Memory.

Merci

Jacques3012

Pour utiliser l’EEPROM, il faut d’abord mettre cette ligne dans l’en-tête du code

#include <EEPROM.h>

Ensuite, tu peux lire et écrire des données avec EEPROM.get et EEPROM.put

A la sauvegarde, lors de l’appui sur le bouton (je suppose qu’il est en INPUT_PULLUP donc renvoie LOW lorsqu’il est enfoncé

if (digitalRead (6)==LOW) {
  EEPROM.put(0, N) ;
  delay (20);
 }

Le delay sert à attendre la fin des rebonds du bouton.

Et, dans le setup, la lecture

EEPROM.get (0,N);

Le 0 est l’adresse de lecture / écriture dans l’EEPROM. C’est la première adresse.
À la toute première lecture, comme rien n’aura été sauvegardé, la valeur lue ne sera pas bonne. Il faudra que tu fasses une sauvegarde et que tu relances ton nano.

Merci beaucoup lesept, ça fonctionne a mon goût :).

Quelque questions techniques concernant le EEPROM.

Comme il a une durée d'écriture limitée, si je n'utilise que quelque bits et toujours les mêmes, est ce que tous les bits arrivent en fin de cycle en même temps ?

Et si oui, est-ce que l'Arduino est aussi en fin de vie ou ce n'est que la partie EEPROM qui n'est plus fonctionnel ?

Et comment puis-je visualiser l'ensemble des bits à l'écran en utilisant le moniteur en série ?

Merci encore, ça m'a vraiment aidé a comprendre la partie EEPROM. C'est vraiment mais vraiment apprécié. Car sur certain forum on me disait d'utiliser EEPROM.read et EEPROM.write mais je n'ai rien pu obtenir avec ses fonctions.

Jacques3012

L’EEPROM supporte de l’ordre de 100000 cycles d’ écriture. La fonction put vérifie avant d’écrire que la valeur a changé, et ne réécrit pas si ce n’est pas nécessaire.

Si tu arrives au bout de la durée de vie de l’EEPROM, il est probable que l’arduino reste fonctionnel.

Que veux tu dire par “comment puis-je visualiser l’ensemble des bits à l’écran en utilisant le moniteur en série ?”
Pour connaître la valeur de ta variable N, il suffit d’utiliser

Serial.println (N);

Si tu veux l’afficher en binaire

Serial.println (N, BIN);

Il faut initialiser la liaison série dans le setup, avec

Serial.begin (115200);

Et choisir une vitesse de communication de 115200 dans la console (menu déroulant en bas)

Bonjour lesept.

C'est exactement ce que je demandais. Merci pour les réponses. Le sujet est maintenant réglé.

Jacques3012