Comparaison logique ou entre valeur digital et numérique.

Bonjour à tous,

Pour connaitre la position de mon vérin, j’utilise le capteur analogique de position ainsi que des fins de courses numériques

Lorsque je décide de comparer ces valeurs, cela ne fonctionne pas. Je n’arrive pas à sortir de ma boucle.

Voici la partie de mon code qui pose problème:

void loop() {
  BP = digitalRead (inBP);
  switchbas = digitalRead (inSwitchbas);
  switchhaut = digitalRead (inSwitchhaut);
  Position1 = analogRead (Ana1);
  Position2 = analogRead (Ana2);
  Serial.println (Position1);
  Serial.println (Position2);

  if (switchbas == HIGH){

    while ((Position1<900 || Position2<900)||(switchhaut != LOW )){  
    
      Position1 = analogRead (Ana1);
      Position2 = analogRead (Ana2);
      switchhaut = digitalRead (inSwitchhaut);
      //safety1();
      moteurp();
      //safety2();      
      
    }
    
    SynchroMoteurp ();
    
    moteur0();
    
  }

Par contre si je compare juste mes postions cela fonctionne .

 if (switchbas == HIGH){

    while ((Position1<900 || Position2<900){      //||(switchhaut != LOW )){  
    
      Position1 = analogRead (Ana1);
      Position2 = analogRead (Ana2);
      switchhaut = digitalRead (inSwitchhaut);
      //safety1();
      moteurp();
      //safety2();      
      
    }
    
    SynchroMoteurp ();
    
    moteur0();
    
  }

Ou si j’utilise juste le fin de course cela fonctionne également.

  if (switchbas == HIGH){

    //while (Position1<900 || Position2<900){  
      while (switchhaut == LOW ){
      Position1 = analogRead (Ana1);
      Position2 = analogRead (Ana2);
      switchhaut = digitalRead (inSwitchhaut);
      //safety1();
      moteurp();
      //safety2();      
      
    }
    
    SynchroMoteurp ();
    
    moteur0();
    
  }

En regardant un peu la doc sur les différentes opérateurs logique je ne vois rien qui m’empeche de comparer ce genre de valeurs.

Il y a t il quelquechose que je fais mal ou alors je ne peux tout simplement pas comparer ces types de valeurs ?

Un grand merci

up :slight_smile:

hello
tu n'as pas de reponses car tu n'es pas assez précis

comment sont déclarés les switchs: INPUT ou INPUT_PULLUP ?

ensuite, on suppose qu'ils sont en PULLUP
donc tu regardes
"if (switchbas == HIGH)" donc on suppose que le switch BAS n'est pas actionné

et dans ce if tu mets un while qui surveille les analogiques mais aussi le switch HAUT
alors qu'on s’attend à ce que tu surveilles le switch BAS.

dans quel sens te déplaces tu ?

si tu avais posté ton code au complet ou au moins avec les déclarations et le setup, nous ne serions pas là à poser des questions

Bonjour,

Voici l’intégralité de mon code , celui-ci constitue un test par rapport à mon code complet. J’utilise donc parfois un switch dans ce cas ci pour simuler un fonctionnement:

//Fin de course et position
int inSwitchbas = 53;
int inSwitchhaut = 12;
int switchbas = 0;
int switchhaut = 0;
//Position des vérins
int Position1 =0;
int Position2 =0;
// valeur analogique correspondant à la position haute et basse // Il faudra peut etre donner PB2 PH2
int PB = 300 ;
int PH = 700;
//Moteur
const int Ana1 = A5;
int D1A = 9;
int D1B = 8;
const int Ana2 = A0;
int D2A = 11;
int D2B = 13;
// Signal 12V ancienne gache
int insignalvalue = 10;
int signalvalue = 0;
//Bouton sortie "urgence"
int BP = 0;
int inBP =7;
//Montre si porte est fermée
int EtatPorte = 0;
//Mesure de la distance
const byte TRIGGER = 6;// 
const byte ECHO = 5; 
const byte TRIGGER2 = 30; 
const byte ECHO2 = 31; 
const unsigned long MEASURE_TIMEOUT = 25000UL; // 25ms = 8m à 340m/s
const float SOUND_SPEED = 340.0 / 1000;

void setup() {
  
  pinMode(inSwitchbas, INPUT);
  pinMode(inBP, INPUT);
  pinMode(inSwitchhaut, INPUT);
  pinMode(insignalvalue, INPUT);
  pinMode(D1A, OUTPUT);
  pinMode(D1B, OUTPUT);
  pinMode(D2A, OUTPUT);
  pinMode(D2B, OUTPUT);
  pinMode (Ana1, INPUT);
  pinMode (Ana2, INPUT);
  pinMode(TRIGGER, OUTPUT);
  digitalWrite(TRIGGER, LOW);
  pinMode(ECHO, INPUT);
  pinMode(TRIGGER2, OUTPUT);
  digitalWrite(TRIGGER2, LOW);
  pinMode(ECHO2, INPUT);
  Serial.begin(115200);
}
void loop() {
  BP = digitalRead (inBP);
  switchbas = digitalRead (inSwitchbas);
  switchhaut = digitalRead (inSwitchhaut);
  Position1 = analogRead (Ana1);
  Position2 = analogRead (Ana2);
  Serial.println (Position1);
  Serial.println (Position2);

  if (switchbas == HIGH){

    while (Position1<900 || Position2<900){ || switchhaut == LOW ){
      Position1 = analogRead (Ana1);
      Position2 = analogRead (Ana2);
      //safety1();
      moteurp();
      //safety2();      
      
    }
    SynchroMoteurp ();
    
    moteur0();
  }
    if (switchhaut == HIGH){
    moteurn();
    delay (2000);
    moteur0();
  }
    if (BP == HIGH){
    moteurp();
    delay (2000);
    moteurn();
    delay (2000);
    moteur0();
  }

}
//moteur sens +
void moteurp (){
  digitalWrite (D1A, HIGH);
  digitalWrite (D1B, LOW);
  digitalWrite (D2A, HIGH);
  digitalWrite (D2B, LOW);
}

void moteur1p (){
  digitalWrite (D1A, HIGH);
  digitalWrite (D1B, LOW);
}

void moteur2p (){
  digitalWrite (D2A, HIGH);
  digitalWrite (D2B, LOW);

}
//moteur sens -
void moteurn(){
  digitalWrite (D1A, HIGH);
  digitalWrite (D1B, HIGH);
  digitalWrite (D2A, HIGH);
  digitalWrite (D2B, HIGH);
}
void moteur1n(){
  digitalWrite (D1A, HIGH);
  digitalWrite (D1B, HIGH);
}
void moteur2n(){
  digitalWrite (D2A, HIGH);
  digitalWrite (D2B, HIGH);
}
//moteur sens stop
void moteur0(){
  digitalWrite(D1A,LOW);
  digitalWrite(D1B,LOW); 
  digitalWrite(D2A,LOW); 
  digitalWrite(D2B,LOW); 
}
float distance() {
  
  digitalWrite(TRIGGER, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIGGER, LOW);  
   long measure = pulseIn(ECHO, HIGH, MEASURE_TIMEOUT); 
   
   float distance_mm = measure / 2.0 * SOUND_SPEED;

  //Serial.println("distance ");
  //Serial.print(distance_mm / 10.0, 2);
  //Serial.print("cm de ");

  return distance_mm ;
}
float distance2() {
  
  digitalWrite(TRIGGER2, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIGGER2, LOW);  
  
  long measure2 = pulseIn(ECHO2, HIGH, MEASURE_TIMEOUT);
  
  
  float distance_mm2 = measure2 / 2.0 * SOUND_SPEED;
  //Serial.println("distance ");
  //Serial.print(distance_mm2 / 10.0, 2);
  //Serial.print("cm de ");

  return distance_mm2 ;
}
void safety1 () {
  //if ((distance()< 150.00) ){

    //if ((Position1) >= 150){
    if ((((Position1) > 150 || (Position2) > 150))&&(((distance()< 150.00) || (distance2()< 150.00)))){        
      moteur0();
      delay (5000);
    }
    }

void safety2 () {
  if ((distance2()< 150.00) ){

    if ((Position1) >= 150){
  //((((Position1) > 150 || (Position2) > 150))&&(((distance()< 150.00) || (distance2()< 150.00)))){        
      moteur0();
      delay (5000);
    }
    }
}


void SynchroMoteurp () {
  
  if ((Position1 - Position2) > 10 ){

    digitalWrite(D1A,LOW); 
    digitalWrite(D1B,LOW);
    
      while ( (Position1 - Position2) > 1){
        Position1 = analogRead (Ana1);
        Position2 = analogRead (Ana2);
        moteur2p ();           
      
      }      
    }
    if ((Position2 - Position1) > 10 ){

    digitalWrite(D2A,LOW); 
    digitalWrite(D2B,LOW);
    
      while ( (Position2 - Position1) > 1){
        Position1 = analogRead (Ana1);
        Position2 = analogRead (Ana2);
        moteur1p ();       
      
      }      
    }
    }
void SynchroMoteurn () {
  
  if ((Position2 - Position1) > 10 ){

    digitalWrite(D1A,LOW); 
    digitalWrite(D1B,LOW);
    
      while ( (Position2 - Position1) > 1){
        Position1 = analogRead (Ana1);
        Position2 = analogRead (Ana2);
        moteur2n ();           
      
      }      
    }
  if ((Position1 - Position2) > 10 ){

    digitalWrite(D2A,LOW); 
    digitalWrite(D2B,LOW);
    
      while ( (Position1 - Position2) > 1){
        Position1 = analogRead (Ana1);
        Position2 = analogRead (Ana2);
        moteur1n ();       
      
      }      
    }
    }

Mes variables sont juste “INPUT” mais le pull up est fait sur ma breadboard.

Je me déplace dans le sens positif. (fonction : moteurp, effectivement plus facile avec l intégralité du code).

Mon switchbas permet dans ce cas ci (utiliser dans ce code comme actionneur mais dans le but de faire un test) d’actionner la montée des vérins. Je veux que mes moteurs s’arretent de tourner dans le sens positif dans le cas ou une des postions (1 ou2) est dépassée ou alors si le switchhaut est à l’état haut (utilisé comme un fin de course).

Avec while, tu restes dans la boucle tant que la proposition logique est vrai.
Comme tu utilises un OU tant que l'une des propositions est vrai tu restes dans le while.
Est-ce que c'est le comportement que tu cherches?
Au lieu de supprimer un membre puis l'autre au hasard, il faut écrire clairement (en français) la condition de maintient dans la boucle et la coder ensuite.

  • quel est l'état actif des discrets, par exemple au lieu d'écrire switchhaut != LOW il est plus clair d'écrire switchhaut != BUTEE_ATTEINTE en définissant au début du code const byte BUTEE_ATTEINTE = LOW (ou HIGH, c'est toi qui sait)
  • bornes des valeurs à tester
  • condition à remplir pour rester dans la boucle

Quand tu ne comprends pas ce qui se passe ("je ne sors pas de la boucle..."),
il faut mettre des Serial.print() des valeurs importantes à l'intérieur de la boucle.

Dans ma boucle je voulais que celle-ci s'exécute tant que une des trois conditions logique ne soit plus remplies. En fait l'utilisation du OU || n'est pas la bonne car pour sortir de cette boucle il faut que ces 3 conditions soient remplies.

La condition logique a utiliser est ET &&.

J'ai buggé en croyant qu'il allait sortir de la boucle avec le OU si une des conditions n'était plus remplie... Donc très bête erreur de ma part

J'avais exécuté le Serialprintln, je voyais que les position (analogique) dépassaient les conditions ainsi que ma condition digital aussi et je ne comprenais justement pas pourquoi c'était possible.

Merci de m'avoir éclairé