Problème utilisation de capteur humidité sol capacitif

J'ai réalisé un programme pour l'arrosage de 4 pots de fleurs, l'installation comporte: 4 capteurs capacitifs d'humidité sol V1.2, 4 modules relais 5V avec optocoupleur, 4 pompinettes avec alim 5v indépendantes et un écran lcd et avec I2C.
Le programme semble s'arrêter au contrôle du premier capteur qui lui démarre et arrête sa pompe en fonction du % d'humidité.
Ci-joint le programme arduino que j'ai réalisé, je ne suis pas un expert, mes premières programmations étaient en GWBASIC (toute une époque), est-ce que quelqu'un peut voir le problème, merci.
Ci_joint le programme:

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd (0x27, 16, 2);

int Capteur_Humidite_1; //la valeur lu par le capteur1
int Capteur_Humidite_2; //la valeur lu par le capteur2
int Capteur_Humidite_3; //la valeur lu par le capteur3
int Capteur_Humidite_4; //la valeur lu par le capteur4

int Pourcentage_Humidite_1; //la valeur en pourcentage de l'humidité
int Pourcentage_Humidite_2; //la valeur en pourcentage de l'humidité
int Pourcentage_Humidite_3; //la valeur en pourcentage de l'humidité
int Pourcentage_Humidite_4; //la valeur en pourcentage de l'humidité

int sec = 890; //la valeur maximale sortie du capteur 
int humide = 700; //la valeur minimale sortie capteur

int pompe1 = 7;//signal vers relais pompe1
int pompe2 = 6;//signal vers relais pompe2
int pompe3 = 5;//signal vers relais pompe3
int pompe4 = 4;//signal vers relais pompe4

void setup(){
       lcd.init(); 
       pinMode(pompe1, OUTPUT);
       pinMode(pompe2, OUTPUT);
       pinMode(pompe3, OUTPUT); 
       pinMode(pompe4, OUTPUT); 

       digitalWrite(pompe1, LOW);
       digitalWrite(pompe2, LOW);
       digitalWrite(pompe3, LOW);
       digitalWrite(pompe4, LOW);
     
   }
void loop(){  

  
  Capteur_Humidite_1 = analogRead(A0) ;//lire la valeur retournée par le capteur1 de l’humidité
  Capteur_Humidite_2 = analogRead(A1) ;//lire la valeur retournée par le capteur2 de l’humidité
  Capteur_Humidite_3 = analogRead(A2) ;//lire la valeur retournée par le capteur3 de l’humidité
  Capteur_Humidite_4 = analogRead(A3) ;//lire la valeur retournée par le capteur4 de l’humidité
 
  Pourcentage_Humidite_1 = map(Capteur_Humidite_1, sec, humide, 0, 100); //On transforme nos valeurs en pourcentage  
  Pourcentage_Humidite_2 = map(Capteur_Humidite_2, sec, humide, 0, 100); //On transforme nos valeurs en pourcentage
  Pourcentage_Humidite_3 = map(Capteur_Humidite_3, sec, humide, 0, 100); //On transforme nos valeurs en pourcentage
  Pourcentage_Humidite_4 = map(Capteur_Humidite_4, sec, humide, 0, 100); //On transforme nos valeurs en pourcentage

  lcd.backlight();
  lcd.setCursor(0, 0);
    lcd.print("C1:");
  lcd.setCursor(3, 0);
    lcd.print(Pourcentage_Humidite_1);
   lcd.setCursor(5, 0);
    lcd.print("%");
  lcd.setCursor(7, 0); 
    lcd.print("C2:");
  lcd.setCursor(10, 0);
    lcd.print(Pourcentage_Humidite_2);
   lcd.setCursor(12, 0);
    lcd.print("%");
     lcd.setCursor(0, 1);
    lcd.print("C3:");
  lcd.setCursor(3, 1);
    lcd.print(Pourcentage_Humidite_3);
   lcd.setCursor(5, 1);
    lcd.print("%");
    lcd.setCursor(7, 1); 
    lcd.print("C4:");
  lcd.setCursor(10, 1);
    lcd.print(Pourcentage_Humidite_4);
   lcd.setCursor(12, 1);
    lcd.print("%"); 

       
      if(Pourcentage_Humidite_1<40) {digitalWrite(pompe1, HIGH);} //la pompe démarre <40% elle s'arrête >60%    
      if(Pourcentage_Humidite_1>60) {digitalWrite(pompe1, LOW);}  // elle s'arrête >60%

      if(Pourcentage_Humidite_2<40) {digitalWrite(pompe2, HIGH);}
      if(Pourcentage_Humidite_2>60) {digitalWrite(pompe2, LOW);}

      if(Pourcentage_Humidite_3<40) {digitalWrite(pompe3, HIGH);}
      if(Pourcentage_Humidite_3>60) {digitalWrite(pompe3, LOW);} 

      if(Pourcentage_Humidite_4<40) {digitalWrite(pompe4, HIGH);}
      if(Pourcentage_Humidite_4>60) {digitalWrite(pompe4, LOW);}
    
  } 


:warning: la section Réalisations et Projets Finis est réservée aux présentations de projets fonctionnels terminés. ce n'est pas votre cas ➜ il faut poster dans le forum francophone général.

Merci de prendre en compte les recommandations listées dans "Les bonnes pratiques du Forum Francophone”

je déplace cette discussion pour cette fois, merci d'en tenir compte la prochaine fois.

hello
tu es trop restrictif dans tes map
imagine que capeur humidité te retourne "0"
que te retourne la fovtion map()

j'ai testé ça:

Capteur_Humidite_1 = analogRead(A0) ;//lire la valeur retournée par le capteur1 de l’humidité
  Capteur_Humidite_1 =0;
  
  Pourcentage_Humidite_1 = map(Capteur_Humidite_1, sec, humide, 0, 100); //On transforme nos valeurs en pourcentage  
  Serial.println(Pourcentage_Humidite_1);
  while(1);

j'obtiens 468

testes avec:


  Pourcentage_Humidite_1 = map(Capteur_Humidite_1, 0,1023, 0, 100)

et modifie tes seuils de comparaison en fonction

Mon problème est qu'il y a blocage sur le premier capteur celui-ci fonctionne bien mais rien ne fonctionne sur les trois autres, j'ai donc inversé l'affectation pin 7 et 8 dans le programme concrètement le capteur 1 arrive derrière le capteur cela n'a rien changé celui-ci même en position 2 dans le programme est toujours le seul à fonctionner (les capteurs par eux même ne sont pas à incriminer je les ai intervertis et le problème est toujours le même.
Demain je vais essayer un programme sans l'écran crystal LCD et module I2C.

Ta fourchette de contrôle est 700 à 880.
Tu te trompes dans le paramétrage de la fonction Map().
Traduit autrement, tu lui demandes de te retourner une valeur entre 0 et 100 qui soit proportionnelle à la valeur comprise entre 700 et 880.
Mais tu lui donnes une valeur entre 0 et 1023.
Que te retourne la fonction Map() lorsque tu lui donnes une valeur de 300 par exemple???
Rappel: la fonction analogRead(capteur) retourne une valeur comprise entre 0 et 1023.

hello
j'ai modifié ton prg pour afficher les valeurs que tu lui fais calculer
j'ai rajouté le serial.begin(115200); et rajouté un while(1); pour stopper la loop.
voici les résultats calculés avec tes map()
image
voici ton prg modifié pour avoir l'affichage au moniteur

LiquidCrystal_I2C lcd(0x27, 16, 2);

int Capteur_Humidite_1;  //la valeur lu par le capteur1
int Capteur_Humidite_2;  //la valeur lu par le capteur2
int Capteur_Humidite_3;  //la valeur lu par le capteur3
int Capteur_Humidite_4;  //la valeur lu par le capteur4

int Pourcentage_Humidite_1;  //la valeur en pourcentage de l'humidité
int Pourcentage_Humidite_2;  //la valeur en pourcentage de l'humidité
int Pourcentage_Humidite_3;  //la valeur en pourcentage de l'humidité
int Pourcentage_Humidite_4;  //la valeur en pourcentage de l'humidité

int sec = 890;     //la valeur maximale sortie du capteur
int humide = 700;  //la valeur minimale sortie capteur

int pompe1 = 7;  //signal vers relais pompe1
int pompe2 = 6;  //signal vers relais pompe2
int pompe3 = 5;  //signal vers relais pompe3
int pompe4 = 4;  //signal vers relais pompe4

void setup() {
  //      lcd.init();
  pinMode(pompe1, OUTPUT);
  pinMode(pompe2, OUTPUT);
  pinMode(pompe3, OUTPUT);
  pinMode(pompe4, OUTPUT);

  digitalWrite(pompe1, LOW);
  digitalWrite(pompe2, LOW);
  digitalWrite(pompe3, LOW);
  digitalWrite(pompe4, LOW);
  Serial.begin(115200);
  Serial.println("fin setup ");
}
void loop() {


  Capteur_Humidite_1 = analogRead(A0);  //lire la valeur retournée par le capteur1 de l’humidité
  Capteur_Humidite_2 = analogRead(A1);  //lire la valeur retournée par le capteur2 de l’humidité
  Capteur_Humidite_3 = analogRead(A2);  //lire la valeur retournée par le capteur3 de l’humidité
  Capteur_Humidite_4 = analogRead(A3);  //lire la valeur retournée par le capteur4 de l’humidité

  Capteur_Humidite_1 = 280;  //lire la valeur retournée par le capteur1 de l’humidité
  Capteur_Humidite_2 = 660;  //lire la valeur retournée par le capteur2 de l’humidité
  Capteur_Humidite_3 = 800;  //lire la valeur retournée par le capteur3 de l’humidité
  Capteur_Humidite_4 = 950;

  Pourcentage_Humidite_1 = map(Capteur_Humidite_1, sec, humide, 0, 100);  //On transforme nos valeurs en pourcentage
  Serial.println(Pourcentage_Humidite_1);
  Pourcentage_Humidite_2 = map(Capteur_Humidite_2, sec, humide, 0, 100);  //On transforme nos valeurs en pourcentage
  Serial.println(Pourcentage_Humidite_2);
  Pourcentage_Humidite_3 = map(Capteur_Humidite_3, sec, humide, 0, 100);  //On transforme nos valeurs en pourcentage
  Serial.println(Pourcentage_Humidite_3);
  Pourcentage_Humidite_4 = map(Capteur_Humidite_4, sec, humide, 0, 100);  //On transforme nos valeurs en pourcentage
  Serial.println(Pourcentage_Humidite_4);
  Serial.flush();
  while (1)
    ;
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("C1:");
  lcd.setCursor(3, 0);
  lcd.print(Pourcentage_Humidite_1);
  lcd.setCursor(5, 0);
  lcd.print("%");
  lcd.setCursor(7, 0);
  lcd.print("C2:");
  lcd.setCursor(10, 0);
  lcd.print(Pourcentage_Humidite_2);
  lcd.setCursor(12, 0);
  lcd.print("%");
  lcd.setCursor(0, 1);
  lcd.print("C3:");
  lcd.setCursor(3, 1);
  lcd.print(Pourcentage_Humidite_3);
  lcd.setCursor(5, 1);
  lcd.print("%");
  lcd.setCursor(7, 1);
  lcd.print("C4:");
  lcd.setCursor(10, 1);
  lcd.print(Pourcentage_Humidite_4);
  lcd.setCursor(12, 1);
  lcd.print("%");


  if (Pourcentage_Humidite_1 < 40) { digitalWrite(pompe1, HIGH); }  //la pompe démarre <40% elle s'arrête >60%
  if (Pourcentage_Humidite_1 > 60) { digitalWrite(pompe1, LOW); }   // elle s'arrête >60%

  if (Pourcentage_Humidite_2 < 40) { digitalWrite(pompe2, HIGH); }
  if (Pourcentage_Humidite_2 > 60) { digitalWrite(pompe2, LOW); }

  if (Pourcentage_Humidite_3 < 40) { digitalWrite(pompe3, HIGH); }
  if (Pourcentage_Humidite_3 > 60) { digitalWrite(pompe3, LOW); }

  if (Pourcentage_Humidite_4 < 40) { digitalWrite(pompe4, HIGH); }
  if (Pourcentage_Humidite_4 > 60) { digitalWrite(pompe4, LOW); }
}

voici le resultat avec les parametres "sec" et "humidité" remis dans le bon ordre dans la MAP()
image

et maintenant avec la map() initialisée comme je te le dis depuis le debut
image

ensuite, les résultats avec des valeurs forcées pour etre entre 40 et 60
image
et le prg

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);

int Capteur_Humidite_1;  //la valeur lu par le capteur1
int Capteur_Humidite_2;  //la valeur lu par le capteur2
int Capteur_Humidite_3;  //la valeur lu par le capteur3
int Capteur_Humidite_4;  //la valeur lu par le capteur4

int Pourcentage_Humidite_1;  //la valeur en pourcentage de l'humidité
int Pourcentage_Humidite_2;  //la valeur en pourcentage de l'humidité
int Pourcentage_Humidite_3;  //la valeur en pourcentage de l'humidité
int Pourcentage_Humidite_4;  //la valeur en pourcentage de l'humidité

int sec = 1023;     //la valeur maximale sortie du capteur
int humide = 0;  //la valeur minimale sortie capteur

int pompe1 = 7;  //signal vers relais pompe1
int pompe2 = 6;  //signal vers relais pompe2
int pompe3 = 5;  //signal vers relais pompe3
int pompe4 = 4;  //signal vers relais pompe4

void setup() {
  //      lcd.init();
  pinMode(pompe1, OUTPUT);
  pinMode(pompe2, OUTPUT);
  pinMode(pompe3, OUTPUT);
  pinMode(pompe4, OUTPUT);

  digitalWrite(pompe1, LOW);
  digitalWrite(pompe2, LOW);
  digitalWrite(pompe3, LOW);
  digitalWrite(pompe4, LOW);
  Serial.begin(115200);
  Serial.println("fin setup ");
}
void loop() {


  Capteur_Humidite_1 = analogRead(A0);  //lire la valeur retournée par le capteur1 de l’humidité
  Capteur_Humidite_2 = analogRead(A1);  //lire la valeur retournée par le capteur2 de l’humidité
  Capteur_Humidite_3 = analogRead(A2);  //lire la valeur retournée par le capteur3 de l’humidité
  Capteur_Humidite_4 = analogRead(A3);  //lire la valeur retournée par le capteur4 de l’humidité

  Capteur_Humidite_1 = 612;  //lire la valeur retournée par le capteur1 de l’humidité
  Capteur_Humidite_2 = 550;  //lire la valeur retournée par le capteur2 de l’humidité
  Capteur_Humidite_3 = 500;  //lire la valeur retournée par le capteur3 de l’humidité
  Capteur_Humidite_4 = 410;

  Pourcentage_Humidite_1 = map(Capteur_Humidite_1,  humide,sec, 0, 100);  //On transforme nos valeurs en pourcentage
  Serial.println(Pourcentage_Humidite_1);
  Pourcentage_Humidite_2 = map(Capteur_Humidite_2,  humide,sec, 0, 100);  //On transforme nos valeurs en pourcentage
  Serial.println(Pourcentage_Humidite_2);
  Pourcentage_Humidite_3 = map(Capteur_Humidite_3,  humide,sec, 0, 100);  //On transforme nos valeurs en pourcentage
  Serial.println(Pourcentage_Humidite_3);
  Pourcentage_Humidite_4 = map(Capteur_Humidite_4,  humide,sec, 0, 100);  //On transforme nos valeurs en pourcentage
  Serial.println(Pourcentage_Humidite_4);
  Serial.flush();
  while (1);
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("C1:");
  lcd.setCursor(3, 0);
  lcd.print(Pourcentage_Humidite_1);
  lcd.setCursor(5, 0);
  lcd.print("%");
  lcd.setCursor(7, 0);
  lcd.print("C2:");
  lcd.setCursor(10, 0);
  lcd.print(Pourcentage_Humidite_2);
  lcd.setCursor(12, 0);
  lcd.print("%");
  lcd.setCursor(0, 1);
  lcd.print("C3:");
  lcd.setCursor(3, 1);
  lcd.print(Pourcentage_Humidite_3);
  lcd.setCursor(5, 1);
  lcd.print("%");
  lcd.setCursor(7, 1);
  lcd.print("C4:");
  lcd.setCursor(10, 1);
  lcd.print(Pourcentage_Humidite_4);
  lcd.setCursor(12, 1);
  lcd.print("%");


  if (Pourcentage_Humidite_1 < 40) { digitalWrite(pompe1, HIGH); }  //la pompe démarre <40% elle s'arrête >60%
  if (Pourcentage_Humidite_1 > 60) { digitalWrite(pompe1, LOW); }   // elle s'arrête >60%

  if (Pourcentage_Humidite_2 < 40) { digitalWrite(pompe2, HIGH); }
  if (Pourcentage_Humidite_2 > 60) { digitalWrite(pompe2, LOW); }

  if (Pourcentage_Humidite_3 < 40) { digitalWrite(pompe3, HIGH); }
  if (Pourcentage_Humidite_3 > 60) { digitalWrite(pompe3, LOW); }

  if (Pourcentage_Humidite_4 < 40) { digitalWrite(pompe4, HIGH); }
  if (Pourcentage_Humidite_4 > 60) { digitalWrite(pompe4, LOW); }
}

et pour finir
les resultats avec les valeurs forcées correspondant aux valeurs de tes retours de capteurs
image

et le prog avec les valeurs forcées correspondant aux valeurs de tes retours de capteurs , la map() correctement parametrée et les seuils de comparaison dans les if recalculés

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);

int Capteur_Humidite_1;  //la valeur lu par le capteur1
int Capteur_Humidite_2;  //la valeur lu par le capteur2
int Capteur_Humidite_3;  //la valeur lu par le capteur3
int Capteur_Humidite_4;  //la valeur lu par le capteur4

int Pourcentage_Humidite_1;  //la valeur en pourcentage de l'humidité
int Pourcentage_Humidite_2;  //la valeur en pourcentage de l'humidité
int Pourcentage_Humidite_3;  //la valeur en pourcentage de l'humidité
int Pourcentage_Humidite_4;  //la valeur en pourcentage de l'humidité

int sec = 1023;     //la valeur maximale sortie du capteur
int humide = 0;  //la valeur minimale sortie capteur

int pompe1 = 7;  //signal vers relais pompe1
int pompe2 = 6;  //signal vers relais pompe2
int pompe3 = 5;  //signal vers relais pompe3
int pompe4 = 4;  //signal vers relais pompe4

void setup() {
  //      lcd.init();
  pinMode(pompe1, OUTPUT);
  pinMode(pompe2, OUTPUT);
  pinMode(pompe3, OUTPUT);
  pinMode(pompe4, OUTPUT);

  digitalWrite(pompe1, LOW);
  digitalWrite(pompe2, LOW);
  digitalWrite(pompe3, LOW);
  digitalWrite(pompe4, LOW);
  Serial.begin(115200);
  Serial.println("fin setup ");
}
void loop() {


  Capteur_Humidite_1 = analogRead(A0);  //lire la valeur retournée par le capteur1 de l’humidité
  Capteur_Humidite_2 = analogRead(A1);  //lire la valeur retournée par le capteur2 de l’humidité
  Capteur_Humidite_3 = analogRead(A2);  //lire la valeur retournée par le capteur3 de l’humidité
  Capteur_Humidite_4 = analogRead(A3);  //lire la valeur retournée par le capteur4 de l’humidité

  Capteur_Humidite_1 = 720;  //lire la valeur retournée par le capteur1 de l’humidité
  Capteur_Humidite_2 = 780;  //lire la valeur retournée par le capteur2 de l’humidité
  Capteur_Humidite_3 = 820;  //lire la valeur retournée par le capteur3 de l’humidité
  Capteur_Humidite_4 = 870;

  Pourcentage_Humidite_1 = map(Capteur_Humidite_1,  humide,sec, 0, 100);  //On transforme nos valeurs en pourcentage
  Serial.println(Pourcentage_Humidite_1);
  Pourcentage_Humidite_2 = map(Capteur_Humidite_2,  humide,sec, 0, 100);  //On transforme nos valeurs en pourcentage
  Serial.println(Pourcentage_Humidite_2);
  Pourcentage_Humidite_3 = map(Capteur_Humidite_3,  humide,sec, 0, 100);  //On transforme nos valeurs en pourcentage
  Serial.println(Pourcentage_Humidite_3);
  Pourcentage_Humidite_4 = map(Capteur_Humidite_4,  humide,sec, 0, 100);  //On transforme nos valeurs en pourcentage
  Serial.println(Pourcentage_Humidite_4);
  Serial.flush();
  while (1);
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("C1:");
  lcd.setCursor(3, 0);
  lcd.print(Pourcentage_Humidite_1);
  lcd.setCursor(5, 0);
  lcd.print("%");
  lcd.setCursor(7, 0);
  lcd.print("C2:");
  lcd.setCursor(10, 0);
  lcd.print(Pourcentage_Humidite_2);
  lcd.setCursor(12, 0);
  lcd.print("%");
  lcd.setCursor(0, 1);
  lcd.print("C3:");
  lcd.setCursor(3, 1);
  lcd.print(Pourcentage_Humidite_3);
  lcd.setCursor(5, 1);
  lcd.print("%");
  lcd.setCursor(7, 1);
  lcd.print("C4:");
  lcd.setCursor(10, 1);
  lcd.print(Pourcentage_Humidite_4);
  lcd.setCursor(12, 1);
  lcd.print("%");


  if (Pourcentage_Humidite_1 < 68) { digitalWrite(pompe1, HIGH); }  //la pompe démarre <40% elle s'arrête >60%
  if (Pourcentage_Humidite_1 > 86) { digitalWrite(pompe1, LOW); }   // elle s'arrête >60%

  if (Pourcentage_Humidite_2 < 68) { digitalWrite(pompe2, HIGH); }
  if (Pourcentage_Humidite_2 > 86) { digitalWrite(pompe2, LOW); }

  if (Pourcentage_Humidite_3 < 68) { digitalWrite(pompe3, HIGH); }
  if (Pourcentage_Humidite_3 > 86) { digitalWrite(pompe3, LOW); }

  if (Pourcentage_Humidite_4 < 68) { digitalWrite(pompe4, HIGH); }
  if (Pourcentage_Humidite_4 > 86) { digitalWrite(pompe4, LOW); }
}

alors ?

Mon programme était bon, j'avais inversé les sorties vers les relais au lieu de 7 5 6 4, j'avais mis 7 8 9 10, mais quant on est sur ....!
Pour ce qui est des capteurs, j'ai procédé ainsi la plage pour 5V est de 1023, j'ai donc testé les 4 capteurs qui avaient quasiment les mêmes valeurs qui sont à SEC 890 et humide 700, donc dans la fonction MAP je transforme les valeurs reçues des capteurs en inversant le SEC qui devient 0% pour 890 et l'HUMIDE devient 100% pour 700 donc la plage entre 890 et 700 devient 0 et 100%. Lors de l'essai les capteurs arment les pompes à 40% et les arrêtent à 60% .il est possible de les contrôler car le fait de le passer de sec à humide le capteur capacitif varie assez lentement pour arriver à noter les seuils .
Il me reste à vérifier que l'arrosage n'est pas trop ou pas assez suffisant.