Auteur Sujet: Utiliser la fonction "IF" ou/et "else if " ???  (Lu 16890 fois)

jojolito

  • Newbie
  • *
  • Messages: 2
    • Voir le profil
Utiliser la fonction "IF" ou/et "else if " ???
« le: avril 04, 2019, 07:17:29 am »
Bonjour

Voilà j'ai un projet visant à commander 2 relais  à l'aide d'un capteur ultrason HC-SR04, dans le cadre d'un projet aquaponique ,les deux relais en question serviront à alimenter de pompes a eau j'ai déjà essayé d'écrire quelques lignes de code mais je n'obtiens pas le résultat voulu .. Car je sais pas si je dois utiliser la fonction "if" ou  "else if" ou même les deux ,j'aimerais avoir votre aide pour écrire la base du code

Voilà grossièrement ce que je voudrais faire exprimer sans code :

x= 10cm
y=5cm

Si la hauteur est plus petit que (< ) que x
Le Relais 1 s'allume
Le Relais 2 reste éteint

Si la hauteur est = X
Le Relais 1 s'eteint
Le Relais 2 reste éteint

Temporisation de 3 secondes

Si la hauteur est plus grande (>) que Y
Le Relais 1 reste éteint
Le relais 2 s'allume

Si la hauteur est = Y
Le Relais 1 reste éteint
Le Relais 2 s'éteint

Temporisation de 3 secondes



Voilà grossièrement les ordres à executer mais je n'arrive pas à convertir ça en ligne de code

J'avais fait un premier essai mais ça a ete un echec    :

Voilà les lignes de code du raté

Code: [Select]

void loop() {

niveau_culture = culture.distanceInMillimeters() / 10;
Serial.print("hautteur: ");
Serial.println(hautteur);
Serial.println("");
delay(250);

if (hauteur != x) { 
digitalWrite(relais 2, LOW);
digitalWrite(relais 1, HIGH);
}
if (hauteur>=x) { 
digitalWrite(relais 2, HIGH);
digitalWrite(relais 1, HIGH);
//Serial.println("marre_haute");
}
delay(3000);

if (hauteur !=y) {
digitalWrite(relais 1, LOW);
digitalWrite(relais 2, HIGH); 
}
if (hauteur <= y) { 
digitalWrite(relais 1, HIGH);
digitalWrite(relais 2, HIGH);
// Serial.println("marre_basse");
}
delay(3000);

Voilà avec Céline de code dès que la hauteur atteint la valeur X Le Relais 1  éteins la hauteur diminue et dès qu'elle devient au-dessOUS de la valeur X le relais 1 se rallume, et tout ça se fait de façon interminable
 

Est-ce que je dois pas utiliser une boucle fort genre " while " ???

J'ai aussi un doute sur l'utilisation de la fonction "delay" , est-ce que je dois utiliser Delaymillisecondes plutot ???

Voilà merci de votre lecture aidez-moi s'il vous plaît

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1716
    • Voir le profil
Re : Utiliser la fonction "IF" ou/et "else if " ???
« Réponse #1 le: avril 04, 2019, 09:05:56 am »
Ni l’une ni l’autre.

Lisez ceci : http://www.locoduino.org/spip.php?article25

Modélisez votre problème avec un automate et implémentez le
Cordialement

jojolito

  • Newbie
  • *
  • Messages: 2
    • Voir le profil
Re : Utiliser la fonction "IF" ou/et "else if " ???
« Réponse #2 le: avril 06, 2019, 01:00:26 pm »
Bonjour j'ai suivi votre conseil ça m'a permis de réécrire le code tout en inspirant du lien mais ça ne fonctionne toujours pas

Voilà le code ré écrit

#include <hcsr04.h> //Bifrost HCSR04 Library
 

const int TRIG_CULTURE_PIN = 28;
const int ECHO_CULTURE_PIN = 29;
const int POMPE_CULTURE = 19; // pompe depart d’eau sur relai
const int POMPE_AQUA = 9; // pompe arrive d’eau sur relai
HCSR04 niveau (TRIG_CULTURE_PIN, ECHO_CULTURE_PIN, 20, 4000);

enum { bac_tempo2, maree_basse, bac_se_remplie, maree_haute, bac_tempo, bac_se_vide };
int niveau_culture;
const float bacVide = 32;
const float bacRemplie = 20;



void setup() {
  Serial.begin(115200);
 

  pinMode(POMPE_AQUA, OUTPUT); // pompe arrive d’eau
  // pinMode(POMPE_AQUA, HIGH);
  pinMode(POMPE_CULTURE, OUTPUT); // pompe depart d’eau
  //pinMode(POMPE_CULTURE, HIGH);

}

void loop() {
  niveau_culture = niveau.distanceInMillimeters() / 10;
   Serial.print("niveau_culture: ");
  Serial.println(niveau_culture);
  Serial.println("");
  delay(250);

  byte etatBac = bac_tempo2;

  switch (etatBac)
  {
    case  bac_tempo2 :
      if (niveau_culture == bacVide) {
        digitalWrite(POMPE_CULTURE,  HIGH);
        digitalWrite(POMPE_AQUA, HIGH);
        delay(3000);
        etatBac = maree_basse;
      }
     // else if (niveau_culture >  bacVide ) {
       // digitalWrite(POMPE_CULTURE,  LOW);
        //digitalWrite(POMPE_AQUA, HIGH);
        //etatBac = bac_se_vide;
      //}
      break;

    case maree_basse :
      if (niveau_culture == bacVide) {
        digitalWrite(POMPE_AQUA, LOW);
        //  digitalWrite(POMPE_CULTURE, HIGH);
        etatBac = bac_se_remplie;
      }
      break;

    case bac_se_remplie :

      if (niveau_culture != bacRemplie) {
        digitalWrite(POMPE_AQUA, LOW);
        //digitalWrite(POMPE_CULTURE, HIGH);
        etatBac = maree_haute;
      }
      break;

    case  maree_haute :
      if (niveau_culture == bacRemplie) {
        digitalWrite(POMPE_AQUA, HIGH);
        etatBac = bac_tempo;
      }
      break;

    case  bac_tempo :

      digitalWrite(POMPE_CULTURE, HIGH);
      digitalWrite(POMPE_AQUA, HIGH);
      delay(3000);
      etatBac = bac_se_vide;
      break;

    case  bac_se_vide :
 
  if (niveau_culture != bacVide) {
    digitalWrite(POMPE_CULTURE,  LOW);
    digitalWrite(POMPE_AQUA, HIGH);
    etatBac = bac_tempo2;
  }
  break;

}














}

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1716
    • Voir le profil
Re : Utiliser la fonction "IF" ou/et "else if " ???
« Réponse #3 le: avril 06, 2019, 01:16:46 pm »
Tout d'abord si l'état de votre automate est dans un variable déclarée localement mais pas static. Par conséquent votre état est toujours bac_tempo2 à chaque exécution de loop.

Vous avez des fautes de conception un peu partout. Vous devriez vous interroger sur le sens de ce que vous avez écrit dans le code.

Exemple :

   case  bac_tempo2 :
      if (niveau_culture == bacVide) {

niveau_culture étant la distance à la surface de l'eau en mm, quelle probabilité pour qu'elle soit exactement égale à bacVide au moment où elle est lue ?

Réfléchissez au sens physique que vous donnez à chaque condition permettant de passer d'un état à l'autre.

Par ailleurs ceci n'est pas du modélisme ferroviaire. Je verrouille le fil.

Bon courage pour la suite
Cordialement