Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Arduino] Compter de 0 à 99

avec 2 afficheurs 7 segments et décodeurs BCD

    22 février 2013 à 20:22:39

    Bonjour,

    j'ai connecté à une arduino deux décodeurs BCD gérant chacun un afficheur 7 segments.
    J'ai voulu écrire un petit code pour vérifier le bon fonctionnement du système et tester une fonction qui doit gérer l'affichage lorsqu'on lui envoie un nombre.

    Elle est ici limitée par la condition du début aux nombres entre 0 et 99 mais a été écrite pour qu'elle puisse facilement s'adapter à un autre montage qui aura éventuellement plus d'afficheurs.

    Voilà le code, je suppose que vous aurez compris ce que je cherche à faire dans la fonction loop ^^

    int seg[2][4] = {{34, 35, 36, 37}, {38, 39, 40, 41}};
    
    
    void setup()
    {  
      for (int i(2); i < 42; i++) 
        pinMode(i, OUTPUT);
    }
    
    void loop()
    {
      
      for (int i(0); i < 100; i++)
      {
         aff(i);
         delay(500);
      }
    
    }
    
    void nAff()
    {
      for (int i(seg[0][0]); i < seg[1][3]+1; i++)
        digitalWrite(i, HIGH);  
    }
    
    void aff0()
    {
      for (int i(seg[0][0]); i < seg[1][3]+1; i++)
        digitalWrite(i, LOW);    
    }
    
    void aff(int nb)
    {
      
      int i = 0;
      aff0();
      
      if (nb > 99 || !nb)
        return;
      
      while (nb)
      {
        int ch = (nb % p(10, i+1)) / p(10, i);
        const int cpyC = ch * p(10, i);
        
        for (int j(3); j > -1; j--)
        {
          if (ch >= p(2, j))
          {
            ch -= p(2, j);
            digitalWrite(seg[i][j], HIGH);
    
          }
    
        }
        
        nb -= cpyC;
        i++;
          
      }  
    }
    
    int p(int n, int e) // bien qu'il y ait une fonction pow avec arduino...
    {
        if (!e)
          return 1;
          
        for (int i(1); i < e; i++)
          n *= n;
          
         return n;   
    }

     Ce que l'on lit :

    00

    01

    02

    03

    04

    05

    06

    07

    07

    07

    10

    11

    12

    13

    14

    15

    16

    17

    17

    17

    20

    21

    22

    23

    24

    25

    26

    27

    27

    27

    30

    31

    32

    33

    34

    35

    36

    37

    37

    37

    40

    41

    42

    43

    44

    45

    46

    47

    47

    47

    50

    51

    52

    53

    54

    55

    56

    57

    57

    57

    60

    61

    62

    63

    64

    65

    66

    67

    67

    67

    70

    71

    72

    73

    74

    75

    76

    77

    77

    77

    70

    71

    72

    73

    74

    75

    76

    77

    77

    77

    70

    71

    72

    73

    74

    75

    76

    77

    77

    77

    ... Je ne comprends pas du tout ce qui se passe.

    Merci d'avance,
    Soaocohoa 

    • Partager sur Facebook
    • Partager sur Twitter
      22 février 2013 à 22:12:23

       Personnellement j'ai du mal à rentrer dans ton code, tu n'explique pas ton algorithme et j'ai pas envie de perdre 30 min à le comprendre surtout vis-à-vis de ton montage.

      Sur la forme :

      - Des fonctions qui s'appellent "p", tu commences bien... on met des noms compréhensibles qui décrivent ce que fait la fonction, c'est plus facile pour relire le code que de passer 5 min à rechercher à quoi sert p.

      Pareil pour aff0 et nAff, ca ne coûte rien de les appeler Aff_reset ou Aff_zero et Aff_number. 

      D'ailleurs ton aff0 ne sert à rien, tu peux gérer normalement le cas du "reset" ou du zéro dans ta fonction principale via un passage d'argument.

      - Le return, on ne le place pas au milieu de la fonction, sinon tu va plus t'en sortir quand tu aura besoin de mettre 50 return dans ta fonction. Dans ton cas tu as un if, bah tu met juste un else et il n'y aura aucun code dans le if, mais le programme zappera le while et ira à la fin de la fonction.

      Pour t'aider :

      As-tu fais tourner ton code à la main ? Ton algo est relativement petit donc avec une feuille de papier et un crayon c'est facile de savoir ce qu'il fait (et c'est plus rapide que d'utiliser un débugger ou autre pour connaître l'état des variables, nénamoins cela peut être fait dans un deuxième temps). 

      Car tu verra probablement d'où vient ton erreur, surtout que des erreurs de répétitions c'est souvent des problèmes de conditions dans une boucle.

      -
      Edité par zeqL 22 février 2013 à 22:14:48

      • Partager sur Facebook
      • Partager sur Twitter
        23 février 2013 à 13:52:18

        Merci.
        Toutefois, il me semblait que le code suivant était facilement compréhensible :

          for (int i(0); i < 100; i++)
          {
             aff(i);
             delay(500);
          }

        De même pour celui de la fonction p() :

        int p(int n, int e) // bien qu'il y ait une fonction pow avec arduino...
        {
            if (!e)
              return 1;
               
            for (int i(1); i < e; i++)
              n *= n;
               
             return n;  
        }

        D'autant plus que le commentaire précisait que la fonction a plus ou moins le même rôle que la fonction pow().
        Oui, j'ai déjà essayé d'exécuter le code « à la main », sans rien trouver.

        Une solution?

        Merci d'avance,
        Soaocohoa 

        • Partager sur Facebook
        • Partager sur Twitter
          23 février 2013 à 14:36:07

          Résolu :

          int p(int n, int e) // bien qu'il y ait une fonction pow avec arduino...
          {
              const int cpyN = n;
              
              if (!e)
                return 1;
                
              for (int i(1); i < e; i++)
                n *= cpyN;
                
               return n;   
          }

          C'est mieux comme cela!

          • Partager sur Facebook
          • Partager sur Twitter
            23 février 2013 à 15:47:34

            Ça peut paraître fou mais tout ton algorithme peux être réécrit en 2 lignes exactement en utilisant les registres d'entrées/sorties.
            • Partager sur Facebook
            • Partager sur Twitter

            [Arduino] Compter de 0 à 99

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown