Arroser automatiquement en cas d'absence

Bonjour,
Arrosez vos plantes, avec juste ce qu’il faut, lorsque vous êtes absents

Comment vont tenir mes plantes en mon absence ? Question fréquente en période de vacances.

À défaut de charger quelqu’un d’y veiller, il existe de petits automates programmables qui peuvent servir. Le risque est cependant d’utiliser trop d’eau ou pas assez.Seul la mesure de l’humidité de la terre permet de doser correctement l’arrosage .

Vue1

Par chance, il existe dans le monde Arduino un capteur efficace et bon marché qui peut servir. Il s'agit du Capteur d'Humidité du Sol Module Capacitif Hygromètre V1.2 AZDelivery compatible avec Arduino et Raspberry.

En relation avec un Arduino Nano, un barre-graphe d’affichage, un module relais statique, une petite pompe et un bloc d’alimentation, on peut faire passer d’un réservoir à la plante juste la quantité d’eau qui lui est nécessaire. Le tout dans le volume très réduit d’un morceau de moulure électrtique. Le barre-graphe et le pot. de réglage viendront en superposition.

Le schéma de câblage saisi avec Kicad es le suivant :

Et le programme implanté par l’IDE d’Arduino est donné ci-après :



//initialisation capteur
const int dry = 680; // seuil du capteur pour terre sèche 595 en principe

const int wet = 270; // seuil du capteur pour terre humide 239 en principe

void setup()
{
 // analogique A5 : Sonde
  // analogique A6: Consigne
  pinMode(2, OUTPUT);       //led rouge très sec
  pinMode(3, OUTPUT);       //led rouge  sec
  pinMode(4, OUTPUT);       //led orange moyen-
  pinMode(5, OUTPUT);       //led orange moyen
  pinMode(6, OUTPUT);       //led orange moyen+
  pinMode(7, OUTPUT);       //led verte humide-
  pinMode(8, OUTPUT);       //led verte humide
  pinMode(9, OUTPUT);       //led verte humide+
  pinMode(10, OUTPUT);      //led verte très humide
  pinMode(11, OUTPUT);      //led verte très humide+
  pinMode(12, OUTPUT);      //led violet Humid 100%
  pinMode(13, OUTPUT);      //commande pompe
 /* Serial.begin(9600);  // decommenter pour mise au point */

}

void loop() {

  delay(40);
  // réacquisition de l'humidité
  int sensorVal = analogRead(A5);
  int humid1 = map(sensorVal, wet, dry, 100, 0);
  sensorVal = analogRead(A6);
  int humid2 = map(sensorVal, wet, dry, 100, 0);

  /*  Serial.print(humid1);
      Serial.print("    ");
      Serial.println(humid2);   //décommenter pour mise au point
      delay(1500);
  */
  int i;
  bool ouvre = false;
  if (humid1 <= 10)  {
    digitalWrite(2, LOW);
  }
  else {
    digitalWrite(2, HIGH);
  }
  if (humid1 > 10 && humid1 <= 20)  {
    digitalWrite(3, LOW);
  }
  else {
    digitalWrite(3, HIGH);
  }
  if (humid1 > 20 && humid1 <= 30)  {
    digitalWrite(4, LOW);
  }
  else {
    digitalWrite(4, HIGH);
  }
  if (humid1 > 30 && humid1 <= 40)  {
    digitalWrite(5, LOW);
  }
  else {
    digitalWrite(5, HIGH);
  }
  if (humid1 > 40 && humid1 <= 50)  {
    digitalWrite(6, LOW);
  }
  else {
    digitalWrite(6, HIGH);
  }
  if (humid1 > 50 && humid1 <= 60)  {
    digitalWrite(7, LOW);
  }
  else {
    digitalWrite(7, HIGH);
  }
  if (humid1 > 60 && humid1 <= 70)  {
    digitalWrite(8, LOW);
  }
  else {
    digitalWrite(8, HIGH);
  }
  if (humid1 > 70 && humid1 <= 80)  {
    digitalWrite(9, LOW);
  }
  else {
    digitalWrite(9, HIGH);
  }
  if (humid1 > 80 && humid1 <= 90)  {
    digitalWrite(10, LOW);
  }
  else {
    digitalWrite(10, HIGH);
  }
  if (humid1 > 90 )  {
    digitalWrite(11, LOW);
  }
  else {
    digitalWrite(11, HIGH);
  }

  if (humid1 < humid2)
  {
    digitalWrite(13, HIGH);
  }
  else
  {
    digitalWrite(13, LOW);
  }

}

outre les images, le post est mal formaté

Merci d'éditer votre post en utilisant le :pencil2: dans la barre d'outil juste sous votre post et rajoutez les balises de de code (c'est difficilement lisible tel quel) :

  • sélectionner la partie du texte qui correspond au code
  • appuyez sur l'icône <code/> dans la barre d'outils pour indiquer que c'est du code

(Assurez vous aussi d'indenter le code correctement dans l'IDE avant de le copier pour le coller ici. Cela se fait en pressant ctrlT sur PC ou cmdT sur un Mac)

il serait bon de (re)lire les recommandations listées dans "Les bonnes pratiques du Forum Francophone”

Bonjour,
Merci pour vos remarques venues en cours d'édition.
J'avais tenté de coller en une fois un document complet. J'ai vu que ce n'était pas la méthode. Il me semble avoir tout mis en ordre.

1 Like

Merci d'avoir fait le ménage (il manque juste l'indentation du code pour qu'il soit plus lisible et un lien vers la sonde d'humidité que vous utilisez).

Le Serial.begin(9600); ne sert à rien puisqu'il n'y a aucun affichage et l'usage d'un tableau pour les pins et le nombre de leds à afficher pourrait simplifier grandement le code. (et vous n'utilisez pas la broche 12 ni la variable i ni ouvre)

Après nettoyage, souhaitez vous déplacer votre post dans la catégorie "projets finis" étant donné que ce n'est pas une question mais plus un partage ?

PS/ il faudrait quand même rajouter une sécurité pour que l'arrosage s'arrête tout seul au bout de n secondes en cas de défaillance du capteur et envisager de faire dormir le micro-processeur à moins de brancher le capteur en permanence sur le courant.

PS2: un petit coup de nettoyage pour vous donner une idée de comment on pourrait simplifier le code (tapé ici donc totalement non testé)

//consignes pour le capteur
const int consigneTerreSeche = 680;  // seuil du capteur pour terre sèche (à régler)
const int consigneTerreHumide = 270; // seuil du capteur pour terre humide(à régler)

const byte brocheSonde = A5;
const byte brocheConsigne = A6;
const byte brochePompe = 13;

struct BarGraphe {
  const byte broche; // la pin du capteur
  const int niveau; // le niveau asssocié
};

BarGraphe graphe[] = {
  {2, 10},    // led rouge très sec
  {3, 20},    // led rouge sec
  {4, 30},    // led orange moyen-
  {5, 40},    // led orange moyen
  {6, 50},    // led orange moyen+
  {7, 60},    // led verte humide-
  {8, 70},    // led verte humide
  {9, 80},    // led verte humide+
  {10, 90},   // led verte très humide
  {11, 95},   // led verte très humide+
  {12, 100},  // led violet Humidité 100%
};
const byte nbLeds = sizeof graphe / sizeof * graphe;

void setup() {
  pinMode(brochePompe, OUTPUT); //commande pompe
  for (byte i = 0; i < nbLeds; i++) pinMode(graphe[i].broche, OUTPUT); // les LEDs
}

void loop() {
  int tauxHumidite = map(analogRead(brocheSonde), consigneTerreHumide, consigneTerreSeche, 100, 0);
  int consigneHumidite = map(analogRead(brocheConsigne), consigneTerreHumide, consigneTerreSeche, 100, 0);

  digitalWrite(brochePompe, (tauxHumidite < consigneHumidite) ? HIGH : LOW);
  digitalWrite(graphe[0].broche, (tauxHumidite <= graphe[0].niveau) ? LOW : HIGH);
  for (byte i = 1; i < nbLeds; i++) {
    if ((tauxHumidite > graphe[i - 1].niveau) && (tauxHumidite <= graphe[i].niveau)) digitalWrite(graphe[i].broche, LOW);
    else digitalWrite(graphe[i].broche, HIGH);
  }
  delay(40);
}

Bonjour et merci de m'avoir répondu rapidement.
J'avais bien cru avoir publié sur les projets finis... page sur laquelle
je m'étais rendu. Quelque chose m'échappe.
Bien évidemment, je souhaite le placer dans la bonne catégorie.
Il est vrai que j'interviens pour la première fois dans ce forum. Merci
de pardonner mes fautes de débutant.
J'ai un projet complémentaire prêt à soumettre, pour l'arrosage toujours
du jardin cette fois, mais plus conséquent. Je tâcherai de faire attention.

Pour l'identation, j'avais pourtant activé l'identation automatique dans
l'IDE d'Arduino... Je vais revoir cela.
Merci encore et bon dimanche.
Jacques Cuvillier

Votre code est plus concis et plus élégant il est vrai. Plus abstrait aussi. J'avais volontairement choisi de m'en tenir aux structures les plus élémentaires.
Il est toujours possible en effet d'adjoindre des sécurités.
Pour la consommation, elle est minime, (l'essentiel est consommé par le bloc alimentation à lui seul).

Je laisse volontairement les codes qui servent lors de la mise au point, mais je devais les mettre en commentaire.

Bien à vous

je comprends - ça peut aider les débutants effectivement

Il y a quelques modifications comme

  • Donner des noms aux broches,
  • enlever ce qui ne sert pas,
  • ne pas faire de pinMode pour les broches analogiques

➜ ça c’est quand même une bonne idée pour les débutants.