Problème d'arrosage automatisé de serre

Bonjour, débutante dans la programmation. À la demande d'un professeur pour un nouveau volet environnement. L'écran LCD, inscrit des résultats environ 3 minutes et ensuite elle affiche un symbole de $. De plus, les pompes ne se mettent pas en marche tel que demandé selon un range d'humidité. Nos capteurs donnent des résultats différents l'un de l'autre et nous comprenons pas comment calibrer ceux-ci. Nous avons réussi à se rendre à cette programmation après plusieurs recherche sur internet et plusieurs tests. Mais nous sommes bloquer et les élèves attendent après nous. Merci pour votre aide.

#include <Wire.h>
#include <LiquidCrystal_I2C.h> // Ecran LCD I2C




int CapteurH1 = A0;  // Pin pour le capteur d'humidité
int Valeur_Humidite1;
int Pourcentage_Humidite1;
int sec1 = 1167; 
int humide1 = 357; 
int Relais1 = 3;    // Pin pour le relais

int CapteurH2 = A1;  // Pin pour le capteur d'humidité
int Valeur_Humidite2;
int Pourcentage_Humidite2;
int sec2 = 1167; 
int humide2 = 357; 
int Relais2 = 4;    // Pin pour le relais

int CapteurH3 = A2;  // Pin pour le capteur d'humidité
int Valeur_Humidite3;
int Pourcentage_Humidite3;
int sec3 = 1167; 
int humide3 = 357; 
int Relais3 = 5;    // Pin pour le relais

int CapteurH4 = A3;  // Pin pour le capteur d'humidité
int Valeur_Humidite4;
int Pourcentage_Humidite4;
int sec4 = 1167; 
int humide4 = 357; 
int Relais4 = 6;    // Pin pour le relais

LiquidCrystal_I2C lcd(0x27,16,2); //Ecran LCD I2C

void setup() {

Serial.begin(9600);
lcd.begin(16,2);
lcd.clear();
lcd.init();



pinMode(Relais1, OUTPUT); 
pinMode(Relais2, OUTPUT);
pinMode(Relais3, OUTPUT);
pinMode(Relais4, OUTPUT);



}

void loop() {

  digitalWrite(Relais1, HIGH);
  digitalWrite(Relais2, HIGH);
  digitalWrite(Relais3, HIGH);
  digitalWrite(Relais4, HIGH);

lcd.backlight();
lcd.clear();
lcd.setCursor(0,0);
lcd.print("C1:");
lcd.print(Pourcentage_Humidite1);
lcd.print("%");
lcd.print("  C3:");
lcd.print(Pourcentage_Humidite3);
lcd.print("%");
lcd.setCursor(0,1);
lcd.print("C2:");
lcd.print(Pourcentage_Humidite2);
lcd.print("%");
lcd.print("   C4:");
lcd.print(Pourcentage_Humidite4);
lcd.print("%");
delay(5000);
lcd.clear();

 
  
Valeur_Humidite1 = analogRead(CapteurH1); // Lecture de la valeur du capteur d'humidité
Pourcentage_Humidite1 = map(Valeur_Humidite1,sec1,humide1,0,100);
Serial.print("Humidite du sol1= ");
Serial.print(Pourcentage_Humidite1);
Serial.println("%");

  //déterminé sir le sol est sec ou humide
 if (Pourcentage_Humidite1< 20) {           // Si le niveau d'humidité est inférieur au seuil
  digitalWrite(Relais1,LOW );        // Allume le relais pour activer la pompe à eau
 
    }

   else if (Pourcentage_Humidite1> 25){ 
  digitalWrite(Relais1,HIGH);         // Éteint le relais pour désactiver la pompe à eau
  }

 delay(3000);



Valeur_Humidite2 = analogRead(CapteurH2); // Lecture de la valeur du capteur d'humidité
Pourcentage_Humidite2 = map(Valeur_Humidite2,sec2,humide2,0,100);
Serial.print("Humidite du sol2= ");
Serial.print(Pourcentage_Humidite2);
Serial.println("%");

  //déterminé sir le sol est sec ou humide
 if (Pourcentage_Humidite2< 25) {           // Si le niveau d'humidité est inférieur au seuil
  digitalWrite(Relais2,LOW );        // Allume le relais pour activer la pompe à eau
 
    }

   else if (Pourcentage_Humidite1> 30) { 
  digitalWrite(Relais2,HIGH);         // Éteint le relais pour désactiver la pompe à eau
  
  }
 delay(3000);

Valeur_Humidite3 = analogRead(CapteurH3); // Lecture de la valeur du capteur d'humidité
Pourcentage_Humidite3 = map(Valeur_Humidite3,sec3,humide3,0,100);
Serial.print("Humidite du sol3= ");
Serial.print(Pourcentage_Humidite3);
Serial.println("%");

  //déterminé sir le sol est sec ou humide
 if (Pourcentage_Humidite3 < 30) {           // Si le niveau d'humidité est inférieur au seuil
  digitalWrite(Relais3,LOW );        // Allume le relais pour activer la pompe à eau
 
    }

   else if (Pourcentage_Humidite1> 35) { 
  digitalWrite(Relais3,HIGH);         // Éteint le relais pour désactiver la pompe à eau
  
  }

 delay(3000);

Valeur_Humidite4 = analogRead(CapteurH4); // Lecture de la valeur du capteur d'humidité
Pourcentage_Humidite4 = map(Valeur_Humidite4,sec4,humide4,0,100);
Serial.print("Humidite du sol4= ");
Serial.print(Pourcentage_Humidite4);
Serial.println("%");

  //déterminé sir le sol est sec ou humide
 if (Pourcentage_Humidite4 < 35) {           // Si le niveau d'humidité est inférieur au seuil
  digitalWrite(Relais4,LOW );        // Allume le relais pour activer la pompe à eau
 
    }

   else if (Pourcentage_Humidite1> 40){ 
  digitalWrite(Relais4,HIGH);         // Éteint le relais pour désactiver la pompe à eau
  
  }
delay(3000); 
     
   }  

:warning:
Post mis dans la mauvaise section, on parle anglais dans les forums généraux. déplacé vers le forum francophone.

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

Bonjour, J'ai lu le document et j'ai inscrit forum francophone, il y a aussi un carré bleu sur mon message qui dit Français. Je ne comprend pas ou je dois aller et ce que j'ai fais de pas correct.

Bonjour,

Premièrement, les pins des capteurs ne sont pas déclarés clairement comme INPUT dans le setup. Il me semble que par défaut c'est une INPUT mais tout de même, surtout si c'est destiné à des élèves il vaut mieux tout bien faire.

Ensuite, vous avez 4 capteurs avec les mêmes paramètres d'entrées, la même manière de les structurer. Je suggère de créer une structure

// Définition de la structure pour un capteur d'humidité
struct CapteurHumidite {
  int pinCapteur;
  int valeur;
  int pourcentage;
  int sec;
  int humide;
  int pinRelais;
};

// Déclaration des 4 capteurs individuellement
CapteurHumidite capteur1 = {A0, 0, 0, 1167, 357, 3};
CapteurHumidite capteur2 = {A1, 0, 0, 1167, 357, 4};
CapteurHumidite capteur3 = {A2, 0, 0, 1167, 357, 5};
CapteurHumidite capteur4 = {A3, 0, 0, 1167, 357, 6};

// Vous pourrez ensuite les utiliser dans une boucle for etc

Quoi qu'il en soit, vous donnez ni le modèle des capteurs, ni le modèle de l'écran LCD. D'ailleurs on ne sait pas non plus sur quel Arduino vous travaillez.
Un schéma de câblage serait aussi grandement apprécié !
Pendant ces 3min, l'écran affiche ce que vous voulez ou c'est aléatoire ?

Il est surprenant aussi de déclarer tous les relays en HIGH dans la boucle loop(). Je pense que c'est une erreur et que c'est destiner à aller dans la boucle setup().

De la manière dont c'est, même si vous mettez la sortie à LOW, quelques secondes plus tard vous remettez tout à HIGH...

Comment sont branchés les relais ? (Et si vous avez une pompe de l’autre côté - est-ce protégé ? Diode de roue libre etc)

Notez aussi que si vous alternez la lecture des broches analogiques il vaut mieux parfois faire deux lectures et jeter la première pour laisser la tension se stabiliser.

En gros faire

Valeur_Humidite1 = analogRead(CapteurH1); // Lecture de la valeur du capteur d'humidité inutilisée pour stabiliser la tension 

Valeur_Humidite1 = analogRead(CapteurH1); // Lecture de la valeur du capteur d'humidité
Pourcentage_Humidite1 = map(Valeur_Humidite1,sec1,humide1,0,100);

Bonjour J-M-L Jackson,

Nous avons pas de diode dans notre circuit non avant ou après nos pompes. Nous pensions que le relais gérait le tout. Nous sommes très débutantes. Tout allait bien avant que nous décidions de mettre notre Écran LCD I2C. Nos capteurs d'humidité sont des .V1.2

Nous avons tenter votre suggestion d'ajouter une deuxième lecture, mais notre écran après quelques secondes affiche pleins de symboles sur l'écran et crée un bruit dans le relais.

Je tente de mettre une photo de notre montage.

Schéma de circuit ensemble chariot et lcd.pdf (249,5 Ko)

Merci et bonne journée

Bonjour,

Vous n'avez pas rebondi sur le post#4 ni sur le suivant

Sur votre schéma, est-ce une représentation ou est-ce réellement comme ça ?
Il faudrait trouver une autre source de 5V (une vraie) pour alimenter les moteurs, les relais, ainsi que l'écran (et les capteurs tant qu'à faire). Si les moteurs tournent, vous tirez beaucoup trop de courant depuis la carte !

Egalement,

Il y a beaucoup plus de chances que ce soit l'inverse qui se produise.

En raison de mes remarques précédentes, j'ai du mal à croire que le code fonctionnait. Je pense que vous avez modifié d'autres choses en même temps que l'ajout de l'écran LCD, notamment les instructions

  digitalWrite(Relais1, HIGH);
  digitalWrite(Relais2, HIGH);
  digitalWrite(Relais3, HIGH);
  digitalWrite(Relais4, HIGH);

qui ne font aucun sens pour moi dans le loop(). Pouvez-vous expliquer ce choix ?

Votre arduino ne peut pas servir d’alimentation pour les relais et les moteurs. Il faut une autre source de courant .

Votre image pour ceux qui ne veulent pas cliquer sur le pdf