attention il manque des trucs. echo n'est pas définie et surtout vous ne voulez faire le remplissage QUE si vous avez vidé. ➜ attention où vous mettez les accolades.
const byte ACTIF = LOW;
const byte INACTIF = HIGH; // ou (1 - ACTIF) si on veut frimer mais ce n'est pas super propre
const byte trig = 2; //HC-SR04
const byte echo = 3;
const byte inwater = 4; //pin relais remplissage
const byte outwater = 5; //pin relais vidange
const byte bouton = 13; //pin bouton poussoir momentané
long lireDistanceCm() {
digitalWrite(trig, HIGH);
delayMicroseconds(10);
digitalWrite(trig, LOW);
return pulseIn(echo, HIGH) / 58;
}
void setup() {
pinMode(trig, OUTPUT);
pinMode(inwater, OUTPUT); digitalWrite(inwater, INACTIF);
pinMode(outwater, OUTPUT); digitalWrite(outwater, INACTIF);
pinMode(bouton, INPUT_PULLUP);
Serial.begin(115200); // 9600 c'était au millénaire précédent
Serial.println(F("Système prêt"));
}
void loop() {
if (digitalRead(bouton) == LOW) { //appui
// ************* VIDANGE **************
digitalWrite(outwater, ACTIF); // déclenche la vidange
long cm;
do {
cm = lireDistanceCm();
Serial.print("Distance en cm :"); Serial.println(cm);
delay(1000); // attention c'est bloquant 1s
} while (cm < 12) ;
digitalWrite(outwater, INACTIF); // fin de vidange
// *************************************
// *********** REMPLISSAGE ************
digitalWrite(inwater, ACTIF); // déclenche le remplissage
do {
cm = lireDistanceCm();
Serial.print("Distance en cm :"); Serial.println(cm);
delay(1000); // attention c'est bloquant 1s
} while (cm > 3) ;
digitalWrite(inwater, INACTIF); // fin du remplissage
// ********************************
// on attend la relâche du bouton
while (digitalRead(bouton) == LOW) ;
delay(200);
}
}
on peut mettre en début de code
const byte ACTIF = LOW;
const byte INACTIF = HIGH; // ou (1 - ACTIF) si on veut frimer mais ce n'est pas super propre
et ajuster à la bonne valeur selon les relais. dans le code on utilise alors ACTIF et INACTIF
PS: je m'étais trompé moi aussi sur < 12 pour la vidange
je teste le code et en profite pour faire un changement d'eau de l'aquarium pour l'instant ca vidange, jusqu'ici tout va bien, j'arrive bientôt à la consigne de remplissage.
Ca ma permis de voir que la sonde ultrason n'était pas forcément bien placé car elle se trouve dans le rejet de la pompe ce qui peut fausser la mesure.
Ca marche parfaitement le seul hic c'est qu'il manque de précision, pour avoir le niveau haut parfait il me faudrait 1.5cm, l'idéal serait de passer en mm pour affiner.
hello,
j'ai déplacé la sonde c'est bien mieux, elle est un plus moins proche du niveau max donc plus haute, elle est plus précise.
La sonde n'est pas précise au millimètre mais au 1/2 cm oui et même un petit peu plus, j'ai fait quelques tests.
Effectivement mettre l'alimentation à l'arrêt pendant le cycle améliorera la précision, je vais la câbler sur un relais en position normalement ouvert et l'arrêterai pendant le cycle de remplissage.
Je viens de modifier le code, en ajoutant un flotteur pour le niveau (une sécurité en cas de dysfonctionnement de la sonde) et l'arrêt de la pompe.
j'ai un doute sur le setup du flotteur INPUT_PULLUP est-ce ok dans ce cas également ?
Je ne connais pas la syntaxe exacte pour faire un OR dans le while de la boucle REMPLISSAGE: } while (mm > 30) or ((digitalRead(flotteur) == LOW); //arrêt dés que 30 mm ou le flotteur est actionné
const byte ACTIF = LOW;
const byte INACTIF = HIGH;
const byte trig = 2; //HC-SR04
const byte echo = 3;
const byte inwater = 4; //pin relais remplissage
const byte outwater = 5; //pin relais vidange
const byte pompe = 6; //pin relais arrêt pompe
const byte flotteur = 12; //pin flotteur niveau eau (sécutité en cas de défaillance de la sonde HC-SR04)
const byte bouton = 13; //pin bouton poussoir momentané
long lireDistanceEnmm() {
digitalWrite(trig, HIGH);
delayMicroseconds(10);
digitalWrite(trig, LOW);
return pulseIn(echo, HIGH) / 5.8;
}
void setup() {
pinMode(trig, OUTPUT);
pinMode(inwater, OUTPUT); digitalWrite(inwater, INACTIF);
pinMode(outwater, OUTPUT); digitalWrite(outwater, INACTIF);
pinMode(pompe, OUTPUT); digitalWrite(pompe, INACTIF);
pinMode(flotteur, INPUT_PULLUP);
pinMode(bouton, INPUT_PULLUP);
Serial.begin(115200);
Serial.println(F("Système prêt"));
}
void loop() {
long mm;
if (digitalRead(bouton) == LOW) { //appui
// ************* VIDANGE **************
digitalWrite(outwater, ACTIF); // déclenche la vidange
do {
mm = lireDistanceEnmm();
Serial.print("Distance en mm :"); Serial.println(mm);
delay(1000); // attention c'est bloquant 1s
} while (mm < 110) ;
digitalWrite(outwater, INACTIF); // fin de vidange
// *************************************
// *************ARRET POMPE **************
digitalWrite(pompe, ACTIF);
//*************************************
// *********** REMPLISSAGE ************
digitalWrite(inwater, ACTIF); // déclenche le remplissage
do {
mm = lireDistanceEnmm();
Serial.print("Distance en mm :"); Serial.println(mm);
delay(1000); // attention c'est bloquant 1s
} while (mm > 30) or ((digitalRead(flotteur) == LOW); //arrêt dés que 30 mm ou le flotteur est actionné
digitalWrite(inwater, INACTIF); // fin du remplissage
// ********************************
// *************MISE EN ROUTE POMPE **************
digitalWrite(pompe, INACTIF);
//************************************************
// on attend la relâche du bouton
while (digitalRead(bouton) == LOW) ;
delay(200);
}
}
J'utiliserais plutôt le contact Normalement Fermé d'un relais, ainsi tu n'auras pas à alimenter la bobine en fonctionnement normal, mais seulement pendant le renouvellement d'eau.