Pousse basilic pousse

Note : En cours de tests (avril 2016)... nous ajouterons/ajusterons le document selon les résultats.
Mise à jour du 11 avril : amélioration du code, voir au bas de l'article.

Note aux débutants : La présente documentation a pour but d’inspirer, non pas d’être copiée-collée sans comprendre le programme et les circuits. Car le copier-coller en Arduino ne fonctionne pas nécessairement.

Le présent projet en est un de domotique. Nous désirons faire pousser des fines herbes sans avoir à les arroser soi-même. Pour ce faire, notre robot mesurera l’humidité du sol avec une sonde comme celle présentée ici, puis à l’aide d’une mini pompe, Arduino arrosera lorsque le sol sera sec.

Pièces

pieces_basilic.resized

  • Carte Arduino Uno
  • Pompe submersible (Ultra-quiet Mini DC12V Brushless Water Pump Submersible Modèle #DC30A-1230)
  • Tuyau (5/16  » interne)
  • Transistor IRF520
  • Blocs piles (au moins 7 V pour la carte Arduino, 4 piles AA fait l’affaire pour la pompe. Voir cet article pour l’alimentation d’une carte Arduino)
  • Résistors (10 kOhms et 220 ohms)
  • Clous (pour la sonde d’humidité)
  • Diode (protection du circuit contre le moteur)
  • Réservoir
  • Boitier couvre circuit
  • Bac à fleurs
  • Fils, attaches, etc.
  • Total électronique: environ 13$
  • Total matériaux : 10$

Un peu de théorie

Le transistor sert ici d’interrupteur pour la pompe (utilisant plus de 5V). La carte Arduino (utilisant 5V) ne fait qu’ouvrir ou fermer cet interrupteur selon les conditions programmées.

La diode (pièce polarisée), ne laissant passer du courant que dans un sens, protège le circuit contre un retour de courant produit par le moteur de la pompe.

 

Montage électrique

arroseur basilic (1)

Une DEL (avec une résistance en série d’au moins 220 ohms) peut être ajoutée au circuit afin d’informer l’utilisateur que le circuit est fonctionnel. À vous de voir où la brancher.

Installation

Attention! Afin d’éviter des bris (suite à la manipulation fréquente des pièces) voir ces conseils.

Note : Nous avons utilisé des plats récupérés comme réservoir et comme recouvre circuits/piles. Nous avons placé le réservoir à l’intérieur du bac, car nous désirons pouvoir transporter facilement le montage.

montage_basilic.resized

IMG_20160404_143440.resized

Programme de base

arroseur_base

Version XML

 

void setup()
{
 pinMode(A0, INPUT);//le capteur est sur l'entrée A0
 pinMode(8, OUTPUT);//sortie vers la pompe
 Serial.begin(9600);//on veut pouvoir vérifier la valeur du capteur à l'écran
}
void loop()
{
 digitalWrite(8, LOW);
 Serial.println(analogRead(A0));
 if (analogRead(A0) < 780) { //faire vos tests pour trouver votre valeur
 digitalWrite(8, HIGH);
delay(3000);//on pompe 3 s
 digitalWrite(8, LOW);
 }
delay(200000);//on prend une mesure à toutes les 200 s
}

Améliorations

On peut améliorer notre montage en ajoutant un capteur dans le réservoir afin d’être informé (par une DEL par exemple) qu’il n’y a plus d’eau.

Expérimentation : Des tests plus poussés pourraient nous permettre de trouver la façon la plus efficace d’arroser le sol (nombre et position des trous dans le tuyau, position du tuyau dans le bac, nombre de secondes à arroser, etc.).

Un interrupteur pourrait également être installé sur le couvre circuit pour activer le système.

Version 2 du programme

Après quelques tests, voici une version plus efficace de notre programme de contrôle de l’arrosage de nos fines herbes.

Fonctions

Nous avons créé trois fonctions, niveau, humidité et pompe.

La fonction niveau et humidité utilisent le capteur d’humidité présenté ici. Cette nouvelle version du code nous permet d’économiser de l’énergie (piles), car nous n’envoyons du courant que pour la mesure et non pas toujours.

Pour la fonction niveau (alimenté par la broche 3), nous vérifions qu’il y a de l’eau dans le réservoir  (A0 < 100 si pas d’eau entre les clous), pour la fonction humidité (alimenté par la broche 10) nous voulons arroser lorsque le capteur nous donne une lecture de A1 < 780. Voici les blocs Blockly@rduino :

fonction_niveau_humidite

La troisième fonction, pompe, démarre la pompe pour une durée de 3,5 s et attend 15 minutes avant de relancer les tests (pour que l’eau pénètre dans le sol et atteigne la sonde).

pompe

Le code (version XML pour Blockly@rduino) qui s’exécute en boucle commence par vérifier le niveau du réservoir. S’il n’y a pas d’eau, on allume une DEL rouge pour le signaler. S’il y a de l’eau, on mesure l’humidité du sol, on arrose selon la condition, sinon on attend à la prochaine mesure (ici 30 minutes).

pousse_basilic_programme

 

Version Arduino commentée du code version 2

/* Arroseur automatique par RÉCIT MST 2016
Pousse basilic pousse
Des fonctions démarrent les mesures de niveau d'eau et d'humidité du sol. On envoie du courant seulement le temps de la lecture pour économiser les piles. analogWrite donne de meilleurs résultats que digitalWrite pour les sondes. */ int manque_eau; int sec; void setup() { pinMode(A0, INPUT);//sonde humidité du sol pinMode(A1, INPUT);//sonde niveau d'eau pinMode(3, OUTPUT);//sonde niveau eau pinMode(8, OUTPUT);//pompe pinMode(9, OUTPUT);//DEL rouge pinMode(10, OUTPUT);//sonde humidité du sol Serial.begin(9600); manque_eau=0; sec=0; } void loop() //code qui tourne en boucle==================== { niveau();//on vérifie le niveau d'eau if (manque_eau==1) { analogWrite(9, 255);//allume DEL rouge } else { //ne manque pas d'eau analogWrite(9, 0);//eteint DEL rouge digitalWrite(8, LOW);//pompe off //On teste si assez humide, sinon on arrose 3s humidite();//vérifier humidite sol if (sec==1) { pompe();//on pompe pour 3,5 s } else { delay(1800000);//mesure aux 30 min } } //fin si il y a de l'eau }//fin loop //Les fonctions ====================================================================== void niveau() { //test niveau eau======================= analogWrite(3, 255);//on démarre le courant dans la sonde niveau d'eau delay(1000);//on donne un peu de temps au circuit Serial.println(analogRead(A1)); if (analogRead(A1) < 100) { manque_eau=1; } else { manque_eau=0; } delay(100); analogWrite(3, 0);//on arrête le courant dans la sonde, économie d'énergie delay(100); //fin test niveau======================= } //Fonction qui teste l'humidite du sol void humidite() { analogWrite(10,255);//on démarre le courant vers la sonde humidite delay(1000);//on donne 1s pour prendre la mesure Serial.print(analogRead(A0)); Serial.print(" : "); if (analogRead(A0) < 780) { sec=1; } else {sec=0;} delay(100); analogWrite(10,0);//on arrête le courant dans la sonde, économie d'énergie delay(100); } //Fonction pour pomper de l'eau============================= void pompe() { digitalWrite(8, HIGH); delay(3500);//durée du pompage digitalWrite(8, LOW); delay(900000);//on attend 15 minutes que l'eau pénètre dans le sol }