Je découvre l'univers Arduino depuis quelques semaines et je viens de me lancer dans un projet d'arrosage automatique à base de YL-69
Pardonnez mon style d'écrire, je suis vraiment ce qu'on peut appeler un noob...
int rainPin = 0; //sortie analogique du capteur
int pinVCC = 4; //alimentation VCC capteur YL-69
int relayPin=3; // Relais sur lequel la pompe est reliée
int thresholdValue = 800; //valeur au dessus de laquelle la pompe se lance
static long previousMillis = 0; // Le temps du dernier cycle
const long interval = 1 * 60 * 1000; //Interval de 30 minutes (30 * 60 * 1000)
void setup()
{
Serial.begin(9600); //Connection série
pinMode(pinVCC, OUTPUT); // Alimentation du capteur YL-69
digitalWrite(pinVCC, HIGH);
pinMode(relayPin, OUTPUT); //sortie vers la pompe
digitalWrite(relayPin, LOW); //la pompe est éteinte de base
}
void loop()
{
unsigned long currentMillis = millis(); // Le temps courant
int sensorValue = analogRead(rainPin); //lecture de la valeur donnée sur A0
Serial.println(sensorValue);
if(sensorValue > thresholdValue) {
digitalWrite(relayPin, HIGH);// La pompe amorce l'eau jusqu'à la plante, qui fait chuter la valeur sous le thresholdValue
previousMillis = currentMillis;
}else{
if(sensorValue < thresholdValue){
if ((currentMillis - previousMillis) > 10000){ //Si le capteur détecte de l'eau, il coupe la pompe au bout de 1 minute (60000)
digitalWrite(relayPin, LOW);
previousMillis = currentMillis;}
}
}
}
Le programme fonctionne correctement en tant que tel (j'ai changé les durées pour tester en live sans attendre trois plombes à chaque fois) mais je souhaite couper l'alimentation du capteur (appelé ici pinVCC, parce que je trouve inutile de le voir alimenté en continu (je pense à une électrolyse du capteur à force).
Si le capteur n'est pas alimenté, il renvoie une valeur inférieure à "50", ça tombe bien, la valeur utile est au dessus de "800".
DU coup, j'aimerais "activer" ce capteur quelque secondes toutes les heures (ou plus), histoire de vérifier que la terre est sèche ou non.
Si elle l'est, le capteur envoie une valeur au dessus de "800", alors le relais (relayPin) alimente une petite pompe qui s'éteint après 60 secondes (si le capteur reçoit de l'eau =dès que la valeur passe en dessous de "800").
Je ne sais pas quoi ajouter d'autres mais je me ferai un plaisir de répondre à vos questions et évidemment d'en apprendre un peu plus sur tout ce bouzin
Aoren:
... je souhaite couper l'alimentation du capteur (appelé ici pinVCC, parce que je trouve inutile de le voir alimenté en continu (je pense à une électrolyse du capteur à force).
Si le capteur n'est pas alimenté, il renvoie une valeur inférieure à "50", ça tombe bien, la valeur utile est au dessus de "800".
DU coup, j'aimerais "activer" ce capteur quelque secondes toutes les heures (ou plus), histoire de vérifier que la terre est sèche ou non.
à bientôt
Bonsoir
le plus simple dans la loop
digitalWrite(pinVCC, HIGH); //capteur ON
// faire la mesure
digitalWrite(pinVCC, LOW); // capteur OFF
En l'intégrant tel quel dans ma loop, le temps de capture semble trop court pour avoir des données correctes.
Comme l'intérêt est de voir ce capteur alimenté une fois par heure (à tout casser) pendant quelques secondes et que je ne veux pas de fonction bloquante (puisque je vais ajouter d'autres choses dans ce programme), je m'étais tourné vers ce genre de fonction :
"((currentMillis - previousMillis) > durée de capture)"
Mais ça a tendance à faire foirer le reste (l'activation du relais met plus de temps).
Utilsez des constantes nommées plutôt que 60000 comme votre const long interval = 1* 20* 1000L; //Interval de 15 minutes (15 * 60 * 1000)
(qui pourrait être un unsigned long puisqu'une durée ne sera jamais négative const unsigned long interval = 15* 60* 1000ul; //Intervalle de 15 minutes)
Si vous voulez bâtir un code évolutif et flexible qui ne deviendra pas un plat de spaghetti quand vous rajouterez d'autres fonctions (genre ne pas arroser en plein soleil) restructurez le code sous forme de machine à état (cf mon tuto sur le sujet)