Système d'irrigation automatique

Montage Arduino

Montage complet

Principe

L’irrigation est déclenchée de deux façons différentes.
Dans un premier temps, en utilisant un bouton.
Dans un deuxième temps, en utilisant un capteur d’humidité du sol. Nous prenons comme seuil de déclenchement une valeur de 30% d’humidité. La pompe à eau se mettra donc en marche pour une valeur d’humidité du sol inférieure à 30%.

Le déclenchement de la pompe à eau se fait par l’intermédiaire d’un relai.
lorsque celui-ci est en état haut (HIGH), la pompe à eau se met en marche.
lorsque celui-ci est en état bas (LOW), la pompe à eau s’arrête.

Les différents composants utilisés

Une platine de connexion

Un microcontrôleur - esp8266

Un microcontrôleur - esp8266

Un capteur d'humidité du sol

Un relai

Une pompe à eau

Un bouton

Le code

Déclenchement de l'irrigation à partir d'un bouton

Le montage Arduino correspond au montage complet présenté au début du tutoriel sans le capteur d’humidité.

Les deux premières lignes de code correspondent à la déclaration des pins de l’esp8266 sur lesquels sont branchés le bouton et le relai. Ces 2 composants doivent être branchés sur un port digital (D1, D2, D3 …) du microcontrôleur.
Attention, dans le code, il ne faut pas entrer le numéro du pin mais son équivalent que vous trouverez en cliquant sur le lien suivant GPIO ESP8266

Au final :
Le bouton est branché sur le pin D2 correspondant à 4 dans le code Arduino -> cable vert sur le montage complet vu au début du tutoriel.
Le relai est branché sur le pin D4 correspondant à 2 dans le code Arduino -> cable violet sur le montage complet vu au début du tutoriel.


#define btnPin 4
#define relayPin 2 

void setup() {

}

void loop() {

}

Dans la fonction setup(), nous rajoutons 2 lignes permettant de déclarer le bouton en INPUT_PULLUP (le microcontrôleur reçoit une information envoyée par le bouton) et le relai en OUTPUT (Le microcontrôleur envoie une information au relai).
Le mode du bouton est déclaré en INPUT_PULLUP et non en INPUT pour nous éviter de rajouter une résistance et d’utiliser celle intégrée à cet effet dans le microcontrôleur. Dans cette configuration, l’état du bouton est à l’état bas (valeur 0) lorsqu’il est appuyé et à l’état haut (valeur 1) lorqu’il est relaché.


#define btnPin 4
#define relayPin 2 

void setup() {
  pinMode(btnPin, INPUT_PULLUP);
  pinMode(relayPin, OUTPUT);
}

void loop() {
  
}

Nous déclarons à l’aide des 3 lignes supplémentaires insérées avant la fonction setup(), l’état du relai et du bouton. 2 états pour le bouton sont nécessaires afin de détecter un appui sur celui-ci.


#define btnPin 4
#define relayPin 2 

bool oldBtnState;
bool btnState;
bool relayState = 0;

void setup() {
  pinMode(btnPin, INPUT_PULLUP);
  pinMode(relayPin, OUTPUT);
}

void loop() {
  
}

Ensuite, les 2 lignes insérées dans la fonction loop() nous permettent de détecter un appui sur le bouton en comparant les 2 variables  oldBtnState et btnState.

La fonction digitalRead(btnPin) nous sert à lire l’état du bouton (0 ou 1 comme vu précédemment). 


#define btnPin 4
#define relayPin 2 

bool oldBtnState;
bool btnState;
bool relayState = 0;

void setup() {
  pinMode(btnPin, INPUT_PULLUP);
  pinMode(relayPin, OUTPUT);
}

void loop() {
  oldBtnState = btnState;
  btnState = digitalRead(btnPin);
}

Le reste du code permet de changer l’état du relai lors d’un appui sur le bouton. L’état ne change que lorsque le bouton est appuyé. Il ne doit pas changer lorsque le bouton est relâché (condition if (btnState == 0)).


#define btnPin 4
#define relayPin 2 

bool oldBtnState;
bool btnState;
bool relayState = 0;

void setup() {
  pinMode(btnPin, INPUT_PULLUP);
  pinMode(relayPin, OUTPUT);
}

void loop() {
  oldBtnState = btnState;
  btnState = digitalRead(btnPin);

  if (btnState != oldBtnState) {
    if (btnState == 0) {
      relayState = !relayState;
      digitalWrite(relayPin, relayState);
    }
  }

  delay(300);
}

Déclenchement de l'irrigation à partir du capteur d'humidité du sol

Le montage Arduino correspond au montage complet présenté au début du tutoriel sans le bouton.

Les deux premières lignes de code correspondent à la déclaration des pins de l’esp8266 sur lesquels sont branchés le capteur d’humidité et le relai. Le relai est branché sur un port digital (D1, D2, D3 …) et le capteur sur le port analogique AO du microcontrôleur.
Comme indiqué précédemment, pour le port digital, il ne faut pas entrer le numéro du pin mais son équivalent que vous trouverez en cliquant sur le lien suivant GPIO ESP8266

 

Au final :
Le relai est branché sur le pin D4 correspondant à 2 dans le code Arduino -> cable violet sur le montage complet vu au début du tutoriel.
Le capteur d’humidité est branché sur le pin A0 dans le code Arduino -> cable jaune sur le montage complet vu au début du tutoriel.


#define moisturePin A0
#define relayPin 2 

void setup() {

}

void loop() {
  
}

Dans la fonction setup(), nous rajoutons la ligne permettant de déclarer le relai en OUTPUT (le microcontrôleur envoie une information au relai).


#define moisturePin A0
#define relayPin 2 

void setup() {
  pinMode(moisturePin, INPUT);
  pinMode(relayPin, OUTPUT);
}

void loop() {
  
}

La nouvelle ligne de code saisie dans la fonction loop() nous sert à calibrer notre capteur. Pour cela, nous utilisons la fonction map.

Celle-ci prend 5 arguments.

  • Le premier argument (analogRead(moisturePin)) correspond à la valeur renvoyée par le capteur d’humidité.
  • Le deuxième argument est la valeur renvoyée par le capteur lorsque celui-ci est plongé dans l’eau (4eme argument correspondant à 100% d’humidité).
  • Le troisième argument est la valeur renvoyée par le capteur lorsque celui-ci est hors de l’eau (5eme argument correspondant à 0% d’humidité).

Calibrage du capteur d’humidité

Pour calibrer le capteur d’humidité, il faut afficher dans le moniteur en série la valeur renvoyée par le capteur en entrant les lignes de codes suivantes :

Dans la fonction setup()
Serial.begin(9600);

dans la fonction loop()
Serial.println(analogRead(moisturePin));
delay(500);

La valeur affichée dans le moniteur en série lorsque le capteur est immergé dans l’eau doit remplacer la valeur 280 dans le code ci-dessous.
La valeur affichée dans le moniteur en série lorsque le capteur est hors de l’eau doit remplacer la valeur 640 dans le code ci-dessous.


#define moisturePin A0
#define relayPin 2 

void setup() {
  pinMode(moisturePin, INPUT);
  pinMode(relayPin, OUTPUT);
}

void loop() {
  int moisture = map(analogRead(moisturePin), 280, 640, 100, 0);
}

Les dernières lignes de code à intégrer nous permettent de définir pour quelle valeur d’humidité la pompe se déclenchera. 
Littéralement, nous indiquons que si la température est inférieure ou égale à 30% (if(moisture <= 30%)), le relai se déclenche (donc la pompe se met en marche) sinon (température strictement supérieure à 30%), la pompe s’arrête.


#define moisturePin A0
#define relayPin 2

int humidityRate = 30; 

void setup() {
  pinMode(moisturePin, INPUT);
  pinMode(relayPin, OUTPUT);
}

void loop() {
  int moisture = map(analogRead(moisturePin), 280, 640, 100, 0);
  if (moisture <= humidityRate) {
    digitalWrite(relayPin, 1);
  } else {
    digitalWrite(relayPin, 0);
  }

  delay(300);
}