Partage
  • Partager sur Facebook
  • Partager sur Twitter

problème de division sous arduino

    9 avril 2018 à 15:55:21

    Bonjour, je suis en projet ou je dois programmer un radar pédagogique. J'ai le code suivant : 
    #include <rgb_lcd.h>
    #include <Ultrasonic.h>
    #include <TM1637.h>
    Ultrasonic ultrasonic(7);
    
      int8_t Disp4[] = {0,1,2,3};
      TM1637 tm1637(4,5);
      rgb_lcd lcd;
      
    
    void setup() {
     
      Serial.begin(9600);
        tm1637.set();
        tm1637.init();
        lcd.begin(16,2);
    }
    
    void loop() {
      int d1;
      int d2;
      d1 = ultrasonic.MeasureInCentimeters();
      Serial.println(d1);
      delay(1000);
      d2 = ultrasonic.MeasureInCentimeters();
      Serial.println(d2);
      int V;
      int d;
      int t;
      t = 1000;
      d = d1 - d2;
      V = d/t;
      int A;
      int B;
      int C;
      int D;
      A = V/1000;
      Disp4[0] = A;
      B = (V-(1000*A))/100;
      Disp4[1] = B;
      C = (V-(1000*A)-(100*B))/10;
      Disp4[2] = C;
      D = (V-(1000*A)-(100*B)-(10*C))/1;
      Disp4[3] = D;
      lcd.setCursor(0,0);
      lcd.print(V);
      lcd.print(" Km/h");
    }

    J'ai modifié les variables en les mettant en float etc... mais je ne suis pas parvenu à l'effet esconté. La division de V affiche 0. Quel serait le problème ?

    -
    Edité par Clément Muth 9 avril 2018 à 15:57:13

    • Partager sur Facebook
    • Partager sur Twitter
      9 avril 2018 à 22:22:50

      Bonjour,

      Ligne 32, on effectue en division entière de la distance par 1000ms. La plus petite valeur non nulle 1 = 1000/1000 correspond à une vitesse de 1000cm/1000ms soit 10m/s soit 36km/h.
      1 <=> 36km/h
      2 <=> 72km/h
      3 ...
      Le calcul qui suit décompose V en 4 chiffres. Donc le robot est sensé aller de 36km/h à 360000km/h.

      Pour avoir une vitesse entière en km/h il faudrait plutôt effectuer : V = d * 36 / 1000.

      • Partager sur Facebook
      • Partager sur Twitter

      En recherche d'emploi.

        10 avril 2018 à 20:49:38

        Salut,

        Juste un petit conseil: évite les déclarations séparées des initialisations, même si les initialisations suivent directement les déclarations...

        Regarde ce qu'il y a moyen de faire:

        void loop() {
          int d1 = ultrasonic.MeasureInCentimeters();
          Serial.println(d1);
          delay(1000);
          int d2 = ultrasonic.MeasureInCentimeters();
          Serial.println(d2);
          int t = 1000;
          int d = d1 - d2;
          int V = d/t;
          int A = V/1000;
          Disp4[0] = A;
          int B = (V-(1000*A))/100;
          Disp4[1] = B;
          int C = (V-(1000*A)-(100*B))/10;
          Disp4[2] = C;
          int D = (V-(1000*A)-(100*B)-(10*C))/1;
          Disp4[3] = D;
          lcd.setCursor(0,0);
          lcd.print(V);
          lcd.print(" Km/h");
        }

        Et, d'un seul coup, ta fonction qui faisait 29 ligne, dans laquelle il fallait sans cesse remonter pour s'assurer du type des données (qui, par chance, étaient toutes des int), n'en fait plus que 20, et l'on a sur la même ligne toutes les informations: le type, le nom de la variable, et le calcul effectué...

        Pas mal, non?

        Une autre chose : observe le nom de la fonction de la classe Ultrasonic : elle s'appelle très judicieusement MeasureInCentimeters.

        Pourquoi dis-je que c'est judicieux? parce que je n'ai qu'à lire le nom pour savoir à quoi elle sert: elle me renvoie une mesure exprimée en centimètres.

        Et, à l'extrême limite, je n'ai même pas besoin de savoir à quoi corresponds cette mesure. je sais tout ce qu'il faut savoir au sujet de la mesure: c'est pas des kilos, c'est pas des litres, c'est pas une mesure de courant... ce sont des centimètres.

        Observes maintenant le nom des variables que tu as créées : d1, d2, v, t, d, A, B, C, D. 

        On a, finalement, beaucoup de chance d'avoir les appels à MeasureInCentimeters pour nous permettre de déduire ce à quoi va servir la plupart de ces données, et donc, avoir une chance de comprendre la logique de ta fonction. 

        Mais tu n'imagines pas le temps qu'il m'a fallu pour déduire l'utilité des variables A, B, C et D!!!

        Je ne doute pas que ce soit parfaitement clair pour toi, qui vient d'écrire ce code. Mais, dans trois mois, six mis ou un an, quand tu auras eu l'occasion de faire tant d'autres choses et que tu auras oublié jusqu'à la logique que tu essayais de mettre en place, tu seras exactement dans la même situation que moi, qui ne manque pourtant pas d'expérience!

        Tu dois donc partir du principe que:

        • ton code sera beaucoup plus souvent lu que modifié
        • la personne qui lira ton code n'a a priori aucune idée de ce que tu as bien voulu faire, vu qu'elle n'était pas dans ta tête quand tu as écrit le code
        • tu dois donc tout faire pour l'aider le plus possible à comprendre ton code facilement.

        Nous ne sommes plus au temps où il fallait absolument limiter le nombre de caractères utilisé et cela ne te coute rien (ou si peu !! ) d'appeler d1 distanceDepart, d2 distanceArrivee, d dure et v Vitesse.

        Mais tu n'imagines pas le confort que cela pourrait apporter à celui qui doit lire le code, uniquement parce qu'il saurait directement, à la seule lecture du nom d'une variable, pourquoi cette variable existe, et ce que tu comptes faire avec elle.

        Enfin, tes calculs de A, B, C et D m'ont l'air particulièrement compliqués... n'as tu jamais entendu parler du modulo ?

        -
        Edité par koala01 10 avril 2018 à 20:55:36

        • Partager sur Facebook
        • Partager sur Twitter
        Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
          20 avril 2018 à 19:43:56

          Merci beaucoup de ta réponse qu'il m'en apprend vraiment beaucoup !! et mile excuses pour le retard... Je suis totalement nouveau dans ce domaine, j'ai composé ce code a l'aide de fiches méthodes de mon prof... :) Donc non modulo je ne connais pas mais je vais faire des recherches pour en apprendre plus. En ce qui concerne le code, j'ai modifié ce qu'il fallait en examinant le tous. Pour mon problème, il venait du fait que j'ai mis 1000 millisecones  au lieu de 1... Voila tout bête :lol: Encore merci et bonne soirée.
          • Partager sur Facebook
          • Partager sur Twitter

          problème de division sous arduino

          × 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