Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

Gestion de bouton pour un compteur


Sujet :

Arduino

  1. #1
    Nouveau Candidat au Club
    Gestion de bouton pour un compteur
    Bonjour,
    Je débute et j'essaye de faire un programme qui compte a chaque appui sur un bouton et qui affiche la valeur sur un afficheur LED 7 segments.

    Le problème étant que je n'arrive pas à compter les impulsions du bouton pour afficher la valeur ensuite.

    Voici ce que j'ai fait pour le moment mais je pense que mon branchement de bouton n'est pas correct.

    https://www.tinkercad.com/things/iJ7...C2fQs-compteur

    Merci de votre aide

  2. #2
    Membre éprouvé
    Bonjour Bouvmax

    Ton lien n'est pas accessible, mets ton code sur ce forum, entre balises.

    Cordialement
    jpbbricole
    L'expérience est la seule chose qu'il ne faut acheter que d'occasion!

  3. #3
    Nouveau Candidat au Club
    J'ai réussi a faire mon compteur avec mon bouton mais maintenant je voudrais qu'il garde en mémoire la derniere valeur de mon compteur quand je le met hors tension et qu'il y recommence quand je le rallume.
    J'ai pu voir qu'il fallait utiliser EEPROM mais je comprends pas son fonctionnement.
    Merci de votre aide

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    #include <SevSeg.h> 
    #include <EEPROM.h>
     
    //Afficheur 7 segments
    const byte numDigits = 4; // Nombre de digits de l'afficheur 7 segments, ici il y en a 4 ( on utilise un afficheur référencé SH5461AS )
    const byte digitPins[] = {13, 10, 9, A5};  
    const byte segmentPins[] = {12, 8, A3, A1, A0, 11, A4, A2}; // Branchements des broches controlant les segments
    SevSeg sevseg;                                 // On declare sevseg comme l'afficheur
    int bouton = 2;
    int compteur;
    static int etatprec = HIGH;
     
     
    void setup() 
     {                                
      sevseg.begin(COMMON_CATHODE, numDigits, digitPins, segmentPins); //On initialise l'afficheur 7 Segments
      sevseg.setBrightness(-10);      //On regle l'intensite
      pinMode(bouton, INPUT_PULLUP); 
     }
     
    void loop()
    {     
     
     
      int etat= digitalRead(2); //Lecture de l'etat du pin 2
      if (etat == HIGH && etatprec==LOW) //detection d'appui haut/bas
      {
        compteur++; // Incrementation d'une valeur au compteur
      }
      etatprec=etat;
     
      sevseg.setNumber(compteur,4); //Aficher le compteur
      sevseg.refreshDisplay();
     
      if(compteur>9999)
      {
      compteur=0;
      compteur = compteur;
      }

  4. #4
    Membre éprouvé
    Bonjour Bouvmax

    Une excellente adresse pour étudier l'EEPROM.

    Cordialement
    jpbbricole
    L'expérience est la seule chose qu'il ne faut acheter que d'occasion!

  5. #5
    Nouveau Candidat au Club
    Super merci, je pilote ça avec un Arduino nano est ce que je risque pas de tuer ma mémoire trop rapidement?

  6. #6
    Membre éprouvé
    Bonsoir Bouvmax

    Citation Envoyé par Bouvmax Voir le message
    Super merci, je pilote ça avec un Arduino nano est ce que je risque pas de tuer ma mémoire trop rapidement?
    On peut économiser les écritures en employant la fonction

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    EEPROM.update qui écrit seulement quand la valeur à écrire change par rapport à la valeur actuelle dans le cellule mémoire
    à la place de
    EEPROM.write qui écrit systématiquement.


    On peut écrire ou effacer environ 100'000 fois avant que l'EEPROM devient instable, il y a quand même de quoi voire venir

    Cordialement
    jpbbricole
    L'expérience est la seule chose qu'il ne faut acheter que d'occasion!

  7. #7
    Membre éprouvé
    Si vraiment vous avez peur d’user votre eeprom vous pouvez toujours rajouter un condensateur et petit circuit de détection de perte d’alimentation et sauver en eeprom en profitant de l’alim par le Condo. Comme cela vous n'écrivez En EEPROM que quand c’est nécessaire

    Voici un bon article sur le sujet

    Mais bon comme le dit JPBricole, 100.000 sauvegardes, même à chaque appui du bouton ça laisse le temps...

  8. #8
    Membre éclairé
    Bonjour,

    Il y a un peu de nettoyage de code à faire (par exemple : compteur = compteur) et d'optimisations (c'est maladif).

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void loop()
    {     
       int etat= digitalRead(2); //Lecture de l'etat du pin 2
       if (etat > etatprec)  // Détection d'appui haut/bas - HIGH > LOW car HIGH == 1 et LOW == 0
       {
          if(compteur < 9999) ++compteur; else compteur = 0;   // Incrémentation du compteur - retour à 0000 avant affichage
          sevseg.setNumber(compteur,4);    // Afficher le compteur - déclarer static int etatprec = -1; et compteur = -1; pour forcer l'affichage du 0000 au début
          sevseg.refreshDisplay();
       }
      etatprec=etat;
    }


    Le travail d'optimisation, même si le fonctionnement ne le nécessite pas ici, est toujours intéressant car il oblige à une compréhension fine de ce que l'on veut exactement et du comportement du micro-contrôleur.

    Salutations
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)