Capteur d'humidité et écran lcd

arduino

a marqué ce sujet comme résolu.
Auteur du sujet

Bonjour,

Dans le cadre d’un projet perso, je voulais que mon capteur d’humidité grove affiche la valeur d’humidité de, par exemple, la terre d’une plante, sur un ecran LCD alphanumérique. J’ai fais les test avec le moniteur série avant, et tout fonctionne correctement, mais une fois connecter à l’écran, celui-ci affiche une valeur souvent fausse, qui augment en permanence sans se stabiliser.

merci de m’aider…

+0 -0
Auteur du sujet

Voilà le code :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#include <LiquidCrystal.h>
LiquidCrystal lcd(11,10,5,4,3,2);

int sensor = A0;
int val;

void setup()
{
  lcd.begin(16,2);
  pinMode(sensor, INPUT);
}
void loop()
{
  val = analogRead(sensor);
  lcd.print(val);
}

et pour le montage, l’ecran est connecté comme dans le code, et le capteur est connecté au port A0 du Base Shield Grove, voilà, le montage est très simple

+0 -0

Cette réponse a aidé l’auteur du sujet

Alors en fait la valeur que tu vas lire n’est pas stable (une infime variation de position, etc..) peut faire varier beaucoup la valeur, donc elle va constamment changer. En plus tu parcours la boucle un très très grand nombre de fois par seconde vu qu’elle est vide et que dès que ton microcontrôleur a fini de la parcourir il revient au début de la boucle. Pour enlever le problème, tu devrais faire plusieurs choses:

  • rajouter un delay dans le loop (de 1 seconde et après tu fais varier toi même)

  • soit tu fais une moyenne sur plusieurs données que tu obtiens. Disons que toutes les secondes tu relève la valeur et que tu la stockes dans un tableau. Et toute les 10 secondes tu fais la moyenne des 10 valeurs et tu changes l’affichage.

  • tu vas avoir une valeur entre 0 et 1024 Mais tu découpe cet intervalle en sous intervalles, le truc, c’est que plus tu en as plus tu vas être précis mais plus tu as des risques de fluctuations sur la valeur de ton écran. Moi j’en ferai 3: de 0 a 300 c’est sec, de 300 a 650 c’est humide et au dessus c’est mouillé. Et tu affiche un des 3 états selon la valeur que tu récupères.

Moi ce que je ferai c’est un mix des 3 :D

Mais rassure toi ce n’est que du code. Essaye et si tu n’y arrives pas je peux te donner un coup de pouce demain ;)

Édité par Unknown

Vive la science

+1 -0

Cette réponse a aidé l’auteur du sujet

Pas de quoi !

Juste, une précision, pour le tableau, tu fais un compteur ( à chaque boucle tu ajoutes 1 à un compteur et la valeur actuelle à une variable choisi) et quand il est égal à 10 tu divises par 10 la valeur de ta variable. Pas besoin de passer par un tableau d’entier ;) et n’oublie pas le delay de mini 1 seconde dans la boucle ! (attention la valeur que tu fourni à delay est en milliseconde)

Vive la science

+1 -0
Auteur du sujet

Pour l’instant j’ai ça :

 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
#include <LiquidCrystal.h>
LiquidCrystal lcd(11,10,5,4,3,2);

int sensor = A0;
int val;
int tableau[11];
int i;

void setup()
{
  lcd.begin(16,2);
  pinMode(sensor, INPUT);
}
void loop()
{
  val = analogRead(sensor);
  for (i = 0; i<11; i++)
  {
    tableau[i] = val;
  }
  if (millis() >= 10000)
  {

  }
  delay(1000);
}

mais je bloque sur la moyenne des valeurs

+0 -0

Cette réponse a aidé l’auteur du sujet

Bonjour, il y a quelques problèmes dans ton code.

Dans ta fonction loop(), tu écrases toutes les valeurs de ton tableau à chaque passage. Tu devrais juste remplacer une seule des cases du tableau (ajoute une variable qui te sert de compteur et que tu incrémentes à chaque passage dans loop() ).

Ensuite, pour la moyenne, tu additionnes toutes tes mesures présentes dans ton tableau, et tu divises par le nombre de valeurs que ton tableau peut contenir.

Un exemple non vérifié, mais pour t’aider si tu bloques (essaies de corriger sans).

 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
#include <LiquidCrystal.h>
LiquidCrystal lcd(11,10,5,4,3,2);

int sensor = A0;
int TAB_SIZE = 10;
int tableau[TAB_SIZE];

int cpt = 0;
int i;

int val;

void setup() {
  lcd.begin(16,2);
  pinMode(sensor, INPUT);

// initialisation des valeurs
  val = analogRead(sensor);
  for (i = 0; i< TAB_SIZE; ++i) {
    tableau[i] = val;
  }
}

void loop() {
  tableau[cpt] = analogRead(sensor);
  cpt = (cpt + 1) % TAB_SIZE;

  val = 0;
  for (i = 0; i<TAB_SIZE; ++i) {
    val += tableau[i];
  }

  val /= TAB_SIZE;

  lcd.print(val);
  
  delay(1000);
}
+1 -0

Cette réponse a aidé l’auteur du sujet

Salut,

Bravo d’avoir essayé déjà.

Moi je te propose un code sans tableau. Si tu as besoin d’explications, demande !

 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
#include <LiquidCrystal.h>
LiquidCrystal lcd(11,10,5,4,3,2);

int sensor = A0;

int cpt = 0;
int valeur = 0;
const int TAB_SIZE = 10;

void setup() {
  lcd.begin(16,2);
  lcd.print(0);
  pinMode(sensor, INPUT);
}

void loop() {
  valeur += analogRead(sensor);
  cpt = (cpt + 1) % TAB_SIZE;

  if (cpt == 0){
    valeur /= TAB_SIZE;
    lcd.print(valeur);
    valeur = 0;
  }
  
  delay(500);
}

Maintenant le problème est je pense que tu cherches à constamment actualiser l’écran LCD. Qu’est ce qui se passe avec le code au dessus ? (le code de JuDePom est bon aussi normalement ;) )

Le moniteur série est plus rapide que ton écran. Maintenant peut-être que dans ton cas je me trompe mais voici une question pour pouvoir mieux t’aider:

  • Est-ce que quand tu donne une valeur fixe à ton écran LCD il affiche bien celle que tu as demandé ?

Et si ça marche toujours pas, ça pourrait être cool que tu fasses une vidéo rapide en montrant quand ça marche avec le moniteur et quand la valeur fluctue avec l’écran.

Bonne matinée !-

Édité par Unknown

Vive la science

+1 -0
Auteur du sujet

merci de ton aide Unknown ;) j’ai essayé ton 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
#include <LiquidCrystal.h>
LiquidCrystal lcd(11,10,5,4,3,2);

int sensor = A0;

int cpt = 0;
int valeur = 0;
const int TAB_SIZE = 10;

void setup() {
  lcd.begin(16,2);
  lcd.print(0);
  pinMode(sensor, INPUT);
}

void loop() {
  valeur += analogRead(sensor);
  cpt = (cpt + 1) % TAB_SIZE;

  if (cpt == 0){
    valeur /= TAB_SIZE;
    lcd.print(valeur);
    valeur = 0;
  }

  delay(500);
}

`

et la valeur ne fait qu’augmenter s’en s’arrêter. Sinon pour ta question, oui l’ecran affiche bien la valeur que je lui demande…

+0 -0

Le pinMode était inutile, l’autre, ça change presque rien pour ne pas dire rien mais au moins est est sûr de ce qu’on met. Sinon moi je trouve que les variations sont plutôt normales, tant que tu augmentes pas de 100 d’une minute à l’autre (à moins qu’il pleuve). Tu es sûr que ça continue de monter sans s’arrêter jusqu’à 1023 ?

Tu passes de 0 à 5V -> 0 à 1023 en nombre, donc si tu passes de 4.12V à 4.13V tu vas passer de 824 à 826. Tu as vu pourtant la faible variation de tension ?

Les modules grove "premiers prix" n’ont pas autant de précision que tu le souhaiterai peut-être, mais surtout, une variation d’une dizaine voir 20aine d’unité sans rien faire n’a rien de choquant pour moi.

Édité par Unknown

Vive la science

+1 -0
Auteur du sujet

donc c pas grave si la valeur n’est pas stables, j’ai vu sur le site du fabricant des photos exemples du capteur sur le moniteur série, et ça donne ça :Image utilisateur

et c’est déjà plus stable que chez moi, et le comportement du capteur semble différent…

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

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