probleme de condition

Bonjour à tous,

Je suis occupé à developper un systeme de remplissage automatique de la réserve d'eau d'un appareil. Je me suis donc procurer une sonde ultrason, un arduino nano et deux relais pour commander deux electrovannes.
Je voudrais donc qu'une EV s'ouvre si le niveau de remplissage descend à 10% et qu'elle se ferme si le niveau atteint 100%. la seconde EV sert de sécurité et doit s'ouvrir si le niveau dépasse 102%, il faut aussi que la premiere EV se ferme à ce moment.
Il y a quelque chose que je n'ai pas compris dans le if (...) car ça ne marche pas. je commence à perdre mes cheveux et saigner des oreilles. C'est très certainement une bétise que je ne vois pas à cause de mon faible niveau en programmation.
Au fait, mes electrovannes sont normalement fermées
Voici mon code:

// Bibliotheques
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

//declaration LCD
LiquidCrystal_I2C lcd(0x27,20,4);

//Declaration pin relais, EV et variables
int trigger = 6;
int echo = 7;
long lecture_echo;
long distance;
int remplissage;
int EVin=3;
int EVout=2;
int maxLevel=100;

void setup(){
// demarrage LCD
lcd.init();
lcd.backlight();

//demarrage serial et initialisation pin
Serial.begin (9600);// pour le debug serial
pinMode(trigger, OUTPUT);
digitalWrite(trigger, LOW);
pinMode(echo, INPUT);
pinMode(EVin, OUTPUT);
digitalWrite(EVin, LOW);
pinMode(EVout, OUTPUT);
digitalWrite(EVout, LOW);

}

void loop(){
  mesure();
  delay (5000); //une mesure toute les 5 secondes. A adapter IRL
}

int mesure(){
digitalWrite(trigger, HIGH);
delayMicroseconds(10);
digitalWrite(trigger, LOW);
lecture_echo = pulseIn(echo,HIGH);
distance = lecture_echo /58;
Serial.print("Distance en cm :");
Serial.println(distance);    
     int x;
     x=map(distance,10,55,0,100);// transformation de la distance en % de vide
     Serial.println(x); //debug
     remplissage=100-x;// transformation du % de vide en % de remplissage
     Serial.print("remplissage=");//debug
     Serial.print(remplissage);//debug
     Serial.println ("%");//debug
     lcd.clear();
     lcd.setCursor(0,0);
     lcd.print("rempli a ");
     lcd.print(remplissage);
     lcd.println(" %"); 
// c'est à partir d'ici que les romains s'empoignerent...     
if((remplissage>=10) && (remplissage<100)){
       digitalWrite(EVin, HIGH);
       digitalWrite(EVout, LOW);
      
     }
     if (remplissage>102) {
      digitalWrite(EVin, LOW);
      digitalWrite(EVout, HIGH);
     
     }    
}

Si quelqu'un a une piste pour me guider ce serait fort sympathique.
merci

Je voudrais donc qu'une EV s'ouvre si le niveau de remplissage descend à 10% et qu'elle se ferme si le niveau atteint 100%

quelle partie du code fait cela selon vous ?

J'aurais esperer que cette partie du code fasse le taf:

if((remplissage<=10) && (remplissage<100)){
       digitalWrite(EVin, HIGH);
       digitalWrite(EVout, LOW);
   
     }
     if (remplissage>102) {
      digitalWrite(EVin, LOW);
      digitalWrite(EVout, HIGH);
     }

2 problèmes

if((remplissage<=10) && (remplissage<100)){

Cette condiiton esr vrai si remplissage est inférieur ou égal à 10 ET si remplissage est inférieur à 100
En fin de compte elle est tout le temps vrai lorsque remplissage est inférieur ou égale à 10 dès que tu dépasses 10 elle devient fausse
Il vaudrait mieux partie sur quelque chose dans ce genre

// Gestion remplissage
if (remplissage<= 10){
       digitalWrite(EVin, HIGH);
}
]if (remplissage>=100){
       digitalWrite(EVin, LOW);
}

// Gestion sécurité
if (rempllissage>102){
       digitalWrite(EVout, HIGH);
}
If (remplissage<=100){
       digitalWrite(EVout, LOW);
}

Dans le principe, le code ci-dessus devrait fonctionner mais ....

... pas vraiment car remplissage ne peut pas dépasser 100 à cause du map

x=map(distance,10,55,0,100);// transformation de la distance en % de vide

Edit: j'ai dit une bêtise. J'ai confondu map() et constrain(().
Donc, ça devrait fonctionner.
Par contre, il faudrait vérifier que la différence entre 100 et 102 est supérieure au bruit de mesure. Et là, j'ai un doute.

Edit: j'ai dit une bêtise. J'ai confondu map() et constrain(().

Non non pas de bêtise... si la distance n'est pas entre 10 et 55, x ne sera pas entre 0 et 100.
ce serait bien justement de mettre un constrain()

Justement, si la distance est supérieure à 55 on pourra atteindre les 102 testés dans le code.

Bon point !

Hello,

Je n'ai jamais utilisé constrain() mais après quelques lectures j'ai compris que cette commande permet de definir un interval mais après, comment exploiter le retour du constraint?

C'est chouette d'apprendre l'arduino, je decouvre tt le temps plein de truc.
Je vais dans un premier temps tenter cette solution:

// Gestion remplissage
if (remplissage<= 10){
       digitalWrite(EVin, HIGH);
}
]if (remplissage>=100){
       digitalWrite(EVin, LOW);
}

// Gestion sécurité
if (rempllissage>102){
       digitalWrite(EVout, HIGH);
}
If (remplissage<=100){
       digitalWrite(EVout, LOW);
}

Et dans le meme temps, jouer un peu avec le constrain pour comprendre comment ça marche.

Merci pour le coup de main.

Je voudrais donc qu'une EV s'ouvre si le niveau de remplissage descend à 10% et qu'elle se ferme si le niveau atteint 100%. la seconde EV sert de sécurité et doit s'ouvrir si le niveau dépasse 102%, il faut aussi que la premiere EV se ferme à ce moment.

c'est typiquement une définition de programme qui se prête bien à la programmation par machine à états (cf mon tuto éventuellement)

Les états pourraient être comme cela.

  • on commence avec les 2 vannes fermées
  • dans l'état V1_ON il faut tester le lien 102% avant de tester celui à 90%
  • attention une fois en situation de trop plein vous n'avez pas spécifié le comportement. Il y a des chances pour que V1 ne fonctionne plus donc un traitement particulier doit avoir lieu (intervention humaine ?)

Notez qu'un simple trop plein mécanique (un trou au bon niveau) permet de vous débarrasser de la seconde vanne V2 et ça a plus de chances de fonctionner car si V1 est en panne, il se peut que V2 le soit aussi.

Re,

J'ai déjà lu votre tuto mais un rappel s'impose car je n'y avais tout simplement pas pensé.
Concernant la vanne n°2 qui sert de sécurité, je pense que je vais faire, comme suggéré, un trou muni d'un tuyau vers l'égout. Ce sera plus safe.

Je n'ai pas le temps de me penché la dessus aujourd'hui mais c'est bien noté.

Merci pour le coup de pousse

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.