J'ai un problème avec Millis, je cherche a faire un système d'arrosage ou dans :
1er temps, pas d'arrosage pendent 30 secondes (Interval_Arrosage) – Zone Programme Principale
Jusque-là tous est OK, je suis bien a OFF 6 fois sur le moniteur et il switch bien a ON après mes 30 sec.
//------------------------------- Programme Principale -------------------------------
//
void Arrosage(float taux) // Définir Fonction
{
EtatBouton = digitalRead(Bouton); //On lit l'état du bouton
boolean EtatVanne = digitalRead(EtatVanne); // Control Vanne ON/OFF
// Récupére la valeur actuelle de millis()
unsigned long currentMillis = millis();
if((currentMillis - Compteur_Arrosage) > Interval_Arrosage) { // Delay temps Interval // Delay temps Interval
if (EtatBouton==0 || taux < 10 == taux < 90) { // Si fouchette taux arrosage ON
Compteur_Arrosage = millis();
Arrosage_ON(taux); // Exécute Sous Programme
}}
if (taux > 90) { // Si taux haut atteint
Compteur_Arrosage = millis();
Arrosage_OFF(taux); // Exécute Sous Programme
}
}
2ème temps : Problème une fois que je suis dans la Zone Sous Programme Arrosage ON, il devrait après 15 sec passer a OFF, rien à faire il reste sur ON, c’est comme si Compteur_Vanne ne peut pas être récupéré
//--------------------------- Sous Programme Arrosage ON ---------------------------
//
void Arrosage_ON(float taux) // Définir Fonction
{
// Récupére la valeur actuelle de millis()
unsigned long currentMillis = millis();
EtatVanne = 0; // Définir Vanne1 ON
// if((currentMillis - Compteur_Vanne) > Ouverture_Vanne) { // Delay temps Interval
if (EtatBouton==0 || taux < 10 && taux < 90) { // Si état Bouton OU fouchette taux = Arrosage ON
// Compteur_Vanne = currentMillis;
digitalWrite(Ralay,HIGH);
digitalWrite(LedVert,HIGH); //Allumage Led Vert
digitalWrite(LedRouge,LOW);
}
else if (((currentMillis - Compteur_Vanne) > Ouverture_Vanne) || taux > 90) { // Si taux haut atteint
// if (((currentMillis - Compteur_Vanne) > Ouverture_Vanne) || taux > 90) { // Si taux haut atteint
Compteur_Vanne = currentMillis;
Arrosage_OFF(taux); // Exécute Sous Programme
}
}
// -------------------- Arrosages Plante N°1 --------------------
//////////////////////////////////////////////////////////////////////////// Declaration des variables ////////////////////////////////////////////////////////////////////////////
// Variables Constantes : Ne change pas.
// Utilisé le numéro de la broche sur laquelle est connectée le capteur pour le définir :
//
const int pinA1 = A7; // Pin Analogique du capteur (A3 Ardiono Mini/Pro, A7 Arduino Nano)
const int Ralay = 2; // Pin Relay (électrovanne)
const int Sensor = 3; // Pin d'alimentation du Capteur Moisture
const int Bouton = 4; //broche où on lira la valeur renvoyée par le capteur
const int LedVert = 5; //Led Verte (Arrosages ON)
const int LedRouge = 6; //Led Rouge (Arrosages OFF)
// Variables : Qui change
//
boolean EtatBouton; //variable où on stockera l'état du bouton
boolean EtatVanne; //variable où on stockera l'état Vanne
// En général, vous devez utiliser "unsigned long" pour les variables qui maintiennent le temps
// La valeur deviendra rapidement trop grand pour un int pour stocker
// Variables Constantes Longue : Ne change pas.
//
unsigned long Interval_Arrosage = 30000; // Temps d'attente entre les arrosages 60000
unsigned long Ouverture_Vanne = 15000; // Temps d’ouverture Vanne en millisecondes
// Variables Longue : Qui change
//
unsigned long Compteur_Arrosage = 0 ; // Compteur de Temps en millisecondes
unsigned long Compteur_Vanne = 0 ; // Compteur de Temps en millisecondes
///////////////////////////////////////////////////////////////////////////////// Initialisation //////////////////////////////////////////////////////////////////////////////////
//
void setup()
{
Serial.begin(9600);
pinMode(pinA1,INPUT);
pinMode(Ralay,OUTPUT);
pinMode(Sensor,OUTPUT);
pinMode(Bouton,INPUT); //on créé une entrée : on reçoit l'état du bouton
pinMode(LedVert,OUTPUT);
pinMode(LedRouge,OUTPUT);
}
/////////////////////////////////////////////////////////////////////////////// Boucle Principale /////////////////////////////////////////////////////////////////////////////////
//
void loop() {
//Action
boolean EtatBouton = digitalRead(Bouton); // Déclartation variable boolean état du bouton
digitalWrite(Sensor,HIGH);
float h=analogRead(pinA1);
float taux = (1023.0-h)/6.45; //6.65; (My valeur 6.45 capeur Non isoler;) (Tester avec 9.10) 3.50 New sonde
delay(5000); // Donner suffisamment de temps pour ouvrir le moniteur série après le téléchargement
Serial.println("Starting...");
Serial.print(h);
Serial.print(" ");
Serial.print(taux);
Serial.println("%");
Serial.print("Arrosage ON(0)/OFF(1)");
Serial.print(" ");
Serial.println(EtatVanne);
Serial.print("Bouton ON(0)/OFF(1)");
Serial.print(" ");
Serial.println(EtatBouton);
Arrosage(taux);
digitalWrite(Sensor,LOW);
// End of Action
}
///////////////////////////////////////////////////////////////////////////// Fonction Personnalisée //////////////////////////////////////////////////////////////////////////////
//
//------------------------------- Programme Principale -------------------------------
//
void Arrosage(float taux) // Définir Fonction
{
EtatBouton = digitalRead(Bouton); //On lit l'état du bouton
boolean EtatVanne = digitalRead(EtatVanne); // Control Vanne ON/OFF
// Récupére la valeur actuelle de millis()
unsigned long currentMillis = millis();
if((currentMillis - Compteur_Arrosage) > Interval_Arrosage) { // Delay temps Interval // Delay temps Interval
if (EtatBouton==0 || taux < 10 == taux < 90) { // Si fouchette taux arrosage ON
Compteur_Arrosage = millis();
Arrosage_ON(taux); // Exécute Sous Programme
}}
if (taux > 90) { // Si taux haut atteint
Compteur_Arrosage = millis();
Arrosage_OFF(taux); // Exécute Sous Programme
}
}
//--------------------------- Sous Programme Arrosage ON ---------------------------
//
void Arrosage_ON(float taux) // Définir Fonction
{
// Récupére la valeur actuelle de millis()
unsigned long currentMillis = millis();
EtatVanne = 0; // Définir Vanne1 ON
// if((currentMillis - Compteur_Vanne) > Ouverture_Vanne) { // Delay temps Interval
if (EtatBouton==0 || taux < 10 && taux < 90) { // Si état Bouton OU fouchette taux = Arrosage ON
// Compteur_Vanne = currentMillis;
digitalWrite(Ralay,HIGH);
digitalWrite(LedVert,HIGH); //Allumage Led Vert
digitalWrite(LedRouge,LOW);
}
else if (((currentMillis - Compteur_Vanne) > Ouverture_Vanne) || taux > 90) { // Si taux haut atteint
// if (((currentMillis - Compteur_Vanne) > Ouverture_Vanne) || taux > 90) { // Si taux haut atteint
Compteur_Vanne = currentMillis;
Arrosage_OFF(taux); // Exécute Sous Programme
}
}
//-------------------------- Sous Programme Arrosage OFF --------------------------
//
void Arrosage_OFF(float taux) // Définir Fonction
{
// Récupére la valeur actuelle de millis()
unsigned long currentMillis = millis();
EtatVanne = 1; // Définir Vanne1 OFF
if (EtatBouton==1 || taux > 10) { // Si fouchette taux = Arrosage OFF
digitalWrite(Ralay,LOW);
digitalWrite(LedVert,LOW);
digitalWrite(LedRouge,HIGH); //Allumage Led Rouge
}
else if (((currentMillis - Compteur_Vanne) < Ouverture_Vanne) || taux < 10) { // Si taux haut atteint
// else if (taux < 10) { // Si taux bas atteint
Compteur_Vanne = currentMillis;
Arrosage_ON(taux); // Exécute Sous Programme
}
}
/////////////////////////////////////////////////////////////////////////////////////// FIN ///////////////////////////////////////////////////////////////////////////////////////
Je viens de faire test en modifient par taux < 10, sa change rien c'est pareil
Normalement, ci taux < 10 == taux < 90 est ok, il me permet lors de l'arrosage de continue le remplissage jusqu’à mes 90%, malgré l'Interval_Arrosage et inversement pour l’assèchement.
Si je ne fais pas cela, lors du redémarrage après l'interval, si je suis au dessus des 10% il se met sur OFF
Je cherche a supprimer un maximum l'effet électrolyse sur la sonde
j'ai un delay(5000) dans void loop() pour le moniteur, j'ai essayer de le passer en millis, sa passe pour lui mais celui qui suis Interval_Arrosage, n'est pas pris en charge
Pour résumer au final je cherche
Interval Lecture Moniteur : 1 heure (supprimer un maximum l'effet électrolyse)
Interval_Arrosage = 2 heure
Ouverture_Vanne = 1 minutes a plus suivant débit
// -------------------- Arrosages Plante N°1 --------------------
//////////////////////////////////////////////////////////////////////////// Declaration des variables ////////////////////////////////////////////////////////////////////////////
// Variables Constantes : Ne change pas.
// Utilisé le numéro de la broche sur laquelle est connectée le capteur pour le définir :
//
const int pinA1 = A7; // Pin Analogique du capteur (A3 Ardiono Mini/Pro, A7 Arduino Nano)
const int Relay = 2; // Pin Relay (électrovanne)
const int Sensor = 3; // Pin d'alimentation du Capteur Moisture
const int Bouton = 4; // Broche où on lira la valeur renvoyée par le capteur
const int LedVert = 5; // Led Verte (Arrosages ON)
const int LedRouge = 6; // Led Rouge (Arrosages OFF)
// Variables : Qui change
//
byte EtatBouton; // Variable où on stockera l'état du bouton
byte EtatVanne; // Variable où on stockera l'état Vanne
// En général, vous devez utiliser "unsigned long" pour les variables qui maintiennent le temps
// La valeur deviendra rapidement trop grand pour un int pour stocker
// Variables Constantes Longue : Ne change pas.
//
unsigned long Interval_Arrosage = 30000; // Temps d'attente entre les arrosages 60000
unsigned long Ouverture_Vanne = 15000; // Temps d’ouverture Vanne en millisecondes
// Variables Longue : Qui change
//
unsigned long Compteur_Arrosage = 0 ; // Compteur de Temps en millisecondes
unsigned long Compteur_Vanne = 0 ; // Compteur de Temps en millisecondes
unsigned long currentMillis = 0;
///////////////////////////////////////////////////////////////////////////////// Initialisation //////////////////////////////////////////////////////////////////////////////////
//
void setup()
{
Serial.begin(9600);
pinMode(pinA1,INPUT);
pinMode(Relay,OUTPUT);
pinMode(Sensor,OUTPUT);
pinMode(Bouton,INPUT); //On créé une entrée : on reçoit l'état du bouton
pinMode(LedVert,OUTPUT);
pinMode(LedRouge,OUTPUT);
}
/////////////////////////////////////////////////////////////////////////////// Boucle Principale /////////////////////////////////////////////////////////////////////////////////
//
void loop() {
//Action
byte EtatBouton = digitalRead(Bouton); // Déclartation variable boolean état du bouton
// byte EtatVanne = digitalRead(Relay); // NEW
digitalWrite(Sensor,HIGH);
float h=analogRead(pinA1);
float taux = (1023.0-h)/6.45; // 6.65; (My valeur 6.45 capeur Non isoler;) (Tester avec 9.10) 3.50 New sonde
delay(5000); // Donner suffisamment de temps pour ouvrir le moniteur série après le téléchargement
Serial.println("Starting...");
Serial.print(h);
Serial.print(" ");
Serial.print(taux);
Serial.println("%");
Serial.print("Arrosage ON(0)/OFF(1)");
Serial.print(" ");
Serial.println(EtatVanne);
Serial.print("Bouton ON(0)/OFF(1)");
Serial.print(" ");
Serial.println(EtatBouton);
Arrosage(taux);
digitalWrite(Sensor,LOW);
// End of Action
}
///////////////////////////////////////////////////////////////////////////// Fonction Personnalisée //////////////////////////////////////////////////////////////////////////////
//
//------------------------------- Programme Principale -------------------------------
//
void Arrosage(float taux) // Définir Fonction
{
EtatBouton = digitalRead(Bouton); // On lit l'état du bouton
// Récupére la valeur actuelle de millis()
// unsigned long currentMillis = millis();
currentMillis = millis();
EtatVanne = digitalRead(Relay);
if((currentMillis - Compteur_Arrosage) >= Interval_Arrosage) { // Delay temps Interval
Compteur_Arrosage = currentMillis;
if (EtatBouton==0 || taux < 10) { // Si fouchette taux arrosage ON
EtatVanne = 0; // Déffinir EtatVanne a 0
digitalWrite(Relay,HIGH);
digitalWrite(LedVert,HIGH); // Allumage Led Vert
digitalWrite(LedRouge,LOW);
// }}
}
else if (EtatVanne==0) {
if (currentMillis - Compteur_Vanne >= Ouverture_Vanne) {
Compteur_Vanne = currentMillis;
EtatVanne = 1; // Déffinir EtatVanne a 1
digitalWrite(Relay,LOW);
digitalWrite(LedVert,LOW);
digitalWrite(LedRouge,HIGH); // Allumage Led Rouge
}}
}
}
/////////////////////////////////////////////////////////////////////////////////////// FIN ///////////////////////////////////////////////////////////////////////////////////////
Mon premier millis fonctionne correctement, il bloque bien 30 seconde l’arrosage et passe a ON (Interval_Arrosage)
2ème Millis, rien ne se passe il devrait passer a OFF après 15 sec (Ouverture_Vanne)
// -------------------- Arrosages Plante N°1 --------------------
//////////////////////////////////////////////////////////////////////////// Declaration des variables ////////////////////////////////////////////////////////////////////////////
// Variables Constantes : Ne change pas.
// Utilisé le numéro de la broche sur laquelle est connectée le capteur pour le définir :
//
const int pinA1 = A7; // Pin Analogique du capteur (A3 Ardiono Mini/Pro, A7 Arduino Nano)
const int Relay = 2; // Pin Relay (électrovanne)
const int Sensor = 3; // Pin d'alimentation du Capteur Moisture
const int Bouton = 4; // Broche où on lira la valeur renvoyée par le capteur
const int LedVert = 5; // Led Verte (Arrosages ON)
const int LedRouge = 6; // Led Rouge (Arrosages OFF)
// Variables : Qui change
//
byte EtatBouton; // Variable où on stockera l'état du bouton
byte EtatVanne; // Variable où on stockera l'état Vanne
// En général, vous devez utiliser "unsigned long" pour les variables qui maintiennent le temps
// La valeur deviendra rapidement trop grand pour un int pour stocker
// Variables Constantes Longue : Ne change pas.
//
unsigned long Interval_Arrosage = 30000; // Temps d'attente entre les arrosages 60000
unsigned long Ouverture_Vanne = 15000; // Temps d’ouverture Vanne en millisecondes
unsigned long Interval_Moniteur = 5000; // Temps d'attente entre les lecture Moniteur (Sonde non active)
// Variables Longue : Qui change
//
unsigned long Compteur_Arrosage = 0 ; // Compteur de Temps en millisecondes
unsigned long Compteur_Vanne = 0 ; // Compteur de Temps en millisecondes
unsigned long Compteur_Moniteur = 0 ; // Compteur de Temps en millisecondes
// unsigned long currentMillis = 0;
///////////////////////////////////////////////////////////////////////////////// Initialisation //////////////////////////////////////////////////////////////////////////////////
//
void setup()
{
Serial.begin(9600);
pinMode(pinA1,INPUT);
pinMode(Relay,OUTPUT);
pinMode(Sensor,OUTPUT);
pinMode(Bouton,INPUT); //On créé une entrée : on reçoit l'état du bouton
pinMode(LedVert,OUTPUT);
pinMode(LedRouge,OUTPUT);
}
/////////////////////////////////////////////////////////////////////////////// Boucle Principale /////////////////////////////////////////////////////////////////////////////////
//
void loop() {
//Action
byte EtatBouton = digitalRead(Bouton); // Déclartation variable boolean état du bouton
EtatVanne = digitalRead(Relay); // NEW
digitalWrite(Sensor,HIGH);
float h=analogRead(pinA1);
float taux = (1023.0-h)/6.45; // 6.65; (My valeur 6.45 capeur Non isoler;) (Tester avec 9.10) 3.50 New sonde
if((millis() - Compteur_Moniteur) > Interval_Moniteur) {
Compteur_Moniteur = millis();
// delay(5000); // Donner suffisamment de temps pour ouvrir le moniteur série après le téléchargement
Serial.println("Starting...");
Serial.print(h);
Serial.print(" ");
Serial.print(taux);
Serial.println("%");
Serial.print("Arrosage ON(0)/OFF(1)");
Serial.print(" ");
Serial.println(EtatVanne);
Serial.print("Bouton ON(0)/OFF(1)");
Serial.print(" ");
Serial.println(EtatBouton);
Arrosage(taux);
digitalWrite(Sensor,LOW);
// End of Action
}}
///////////////////////////////////////////////////////////////////////////// Fonction Personnalisée //////////////////////////////////////////////////////////////////////////////
//
//------------------------------- Programme Principale -------------------------------
//
void Arrosage(float taux) // Définir Fonction
{
EtatBouton = digitalRead(Bouton); // On lit l'état du bouton
// Récupére la valeur actuelle de millis()
// unsigned long currentMillis = millis();
// currentMillis = millis();
EtatVanne = digitalRead(Relay);
if((millis() - Compteur_Arrosage) > Interval_Arrosage) { // Delay temps Interval
Compteur_Arrosage++; // On incrémente le compteur
// EtatVanne = 0; // Déffinir EtatVanne a 0
digitalWrite(Relay,HIGH);
digitalWrite(LedVert,HIGH); // Allumage Led Vert
digitalWrite(LedRouge,LOW);
Compteur_Arrosage = millis();
Compteur_Arrosage = 0; // On remet à zéro pour refaire le cycle de la fonction
Compteur_Vanne = millis();
Compteur_Vanne = 0; // On remet à zéro pour refaire le cycle de la fonction
}
else { ((millis() - Compteur_Vanne) > Ouverture_Vanne);
Compteur_Vanne++; // On incrémente le compteur
// EtatVanne = 1; // Déffinir EtatVanne a 1
digitalWrite(Relay,LOW);
digitalWrite(LedVert,LOW);
digitalWrite(LedRouge,HIGH); // Allumage Led Rouge
Compteur_Vanne = millis();
Compteur_Vanne = 0; // On remet à zéro pour refaire le cycle de la fonction
Compteur_Arrosage = millis();
Compteur_Arrosage = 0; // On remet à zéro pour refaire le cycle de la fonction
}
}
/////////////////////////////////////////////////////////////////////////////////////// FIN ///////////////////////////////////////////////////////////////////////////////////////
Millis Compteur_Moniteur : OK
Millis Compteur_Arrosage : OK
Millis Compteur_Vanne : KO, ne veut pas passer sur else { ((millis() - Compteur_Vanne) > Ouverture_Vanne);
J'ai beau le tourner dans tous les sens sa change rien
J'ai bien ma pause Interval_Arrosage de 30 sec au démarrage , sa passe en arrosage, Ouverture_Vanne devrait bloquer l'arrosage après 15 sec ce qui n'est pas le qua, a la place sa fait discothèque je passe d'un état a un autre, et Interval_Arrosage n'est plus pris en compte
//------------------------------- Programme Principale -------------------------------
//
void Arrosage(float taux) // Définir Fonction
{
EtatBouton = digitalRead(Bouton); // On lit l'état du bouton
// Récupére la valeur actuelle de millis()
// unsigned long currentMillis = millis();
// currentMillis = millis();
EtatVanne = digitalRead(Relay);
//-------------------- Arrosage ON ----------------
if ((millis() - Compteur_Arrosage) > Interval_Arrosage) {
Compteur_Arrosage++; // On incrémente le compteur pour les 50ms
// EtatVanne = 0; // Déffinir EtatVanne a 0
digitalWrite(Relay,HIGH);
digitalWrite(LedVert,HIGH); // Allumage Led Vert
digitalWrite(LedRouge,LOW);
Compteur_Arrosage = millis();
// Compteur_Arrosage = 0; // On remet à zéro pour refaire le cycle de la fonction (Fou la merde)
// Compteur_Vanne = millis();
Compteur_Vanne = 0; // On remet à zéro pour refaire le cycle de la fonction
}
//-------------------- Arrosage OFF ----------------
else { ((millis() - Compteur_Vanne) > Ouverture_Vanne); //&& ((millis() - Compteur_Arrosage) < Interval_Arrosage));
Compteur_Vanne++; // On incrémente le compteur pour les 50ms
// EtatVanne = 1; // Déffinir EtatVanne a 1
digitalWrite(Relay,LOW);
digitalWrite(LedVert,LOW);
digitalWrite(LedRouge,HIGH); // Allumage Led Rouge
Compteur_Vanne = millis();
// Compteur_Vanne = 0; // On remet à zéro pour refaire le cycle de la fonction
// Compteur_Arrosage = millis();
Compteur_Arrosage = 0; // On remet à zéro pour refaire le cycle de la fonction (OK)
}
}