affichage de données sur un lcd

a marqué ce sujet comme résolu.

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 :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#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 :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#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 :)

Ta variable "compteur" ne retourne jamais à 0, l’affichage semble ne pas pouvoir être mis à jour.

Spit

Elle le fait implicitement via le modulo l.47 . Par contre la moyenne meriterait plutot d’être faite sur un "tableau qui tourne".

Si tu print les valeurs intéressantes à différents endroits du code ca donne quoi ?

+0 -0

quand je fais ce code :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#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()
{
  Serial.begin(9600);
  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;
  }

  Serial.println("");
  Serial.println("valPersoFin");
  Serial.println(valPersoFin);

  somme += analogRead(sensor);
  compteur = (compteur + 1) % NB_VALEURS;

  Serial.println("");
  Serial.println("somme");
  Serial.println(somme);

  if (compteur == 0)
  {
    moyenne = somme/NB_VALEURS; 
    somme = 0;

    Serial.println("");
    Serial.println("moyenne");
    Serial.println(moyenne);

    //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);
}

Le moniteur série met 0 pour valPersoFin, la valeur de somme augmente a priori normalement, et moyenne est aussi normale :

valPersoFin 0

somme 0

valPersoFin 0

somme 0

valPersoFin 0

somme 0

valPersoFin 0

somme 0

valPersoFin 0

somme 0

moyenne 0

valPersoFin 0

somme 0

valPersoFin 0

somme 3

valPersoFin 0

somme 52

valPersoFin 0

somme 153

valPersoFin 0

somme 254

moyenne 50

valPersoFin 0

somme 94

valPersoFin 0

somme 190

valPersoFin 0

somme 290

valPersoFin 0

somme 389

valPersoFin 0

somme 489

moyenne 97

valPersoFin 0

somme Donc la valeur qui semble déconner est valPersoFin, puisque meme en bougeant le potar, la valeur reste à 0

Pourtant je n’ais pas affecté de valeur pas défaut a valPersoFin, et a la suite de ce bloc :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
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;
  }

valPersoFin est censé avoir une valeur, soit 100,300,600, etc ? non?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#include <LiquidCrystal.h>

LiquidCrystal lcd(11,10,5,4,3,2);

int sensor = A0;
int potar = A5;

int valPerso = 1023;
int valPersoFin = 0;
int tropHumide = 0;
int somme = 0;
int compteur = 0;
int NB_VALEURS = 5;
int moyenne = 0;
int pourcent;

void setup()
{
  Serial.begin(9600);
  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;
  }

  Serial.println("");
  Serial.println("valPersoFin");
  Serial.println(valPersoFin);

  somme += analogRead(sensor);
  compteur = (compteur + 1) % NB_VALEURS;

  Serial.println("");
  Serial.println("somme");
  Serial.println(somme);

  if (compteur == 0)
  {
    moyenne = somme/NB_VALEURS; 
    somme = 0;

    Serial.println("");
    Serial.println("moyenne");
    Serial.println(moyenne);

    //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(" %");
    }
    else
    {
      lcd.clear();
      lcd.home();
      lcd.print("ERREUR");
    }
  }
 delay(1000);
}

C’est mieux ?

Voilà ce que te dit Eskimon :

Regarde tes conditions :

1
2
3
if ((valPerso <= 1023) && (valPersoFin >= 720))
else if ((valPerso <= 720) && (valPersoFin >= 380))
else if ((valPerso <= 380) && (valPersoFin >= 4))

Te prends en compte les valeurs respectives de valPerso ET de valPersoFin (je présume que ce n’est pas ce que tu veux, parce qu’on ne voit pas ce genre de structures souvent, mais je n’ai pas lu le code entier).

Bien, voyons maintenant ce que vaut ta valeur valeurPersoFin lors du tout premier lancement de la boucle : comme elle n’est pas réassignée après, alors la déclaration de ta variable fait foi, int valPersoFin = 0;, donc cette variable vaut 0, de ce fait, elle n’est NI inférieure à 720, NI inférieure à 380, NI inférieure à 4, donc les conditions de tes ifs sont toutes fausses.

+1 -0

J’ai résolu le problème, c’était bien :

1
2
3
if ((valPerso <= 1023) && (valPerso >= 720))
else if ((valPerso <= 720) && (valPerso >= 380))
else if ((valPerso <= 380) && (valPerso >= 4))

et non :

1
2
3
if ((valPerso <= 1023) && (valPersoFin >= 720))
else if ((valPerso <= 720) && (valPersoFin >= 380))
else if ((valPerso <= 380) && (valPersoFin >= 4))

Je suis désolé de vous avoir "mobilisez" pour pas grand chose, je vous remercie beaucoup de votre temps. Je remercie tout particulièrement Eskimon, pour son blog http://eskimon.fr, qui ma grandement aider avec l’arduino ^^

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte