Partage
  • Partager sur Facebook
  • Partager sur Twitter

affichage de données sur un lcd

    15 août 2017 à 13:17:11

    Bonjour,

    Dans le cadre d’un projet perso, j’ai réalisé un système qui dit, via un afficheur lcd, si il faut arroser une plante ou non, j’utilises un capteur d’humidité grove qui mesure l’humidité de la plante et la compare à des valeurs prédéfinies pour savoir si la plantes est sèche ou assez humide.

    J’ai ajouter a ça un sélecteur (un potentiomètre), qui comporte 3 "zones", correspondants chacune a un intervalle entre 2 positions du potentiomètre, les zones sont affectées a un type de plantes, Arides, Tempérés ou Tropicales.

    Les valeurs d’humidité sont donc personnalisées pour chaque type de plantes, en fonction de la position du potentiomètre sur une zone. Mon problème arrive quand je veux sélectionner une zone. Par exemple, quand je choisi la zone 1 (Aride), l’afficheur est censé écrire "OK", quand la valeur d’humidité lue par le capteur est supérieur ou égale à 100, et écrire "Arrose moi", quand la valeur est inférieur à 100, de plus, l’afficheur doit afficher "Trop humide" quand la valeur dépasse 110 (j’ai pris des valeurs de test).

    Or, quand je l’allume et le positionne en zone 1 et que je mets ma main sur le capteur, celui-ci affiche "OK", même quand la valeur est égale à 30, et il n’affiche pas "Trop Humide", quand la valeur dépasse 110. J’ai vérifié, le chaque élément marche correctement séparément, et ce code de test du potentiomètre fonctionne parfaitement :

    #include <LiquidCrystal.h>
    LiquidCrystal lcd(11,10,5,4,3,2);
    
    
    int potar = A5;
    int val;
    
    void setup()
    {
      lcd.begin(16,2);
      pinMode(potar, INPUT);
    }
    void loop()
    {
      val = analogRead(potar);
      if ((val <= 1023) && (val >= 720))
      {
        lcd.clear();
        lcd.print("Arride");
      }
      if ((val <= 720) && (val >= 380))
      {
        lcd.clear();
        lcd.print("Tempere");
      }
      if ((val <= 380) && (val >= 4))
      {
        lcd.clear();
        lcd.print("Tropicale");
      }
      delay(1000);
    }

    voici le code complet du systeme :

    #include <LiquidCrystal.h>
    
    LiquidCrystal lcd(11,10,5,4,3,2);
    
    int sensor = A0;
    int potar = A5;
    
    int value;
    int valPerso;
    int valPersoFin;
    int tropHumide;
    int somme = 0;
    int compteur = 0;
    int NB_VALEURS = 5;
    int moyenne = 0;
    int pourcent;
    
    void setup()
    {
      lcd.begin(16,2);
      lcd.print("Initialisation");
    
      pinMode(potar, INPUT);
      pinMode(sensor, INPUT);
    }
    void loop()
    {
      valPerso = analogRead(potar);
      if ((valPerso <= 1023) && (valPersoFin >= 720))
      {
        valPersoFin = 100;
        tropHumide = 110;
      }
      else if ((valPerso <= 720) && (valPersoFin >= 380))
      {
        valPersoFin = 300;
        tropHumide = 466;
      }
      else if ((valPerso <= 380) && (valPersoFin >= 4))
      {
        valPersoFin = 600;
        tropHumide = 699;
      }
      delay(1000);
    
      somme += analogRead(sensor);
      compteur = (compteur + 1) % NB_VALEURS;
    
      if (compteur == 0)
      {
        moyenne = somme/NB_VALEURS; 
        somme = 0;
    
        //pourcent = (moyenne*100)/700;
    
        if (moyenne >= tropHumide)
        {
          lcd.print("Je me nois !");
        }
        if (moyenne < valPersoFin)
        {
          lcd.clear();
          lcd.setCursor(3,0);
          lcd.print("ARROSE MOI !");
          lcd.setCursor(7, 1);
          lcd.print(moyenne); // pourcent);
          //lcd.print(" %");
        }
        else if (moyenne >= valPersoFin)
        {
          lcd.clear();
          lcd.setCursor(7,0);
          lcd.print("OK");
          lcd.setCursor(6, 1);
          lcd.print(moyenne); // pourcent);
          //lcd.print(" %");
        }
      }
     delay(1000);
    }

    Merci de m'aider : )



    • Partager sur Facebook
    • Partager sur Twitter
      15 août 2017 à 16:40:04

      Bonjour,

      Ne faudrait-il pas plutôt mettre:

       if (moyenne >= tropHumide)
       {
         lcd.print("Je me nois !");
       }
       else
       { 
         if (moyenne < valPersoFin)
         {
           lcd.clear();
           lcd.setCursor(3,0);
           lcd.print("ARROSE MOI !");
           lcd.setCursor(7, 1);
           lcd.print(moyenne); // pourcent);
           //lcd.print(" %");
         }
         else
         {
           lcd.clear();
           lcd.setCursor(7,0);
           lcd.print("OK");
           lcd.setCursor(6, 1);
           lcd.print(moyenne); // pourcent);
           //lcd.print(" %");
         }
       }
      • Partager sur Facebook
      • Partager sur Twitter
        15 août 2017 à 18:40:34

        Le code ne fonctionne pas, l'écran affiche "Je me noie" directement quand on l'allume...
        • Partager sur Facebook
        • Partager sur Twitter
          15 août 2017 à 18:50:02

          Peux-tu faire un "lcd.print" d'une variable ? En l'occurence "moyenne" (à la ligne 3 du code que je t'ai proposé).

          PS: C'est un détail, mais effectivement c'est je me noie et non je me nois.

          -
          Edité par Blaster13 15 août 2017 à 18:54:25

          • Partager sur Facebook
          • Partager sur Twitter
            15 août 2017 à 18:55:11

            je ne comprends pas bien ta question, désolé ^^
            • Partager sur Facebook
            • Partager sur Twitter
              15 août 2017 à 19:02:42

              Est-il possible mettre à la ligne 3 (de la partie de code que je t'ai proposé):

              lcd.print(moyenne);

              Ainsi nous verrons pourquoi il t'affiche "Je me noie".

              PS: je viens de voir que c'est possible puisque tu le fais à la ligne 13 et 22 ^^

              -
              Edité par Blaster13 15 août 2017 à 19:07:06

              • Partager sur Facebook
              • Partager sur Twitter
                15 août 2017 à 20:05:49

                ok  ;), donc c ok pour le reste du code sinon ?

                • Partager sur Facebook
                • Partager sur Twitter
                  15 août 2017 à 21:19:51

                  Ca me semble, oui.

                  Le test que je t'ai indiqué permettra de voir si "moyenne" comporte la bonne valeur. Si oui, on affichera la valeur de la variable "tropHumide".

                  Je ne vois aucune erreur de code, mais juste un résultat inattendu.

                  Peut-être un souci dans le calcul de la moyenne ou autre, et ça on le verra avec les lcd.print demandés précédemment.

                  -
                  Edité par Blaster13 15 août 2017 à 21:27:41

                  • Partager sur Facebook
                  • Partager sur Twitter
                    15 août 2017 à 21:25:29

                    Et donc pour mon problème de départ ? Moi je ne vois toujours pas où est le problème... :(
                    • Partager sur Facebook
                    • Partager sur Twitter
                      15 août 2017 à 21:29:24

                      Quelle valeur as-tu pour ta moyenne ?

                      j'ai complété ma réponse précédente afin que tu comprennes le but de la manoeuvre.

                      • Partager sur Facebook
                      • Partager sur Twitter
                        15 août 2017 à 21:33:07

                        Pour la valeur de moyenne, j'ai fais une moyenne de 5 mesures du capteurs, prises 1 toutes les 1 secondes, comme c'est marqué dans le code
                        • Partager sur Facebook
                        • Partager sur Twitter
                          15 août 2017 à 22:15:55

                          D'accord mais cette valeur ne doit pas être très différente toutes les secondes.

                          Pour essayer de t'expliquer différemment, si tu as le message "Je me noie" qui apparait, c'est que ta condition "moyenne >= tropHumide" est vérifiée.

                          D'après ce que je comprends, ce n'est pas le message que tu attendais, et de ce fait j'essaye de te montrer que la valeur de moyenne est certainement supérieure ou égale à tropHumide (qu'il faudra également afficher pour être sûr que cette variable ait la valeur attendue).

                          -
                          Edité par Blaster13 15 août 2017 à 22:16:28

                          • Partager sur Facebook
                          • Partager sur Twitter
                            19 août 2017 à 21:58:28

                            Hello,

                            Je viens de relire ton code plus lentement et je pense avoir compris ton problème.

                            Aux lignes 29, 34 et 39 du code que tu as donné il est indiqué:

                            if ((valPerso <= XXX) && (valPersoFin >= XXX))

                             C'est plutôt :

                            if ((valPerso <= XXX) && (valPerso >= XXX))
                            

                            -
                            Edité par Blaster13 19 août 2017 à 21:59:11

                            • Partager sur Facebook
                            • Partager sur Twitter
                              25 août 2017 à 8:54:39

                              Merci, je n'avais pas vu ça, je commençais à désespérer ^^, merci de ton aide
                              • Partager sur Facebook
                              • Partager sur Twitter

                              affichage de données sur un lcd

                              × 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