Page 1 sur 1

While or not while ?

Posté : 11 oct. 2021, 18:13
par likiki
Voici Un truc que je ne m'explique pas.

Dans le code qui suit, j'arrive sur ma boucle while, l'affichage sur l'écran est bien exécuté (je suis donc bien dans ma boucle while) mais le reste ... non et le programme reste planté là, même en cas de changement de l'état d'"Inter".

Là, j'avoue que je sèche dessus depuis 2 jours.

Si l'un d'entre vous a une idée, je suis preneur.

N'hésitez pas a poser des questions.

Code : Tout sélectionner


while (Inter == HIGH){
  
    lcd.setCursor (0,0);
    lcd.print ("Position plateau"); 
    delay(10);
    lcd.setCursor(0,1);         // place le curseur ligne suivante
    lcd.print (plateau);
    lcd.print ("            ");
    delay (40);

if (BPMO == HIGH){
  
  delay(500);
  
  stepper.setSpeed(10);
  stepper.step(1);
  plateau = plateau + 1;
  
}

if (BPDE == HIGH){
  
  delay(500);
  
  stepper.setSpeed(10);
  stepper.step(-1);
  plateau = plateau -1;
  
}

}

.


:kingmoi:

Re: While or not while ?

Posté : 11 oct. 2021, 20:20
par herwat
:hhhaaaa: :hhhaaaa: :hhhaaaa:

ça fait plaisir ! je ne suis pas le seul à avoir ce genre de problème ! ! ! L'ordi a même failli passer par la fenêtre plus d'une fois, même s'il n'y est pour rien, le pauvre . . . .

J'ai souvent eu des problèmes avec les identités et je n'ai jamais compris pourquoi .

Dans ton cas , tu écrit : while (Inter == HIGH) { en fait, while (Inter ) { suffit .
Même chose pour if (BPMO ){ au lieu de if (BPMO == HIGH){

Par contre dans la boucle while, on a jamais Inter = LOW . Donc, c'est normal que le programme ne sorte jamais de la boucle . . . .
Il faut savoir que le moteur ne bouge que lorsque le programme passe sur la fonction run() et il ne bouge que d'un pas ; donc cette fonction doit être dans une boucle .

J'espère t'avoir été utile . En tout cas n'hésite pas à poser d'autre question .

Re: While or not while ?

Posté : 11 oct. 2021, 20:34
par likiki
:hhhaaaa: bienvenue au club des jeteur de pc par la fenêtre. :hhhaaaa:

Le propre de la boucle while() est :

Tant que la condition entre (), "Inter == High" dans mon cas, est VRAIS, la boucle continue. Dès que la condition est FAUX (Inter == LOW) la boucle stop.

Mais là non.

Ou alors je n'ai rien compris a la boucle while. :lollol:


Je viens de lire (sur le net) qu'il faudrait écrire : while (digitalRead(Inter) == HIGH). Je vais tester cela (sans grande conviction). :mdr3:

herwat a écrit : 11 oct. 2021, 20:20
Dans ton cas , tu écrit : while (Inter == HIGH) { en fait, while (Inter ) { suffit .
Même chose pour if (BPMO ){ au lieu de if (BPMO == HIGH){

Par contre dans la boucle while, on a jamais Inter = LOW . Donc, c'est normal que le programme ne sorte jamais de la boucle . . . .
Il faut savoir que le moteur ne bouge que lorsque le programme passe sur la fonction run() et il ne bouge que d'un pas ; donc cette fonction doit être dans une boucle .

J'espère t'avoir été utile . En tout cas n'hésite pas à poser d'autre question .
Pour toi "while (inter)" = "while(Inter == HIGH)". Comment sait-il que je veux la condition "HIGH" et non pas "LOW" ?

A moins que ce ne soit la condition par défaut, en ce cas OK. Mais je n'ai lue ça nul part.

Je sent que je vais me coucher moins bête ce soir.

:siffle:

Re: While or not while ?

Posté : 11 oct. 2021, 21:07
par herwat
likiki a écrit : 11 oct. 2021, 20:34

Je viens de lire (sur le net) qu'il faudrait écrire : while (digitalRead(Inter) == HIGH). Je vais tester cela (sans grande conviction). :mdr3:


:siffle:
Ah ben oui, Si Inter est une entrée, il faut effectivement la lire .

Sinon, Dans une condition, "Inter" équivaut à "Inter == High" et "!Inter" équivaut à "Inter == LOW" .
likiki a écrit : 11 oct. 2021, 20:34
Je sent que je vais me coucher moins bête ce soir.

:siffle:

ça, c'est toi qui le dit ! :hhhaaaa: :hhhaaaa: :hhhaaaa:

Re: While or not while ?

Posté : 11 oct. 2021, 23:36
par herwat
Bon, je m'explique .

Prenons l'expression : "!Inter" équivaut à "Inter == LOW" . Et supposons que Inter = LOW .
L'identité "Inter == LOW" est donc VRAI . Ok ? Bon .
Le "!" devant Inter signifie que l'expression : "!Inter" est le contraire de Inter . Donc, dans le cas présent, "!Inter" est donc VRAI, puisque Inter est LOW .
Les deux propositions "!Inter" et "Inter == LOW" sont donc équivalentes . CQFD
En résumé, si c'est FAUX, c'est que c'est VRAI . . . . :3:

Bon, il est temps de prendre un Doliprane et d'aller se coucher ! :hhhaaaa:

Mais j'adore ces subtilités de programmation que j'ai découvert au fur et à mesure et qui font parfois éviter des lignes de programme .

L'opérateur "ou exclusif " qui s'écrit " ^ " est très intéressant aussi . Mais je m'emporte ! Allez, dodo . . .

Re: While or not while ?

Posté : 12 oct. 2021, 04:49
par likiki
Oui, tu a raison.

Je viens de me réveiller, mais après un tel post, je retourne me coucher.

:hhhaaaa:

:sivousme:

Re: While or not while ?

Posté : 12 oct. 2021, 04:57
par Pirlouit95
Moi j'ai rien compris.
Que vient faire l'inter de Milan dans ce jeu de quilles?

:sivousme:

Re: While or not while ?

Posté : 12 oct. 2021, 09:07
par Papy2568
:hhhaaaa: :hhhaaaa:

Re: While or not while ?

Posté : 12 oct. 2021, 09:09
par herwat
:mdrmdr:

Re: While or not while ?

Posté : 13 oct. 2021, 19:03
par likiki
Il semblerais que dans une boucle "While" ou "do ... while", les bouche "if" ou "if ... else" ne fonctionnent pas.

Pourquoi, mystère (et boule de gomme). :siffle:

Avec ça, je ne suis pas verni.

Il me reste "une" solution (avant de faire comme Hervé ==> Image ) :mdr1:


Une fonction magique.

:a_suivre:

Re: While or not while ?

Posté : 13 oct. 2021, 20:18
par herwat
Si si si, ça fonctionne !

Pour exemple, je te met ci dessous ma fonction de sélection de voie qui marche sans soucis

Code : Tout sélectionner

    void SelecVoie() {               // Sélection et choix d'une voie

             Alim_Led () ;
             Confirm = false ;
             mem = false ;
             Voie =  VoieSel ;
             do
                 {
                  if (!Veille && millis() - TempsZero > 6000 )
                        { Veille = true ;
                          if( Voie != VoieSel ){ digitalWrite(pinLed [Voie],LOW); }
                        }
                  act = false ;
                  VoieInt = Voie ;
                  if (!act && digitalRead(PinBPplus))         // Bouton montée actionné
                                        { Voie = Voie + 1 ; act = true ; }                                                 
                  if (!act && digitalRead(PinBPmoins))        // Bouton descente actionné
                                        { Voie = Voie -1 ; act = true ; }                       
                  if (!Confirm && digitalRead(PinBPConf))     // Bouton de confirmation actionné
                                        { Confirm = true ; }
                  if (!mem && digitalRead(PinBPajustmem))     // Bouton d'ajustement actionné
                                        { mem = true ; }
                  if (act)
                            {
                            if ( Voie < 0 ) { Voie = 0; }
                            if ( Voie > 10 ) { Voie = 10; }

                            TempsZero = millis() ;
                            Veille = false ;
                            affichage (3) ;
                            digitalWrite(pinLed [Voie], HIGH);
                            if( VoieInt != VoieSel ){ digitalWrite(pinLed [VoieInt], LOW); }
                            delay (400) ;
                            }
                 }
            while ( !mem && !Confirm && !Veille ) ;
                  
            if ( Confirm ) {VoieAnc = VoieSel ;
                            VoieSel = Voie ;
                            digitalWrite(pinLed [VoieSel], HIGH);
                            digitalWrite(pinLed [VoieAnc], LOW);
                            Mvt = true ;
                            delay (400) ; }
                            
            if ( mem ) { Ajustement () ; }

    }
C'est le programmeur qui fonctionne mal ! :hhhaaaa: :hhhaaaa: :hhhaaaa:
L'ordi n'y est pour rien . :D :D :D épargne le, le pauvre . . .

Sérieusement, La définition des variables, tu les trouvera ici

Re: While or not while ?

Posté : 13 oct. 2021, 20:34
par herwat
L'exemple ci-dessous me parait plus adapté pour ton problème

Code : Tout sélectionner

void Ajustement ()
     {
      Niveaumod = NiveauVoie [VoieSel] ;
      Confirm = false ;
      Verrouillage( false ) ;
      digitalWrite(pinDriverHT,LOW);
      affichage (7) ;
      do
                 {
                  act = false ;
                  if (!act && digitalRead(PinBPplus))         // Bouton montée actionné
                                        { Niveaumod = Niveaumod + 32 ; act = true ; }                                                 
                  if (!act && digitalRead(PinBPmoins))        // Bouton descente actionné
                                        { Niveaumod = Niveaumod -32 ; act = true ; }                       
                  if (!Confirm && digitalRead(PinBPConf))     // Bouton de mémorisation actionné
                                        { Confirm = true ; }
                  
                  if (act)
                            {
                            Moteur1.moveTo(Niveaumod);
                            affichage (7) ;
                            ini = true ; 
                            while (ini) {
                            Moteur1.run();
                            if ( !Moteur1.run() ){ ini = false ; }
                                        }
                            delay (400) ;
                            }
                 }
            while ( !Confirm ) ;
            
            if ( Confirm ) {
                            digitalWrite(pinDriverHT,HIGH);
                            NiveauVoie [VoieSel] = Niveaumod ;
                            EEPROM.put(VoieSel*4+2, NiveauVoie [VoieSel]);
                            affichage (8) ;
                            delay (2000) ;
                           }

     }

Re: While or not while ?

Posté : 14 oct. 2021, 17:13
par likiki
Effectivement, cela fonctionne.

J'ai inséré une variable de contrôle (z) et effectivement les boucle sont bien lue et exécutées correctement.

Code : Tout sélectionner

//
//--------------------------- Mise a quai descente ---------------------------------
//

void Maqd(){


if (BPDE == HIGH){
  
            delay(500);
  
            stepper.setSpeed(10);
            stepper.step(-1);
            plateau = plateau -1;
            z --;
 
            }
  
}



//
//--------------------------- Mise a quai montée ---------------------------------
//

void Maqm(){

if (BPMO == HIGH){
  
            delay(500);
  
            stepper.setSpeed(10);
            stepper.step(1);
            plateau = plateau + 1;
            z --;
 
            }
  
}



//
//--------------------------- Mise a quai manuel ---------------------------------
//


void Apprentissage(){           // Module apprentissage

Pinter = 1;


do {

  
    lcd.setCursor (0,0);
    lcd.print ("Position plateau"); 
    delay(10);
    lcd.setCursor(0,1);         // place le curseur ligne suivante
    lcd.print (plateau);
    //lcd.print ("            ");
    lcd.print ("       ");
    lcd.print (z);
    delay (40);


            Maqm();


            Maqd();
z ++;

            if (Inter == LOW){
              Pinter = 0;
              
            }
} 

           while (Pinter = 0);

      // }   


}

Mais voilà LE hic.


Si je rajoute une instruction au début de l'instruction void comme ici :

Code : Tout sélectionner

//
//--------------------------- Mise a quai manuel ---------------------------------
//


void Apprentissage(){           // Module apprentissage

Pinter = 1;

Otaquet(); <===== cette fonction qui actionne le servo

do {

  
    lcd.setCursor (0,0);
    lcd.print ("Position plateau"); 
    delay(10);
    lcd.setCursor(0,1);         // place le curseur ligne suivante
    lcd.print (plateau);
    //lcd.print ("            ");
    lcd.print ("       ");
    lcd.print (z);
    delay (40);


            Maqm();


            Maqd();
z ++;

            if (Inter == LOW){
              Pinter = 0;
              
            }
} 

           while (Pinter = 0);

      // }   


}

C'est la merdasse. Cette instruction est lue constamment alors que la boucle while ne devrait pas aller la lire tant que Inter est HIGH.

C'est là que je sèche comme le linge sur son fil.

:hurt4:

Re: While or not while ?

Posté : 14 oct. 2021, 19:33
par herwat
Tu écris " while (Pinter = 0); " . Ne devrais-tu pas écrire " while (Pinter == 0); "

Bon . . . . Je vais approfondir la question . . .

Re: While or not while ?

Posté : 16 oct. 2021, 17:45
par likiki
Alors voilà la solution (ou le problème tout dépend de quel coté on se met). :siffle:


1) prendre un Doliprane avec un verre d'eau

2) Relire le programme de A ==> Z :hurt4:

3) Reprendre un Doliprane

4) Prendre une feuille de papier, un crayon et faire un schéma séquentiel du programme en le lisant (en profiter pour re-prendre un Doliprane) :photo:

5) Allez dans le garage chercher un gros marteau

6) S'en mettre un bon coup derrière l'oreille droite (ou la gauche si vous êtes gaucher)

7) modifier la grosse connerie que vous avez faite dans le programme

8) Tester le programme

9) Enregistrer le programme

10) Aller ranger le marteau

11) Re-re-prendre un Doliprane a cause du marteau

12) Danser un peu ça fait du bien. :banane:

Bon, trêve de plaisanterie, quand on utilise la variable d'un actionneur en sortie type servo et qu'ensuite vous attendez qu'elle vous donne une valeur en entré de 1 ou 0, vous vous mettez dans la galère.

Temps perdu sur cette idiotie, deux semaines a raison de 2 a 3 heures par jours plus un samedi de 8h à 17 h.

Moi je vais me prendre une bière.


:sivousme:

Re: While or not while ?

Posté : 16 oct. 2021, 18:20
par herwat
Bon, j'ai pas tout compris . . . à part le Doliprane ! :D

ça fonctionne maintenant ?

J'ai eu ce genre de problème : utiliser la même variable pour deux choses en même temps . :hurt4: ça fait des choses bizarres . :-)

Re: While or not while ?

Posté : 16 oct. 2021, 18:35
par likiki
Oui, ça fonctionne comme c'était prévue dans mon idée. :mdr:

Il me reste quelques bricoles a revoir, comme le calcul pour les déplacements, y adjoindre des feux (vert & rouge) est, etc.

:kingmoi:

Re: While or not while ?

Posté : 16 oct. 2021, 18:43
par herwat
:cooooool: :cooooool: :cooooool: :cooooool:

Re: While or not while ?

Posté : 16 oct. 2021, 18:44
par likiki
Là ça prendre un peu de temps, car je vais me lancer dans mon concours.

:hhhaaaa:

Re: While or not while ?

Posté : 17 oct. 2021, 11:33
par herwat
Une tite vidéo, quand même . :-)

Re: While or not while ?

Posté : 17 oct. 2021, 11:56
par likiki
Hummmmm, A voir si je met mon prototipage a coté.

:kingmoi: