Je cherche un montage et un programme Arduino pour conduire 5 ou 6 petites pompes par avec relais indépendants , un arrosage automatique avec sonde d’humidité pour plusieurs pots de fleur .
Pour commencer une digression totalement personelle : je n'aime pas le format de la UNO et surtout ses connectiques Dupont peu fiables.
La même carte, avec le même microcontrôleur, existe dans un format diffèrent : la nano, elle a même deux entrées purement analogiques de plus.
La Uno pour le debogage passe, pour le définitif la nano est plus fiable à mon avis.
Chacun fait ses choix.
Pour ton « léger» soucis un seul microcontrôleur est suffisant.
Le conseil que je donne, tu en feras ce que tu veux, est de commencer par faire un programme pour une seule pompe.
Tu nous communiqueras ce programme que bien entendu, tu indenteras avant de le copier (dans l'IDE faire Ctrl T) et que tu placeras entre balises codes <CODE/> : icône dans la barre haute
Si tu as besoin d'aide pour ajouter une deuxième pompe tu recevras de l'aide.
Mais, c'est un conseil, fais déjà fonctionner une pompe.
A priori, pour commencer, ce n' est pas trés difficile je pense d’utiliser le code fournit sur le lien que tu as induqué.
Mais il faut réfléchir à une chose.
Si tu n’a que un seul Arduino et 5 (capteurs + relais) à 5 lieux différents et +/- éloignés, comment imagine tu l’interconnexion 1 Arduino vers 5 capteurs et 5 relais à 5 ou 6 endroits différents?
tout à fait d'accord, il y a suffisamment d'entrées/sorties (numériques autant qu'analogiques) pour réaliser les fonctions demandées.
c'est déjà le cas dans le code que tu fournis en lien, mais encore faut-il en comprendre le contenu.
... n'est pas si compliqué, ici tu as la définition d'une entrée :
#define solPin A0
il suffit d'en créer une autre avec «A1» par exemple... et refaire la même chose que dans le code d'origine afin de prendre en compte cette nouvelle entrée : c'est vrai, ça demande un peu de réflexion, mais c'est très formateur de «bidouiller» les codes des autres.
quand tu auras compris comment faire et exploiter les modifs, tu seras en mesure de créer une partie de ton propre code.
la seule chose qui (dans le code qui te sert de base) me chiffonne c'est que le sol présente une latence importante dans sa réaction à l'humidité :
comment peut-on réguler un arrosage, et donc maintenir une humidité (moyenne) constante avec un fonctionnement «tout ou rien» du système d'arrosage ?
il y a un moment où le sol est hyper sec et où on arrose, forcément trop longtemps, pour ensuite stopper l'apport d'eau et attendre la «sécheresse» pour à nouveau arroser... c'est genre «je gave» puis «je mets à la diète» !
m'enfin bon, apprends déjà à gérer plusieurs entrées/sorties, tu verras plus tard comment optimiser l'arrosage.
Tu remplacé une des Led pilotée par le programme par un des innombrables modules relais existants sur le marché et quï soient pilotables par une sortie digitale 5V.
Dans beaucoup de cultures potagères ou d’ornement, on recommande d’attendre que la couche supérieure du sol sèche avant d’arroser à nouveau assez abondamment. C’est ce qu’on appelle un arrosage profond et espacé. L’arrosage apporte alors assez d’eau pour humidifier le sol en profondeur et cette eau est progressivement utilisée par la plante pendant la période suivante.
L’idée de ce mode d’arrosage c’est de favoriser le développement de racines plus profondes. Lorsque l’eau pénètre profondément dans le sol, les racines se développent vers le bas pour l’atteindre. À l’inverse, des arrosages très fréquents et superficiels qui maintiennent l’humidité surtout en surface et encouragent des racines peu profondes. Ça rend souvent les plantes plus sensibles aux épisodes de sécheresse et permet donc d’ augmenter la tolérance au manque d’eau.
Cela dit - ce n’est pas vrai tout le temps: certaines plantes demandent une humidité plus constante, notamment les semis, bien sûr les plantes aquatiques ou celles dont le système racinaire reste naturellement très superficiel et bien sûr le sol ne doit pas rester saturé d’eau trop longtemps car les racines ont besoin d’oxygène pour respirer et un sol constamment détrempé peut provoquer leur asphyxie ou des maladies racinaires.
Faut trouver le juste milieu et ça dépend du sol et des plantes. Certains détecteurs d’humidité ont une sortie analogique ou une valeur numérique (I2C) - dans ce cas votre code peut être paramétrique et ceux qui sont en tout ou rien on un potard pour régler un seuil de sécheresse de la couche superficielle du sol…
#define solPin A0 //Broche analogique A0 capteur d'humidité du sol doit être connecté
#define solPin A1 //Broche analogique A0 capteur d'humidité du sol doit être connecté
#define solPin A2 //Broche analogique A0 capteur d'humidité du sol doit être connecté
#define solPin A3 //Broche analogique A0 capteur d'humidité du sol doit être connecté
#define solPin A4 //Broche analogique A0 capteur d'humidité du sol doit être connecté
#define solPin A5 //Broche analogique A0 capteur d'humidité du sol doit être connecté
#define relais 1 //Définit la broche numérique 1 pour le relais actionné .
#define relais 2 //Définit la broche numérique 2 pour le relais actionné .
#define relais 3 //Définit la broche numérique 3 pour le relais actionné .
#define relais 4 //Définit la broche numérique 4 pour le relais actionné .
#define relais 5 //Définit la broche numérique 5 pour le relais actionné .
//Déclare la variable entière humminsol (pour humidité minimum sol ou seuil) et l'initialise à 300.
//Cette valeur représente le seuil au-dessous duquel le sol est considéré comme trop sec.
int humminsol = 300;
//Déclare la variable entière sol qui sera utilisée pour stocker la lecture de la valeur analogique du capteur d'humidité du sol.
int sol;
void setup() {
Serial.begin(9600);
//Configure la broche de le relais (1 2 3 4 5) comme une sortie (OUTPUT).
pinMode(relais , OUTPUT);
//Configure la broche de le relais (1 2 3 4 5) comme une sortie (OUTPUT).
pinMode(relais , OUTPUT);
}
void loop() {
sol = analogRead(solPin); //Lit la valeur du capteur d'humidité connecté à la broche A0
Serial.print("sol = ");
Serial.println(sol);
//Si la valeur lue du sol (sol) est supérieure au seuil de 300 (humminsol)
if (sol > humminsol) {
digitalWrite(relais, HIGH); //Le relais est actionné
digitalWrite(relais, LOW); //Le relais est éteinte
}
//Si la valeur lue du sol (sol) est inférieure au seuil de 300 (humminsol).
if (sol < humminsol) {
digitalWrite(relais, HIGH); //1 pour le relais actionné
digitalWrite(relais, LOW); //La LED verte est éteinte
}
//Introduit un délai de 5000 millisecondes (5 secondes) avant la prochaine lecture
delay(5000);
}
je n'ai pas encore essayé encore le montage j'attends vos suggestions .
merci d'avance
cordialement Philippe
tu attribues plusieurs valeurs (1 à 5, par exemple) à la même étiquette (relais) ce qui fait que ton «mot-clé» relais «vaudra» 5 (la dernière valeur y attribuée)
ainsi chaque «relais» aurait eu sa propre broche de commande (idem pour chaque «solPin»)
mais comme je n'ai pas lu le reste de ton code je n'ai peut-être pas compris où tu veux en venir ... mais ça me paraît clair :
...
Au-delà de la remarque faite ci-dessus concernant la syntaxe, il y a aussi le problème que la broche digital 1 est utilisée (tout comme la 0) pour la communication et le téléchargement. Donc, il est préférable de ne pas les utiliser dans ton code.
@matphil861#define est destiné au compilateur.
Cela fait partie des directives que l'on met en début de fichier.
Quand le compilateur trouve dans le code la ligne :
#define solPin A0
le compilateur remplacera dans le code toutes les occurrences «solPin» par A0.
solPin prendra successivement la valeur A0 puis A1,......,A4, A5.
Le compilateur ne retiendra que la dernière valeur.
Ce n'est pas ce que tu voulais faire, d'où les conseils qui t'ont déjà été donnés.
Le langage pour programmer avec l'IDE Arduino c'est du C et du C++.
Il existe de nombreux tutos sur le C et C++ destinés aux débutants, je pense que tu y apprendras beaucoup plus que dans de la documentation Arduino.
Un exemple avec des tableaux (loin d’être parfait il faudrait rajouter des sécurités, une hysterese, et éventuellement regrouper le capteur et son relai dans une structure ou classe pour faire propre)
const uint8_t solPins[] = {A0, A1, A2, A3, A4, A5};
const uint8_t relaisPins[] = {2, 3, 4, 5, 6, 7};
const byte numZones = sizeof solPins / sizeof *solPins;
int humminsol = 300;
void setup() {
for (byte i = 0; i < numZones; i++) {
pinMode(relaisPins[i], OUTPUT);
}
}
void loop() {
for (byte i = 0; i < numZones; i++) {
int sol = analogRead(solPins[i]);
if (sol < humminsol) {
digitalWrite(relaisPins[i], HIGH);
} else {
digitalWrite(relaisPins[i], LOW);
}
}
delay(5000);
}