Partage
  • Partager sur Facebook
  • Partager sur Twitter

probleme avec tableau

    12 novembre 2018 à 19:14:02

    Bonsoir à tous,

    J'aurai besoin de votre aide pour faire le programme suivant:

    quand le robot se trouve à une distance inférieure a 50 centimètre d'un mur,il met en route 5 moteur ,chacun pendant un temps différent.

    voila ce que j ai fait =

    struct tableauTemps {
      byte numSortie;
      unsigned long debut;
      unsigned long fin;
      byte etat;
    };
    
    tableauTemps dureeMarche[] = {
      {7, 0, 1500, LOW},
      {8, 1500, 10000, LOW},
      {9, 10000, 12500, LOW},
      {10, 12500, 15000, HIGH},
      {11, 15000, 18000ul, HIGH}
      };
    
    const byte nOmbreUniteTableau = sizeof(dureeMarche) / sizeof(dureeMarche[0]);
    
    unsigned long limiteMax;
    
    void setup() {
      Serial.begin(115200);
      for (byte n = 0; n < nOmbreUniteTableau; n++) {
        pinMode(dureeMarche[n].numSortie, OUTPUT);
        
        digitalWrite(dureeMarche[n].numSortie, dureeMarche[n].etat);
      }
    
      limiteMax = 1000; // on fait comme si on est descendu  en dessous de 50cm à cet instant précis
    }
    
    void loop()
    {
     }

     Mais , je ne vois pas comment faire dans la loop! c'est parce que je suis débutant,je pense, car je vois que c'est un peu la base.

    Merci pour me permettre de terminer ce code.

    Jean

    • Partager sur Facebook
    • Partager sur Twitter
      12 novembre 2018 à 19:41:50

      Le problème, c'est que pour "terminer" ce code, il faut le reprendre sur des bases différentes.

      J'imagine que, comme débutant, tu penses à la question sous la forme     

      allumer le moteur
      delay(un certain temps)
      éteindre le moteur

      fortement inspirée de la diode qui clignote, et évidemment, quand il y en a 5 avec des délais différents, c'est un peu le bazar. D'où la difficulté. L'exemple de la diode qui clignote avec un delay() pousse dans une mauvaise direction. Très difficile de piloter plusieurs dispositifs en s'y prenant comme ça.

      -----

      Changeons de point de vue :

      • on allume le moteur, et on note qu'il faudra l'éteindre à telle heure
      • quand l'heure d'éteindre est atteinte : on l'arrête.

      et on ne fait jamais de delay().

      J'explique avec un moteur. Pour faire ça,il nous faut deux variables

      • une (booleen) qui dit si le moteur tourne
      • une qui dit - dans le cas où le moteur tourne, à quelle heure il faut l'arrêter.

      Pour les histoires d'heures, on se base sur la fonction millis() - de type unsigned long - , qui dit "l'heure qu'il est".

      Dans la boucle : on regarde l'heure qu'il est, si si c'est l'heure, on arrete le moteur;

      bool moteur_en_marche = false;
      unsigned long heure_arret_moteur;
      
      
      
      void loop() {
      
          if (moteur_en_marche && millis() >= heure_arret_moteur) {
                  allumer_moteur();
                  moteur_en_marche = false;
           }
           ....
      }
      


      Quand on veut lancer le moteur, on fait

      eteindre_moteur();
      moteur_en_marche = true;
      heure_arret_moteur = millis() + 10000;   // 10 secondes plus tard
      

      Ca se généralise facilement à un tableau de moteurs, avec un tableau de booleens et un tableau de temps.

      -
      Edité par michelbillaud 12 novembre 2018 à 19:45:10

      • Partager sur Facebook
      • Partager sur Twitter
        12 novembre 2018 à 20:09:37

        Michelbillaud,

        Merci pour ta réponse,

        Je comprend très bien ton système,  mais  quand tu dis " Ca se généralise facilement à un tableau de moteurs, avec un tableau de booleens et un tableau de temps. " alors,là, je suis un peu perdu, déjà que j'ai eu beaucoup de mal a faire un tableau, en faire trois et les intriqués, j'y arriverai pas ....

        Peux tu m'aider? (si c'est pas possible,c'est pas grave, je te remercie quand même pur ton message )

        D'avance un grand merci .

        Jean

        • Partager sur Facebook
        • Partager sur Twitter
          13 novembre 2018 à 11:26:17

          On passe de

          bool moteur_en_marche;
          unsigned long heure_arret_moteur;
           
           
           
          void loop() {
           
              if (moteur_en_marche && millis() >= heure_arret_moteur) {
                      allumer_moteur();
                      moteur_en_marche = false;
               }
               ....
          }

          à

          bool moteur_en_marche[5];
          unsigned long heure_arret_moteur[5];
           
           
          void loop() {
           
           for(int m = 0; m < 5; m++) { 
              if (moteur_en_marche[m] && millis() >= heure_arret_moteur[m]) {
                      allumer_moteur(m);
                      moteur_en_marche[m] = false;
               }
               ....
          }

          Ou alors

          struct EtatMoteur {
              bool en_marche;
              unsigned long heure_arret;
          };
          
          EtatMoteur etats[5];
          
          void loop() {
            for (int m = 0; m < 5; m++) {
              if (etats[m].en_marche 
                  && millis() >= etats[m].heure_arret) {
                     ...
              }
            }
          ...


          Mieux : utiliser une classe et des fonctions membres pour regrouper ce qui concerne un moteur. Mais bon...





          -
          Edité par michelbillaud 13 novembre 2018 à 11:32:55

          • Partager sur Facebook
          • Partager sur Twitter
            13 novembre 2018 à 22:46:28

            Bonsoir michelbillaud,

            Merci beaucoup pour tous ces renseignements , et surtout pour le temps que vous avez passer à vous occuper de mon problème.

            Il est tard, aussi je regarderai cela en détail demain , et me permettrai de revenir vers vous en cas de difficulté ( ce qui pourrais bien arriver ...LOL )

            Bonne nuit

            Jean

            • Partager sur Facebook
            • Partager sur Twitter

            probleme avec tableau

            × 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