Automatisation remplissage cuve eau osmosée aquarium

Bonjour,

Je me présente je m'appelle Benoît, j'ai 35ans et j'habite dans le Rhône.
Je suis passionné d'aquariophilie eau de mer.
Je souhaite automatiser le remplissage de ma cuve d'eau osmosée qui ser à compenser l'évaporation de l'eau dans mon bac.
Sur un osmoseur, nous avons l'arrivée d'eau sur lequel je vais mettre une electro (EV1), un tuyau de rejet d'eau sale, et un tuyau d'eau propre équipée de 2 electro EV2 et EV3 en parallèle.
Les premiers litres qui sortent du tuyau d'eau propre ne sont pas utilisables et doivent jetés à l'égout.

Mon système fonctionnera de la façon suivante :
Sur un capteur bas, Les electro EV1 et EV2 s'ouvrent, pendant 3 minutes, l'eau sale part à l'égout.
Après 3 minutes, l'electro EV2 se ferme et l'electro EV3 s'ouvre, l'eau propre va dans la cuve.
Lorsque le capteur haut est atteint, toutes les electro sont coupées.
Une tempo est mise par sécurité sur l'ouverture de l'electro principale EV1.

J'ai fait le programme, les electro EV1 et EV2 fonctionne correctement.
Par contre l'electro EV3 ne fonctionne pas comme je le souhaite.
Elle s'allume dès l'alimentation de la carte, fonctionnement bien sur déclenchement de niveau bas, mais ne s'etteint pas sur niveau eau, Pouvez-vous SVP m'éclairer ?

Mon programme :

// Déclarations des connexions sur carte et des variables
const byte PIN_RELAIS_EV1 = 4; // Numéro du pin pour le relais electrovanne principale EV1
const byte PIN_RELAIS_EV2 = 5; // Numéro du pin pour le relais electrovanne rejet eau EV2
const byte PIN_RELAIS_EV3 = 6; // Numéro du pin pour le relais electrovanne eau osmosée EV3
const byte PIN_CAPTEUR_CUVE_BAS = 7; // Numéro du pin pour les capteurs de niveau bas cuve
const byte PIN_CAPTEUR_CUVE_HAUT = 8; // Numéro du pin pour les capteurs de niveau haut cuve
unsigned long temps_debut_osmolation; // Variable de type long non signée pour enregristrer un temps
 
void setup() { // Initialisation du programme
  pinMode(PIN_CAPTEUR_CUVE_BAS, INPUT_PULLUP); // Affecte le mode Entrée au pin capteur. En l'absence de branchement, la résistance interne Pullup tire vers un état HIGH non aléatoire.
  pinMode(PIN_CAPTEUR_CUVE_HAUT, INPUT_PULLUP); // Affecte le mode Entrée au pin capteur. En l'absence de branchement, la résistance interne Pullup tire vers un état HIGH non aléatoire.
  pinMode(PIN_RELAIS_EV1, OUTPUT); // Affecte le mode Sortie (envoi d'un signal) au pin du relais EV1
  pinMode(PIN_RELAIS_EV2, OUTPUT); // Affecte le mode Sortie (envoi d'un signal) au pin du relais EV2
  pinMode(PIN_RELAIS_EV3, OUTPUT); // Affecte le mode Sortie (envoi d'un signal) au pin du relais EV3
}
 
void loop() { // Programme en boucle
  if (digitalRead(PIN_CAPTEUR_CUVE_BAS) == LOW) { // Si le pin du capteur est LOW (contact pullup fermé, flotteur bas)
    temps_debut_osmolation = millis(); // Affecte le temps actuel au début d'osmolation
    digitalWrite(PIN_RELAIS_EV1, HIGH); // Envoie du courant au pin relais, l'electrovanne EV1
    digitalWrite(PIN_RELAIS_EV2, HIGH); // Envoie du courant au pin relais, l'electrovanne EV2
    digitalWrite(PIN_RELAIS_EV3, LOW); // Envoie pas de courant au pin relais, l'electrovanne EV3  
  }
  if (millis() - temps_debut_osmolation >= 10000){  // Si la durée d'osmolation = 10000 ms
      digitalWrite(PIN_RELAIS_EV1, LOW); // N'envoie plus de courant sur le pin relais, EV1 se coupe
      }
  if (millis() - temps_debut_osmolation >= 4000) { // Si la durée d'osmolation dépasse = 4000 ms
     digitalWrite(PIN_RELAIS_EV2, LOW);// N'envoie plus de courant sur le pin relais, EV2 se coupe
      }
  if (millis() - temps_debut_osmolation >= 3000) { // Si la durée d'osmolation dépasse = 3000 ms
     digitalWrite(PIN_RELAIS_EV3, HIGH);// N'envoie plus de courant sur le pin relais, EV3 se coupe
      }  
   if (digitalRead(PIN_CAPTEUR_CUVE_HAUT) == LOW) { // Si le pin du capteur est LOW (contact pullup fermé, flotteur haut)
    digitalWrite(PIN_RELAIS_EV1, LOW); // Envoie du courant au pin relais, l'electrovane EV1
    digitalWrite(PIN_RELAIS_EV2, LOW); // Envoie du courant au pin relais, l'electrovane EV2
    digitalWrite(PIN_RELAIS_EV3, LOW); // Envoie du courant au pin relais, l'electrovane EV2
      }
      }

Merci de votre aide

Ton système est une machine à états.
Etat 0 : ttes vannes fermées
Etat 1 : rinçage
Etat 2 : remplissage

Il te faut une variable (un int) qui mémorise l'état en cours.
Ensuite, selon l'état en cours, il te faut des conditions qui vont changer l'état.
Par exemple, si tu est dans l'état 1, la condition qui fait passer à l'état 2 est : le rinçage est en cours depuis 3 minutes ou plus.
Si tu est dans l'état 2, la condition qui ramène à l'état 0 est : réservoir plein.

Après avoir initialisé l'état à 0 dans le setup, tu fais dans loop() un switch ( etat ). Dans chaque cas tu testes tes conditions de changement, si changement d'état il y a, tu agis sur les électrovannes, tu notes le nouvel état .. et c'est tout.

Si je lis bien ton programme, tu fais d'abord un test de niveau bas qui allume EV1 & EV2 et éteint EV3, et lance un chrono.
Puis tu testes différents temps pour agir sur les EV.
Enfin tu testes le niveau haut pour les éteindre toutes.

Ça suppose d'abord que tu démarres toujours sur un niveau bas, sinon le chrono n'est pas initialisé pour les tests et on ne sait pas comment les EV vont se comporter. Tu devrais éteindre toutes tes EV dans le setup pour plus de sûreté.

Ton test sur niveau bas ne prend pas en compte les potentiels rebonds. Je n'y connais rien en aquariophilie, mais j'imagine que les remous peuvent provoquer des ouvertures & fermetures intempestives. Dans ce cas, tu vas réinitialiser ton chrono et relancer les durées de remplissage de EV1 et EV2.

Ensuite tes tests sont faits sans 'else'. Ça veut dire que celui sur EV3 est vrai aussi lorsque les autres sont vrais. Est-ce ce que tu veux ?

Enfin concernant EV3, cette ligne et son commentaire ne sont pas cohérents :

    digitalWrite(PIN_RELAIS_EV3, HIGH);// N'envoie plus de courant sur le pin relais, EV3 se coupe

Bonjour

Attention en sortie d'un osmoseur l'eau n'a plus de pression.
Si tu obtures une sortie ou même seulement ajoute une résistance au passage de l'eau, cela va fausser le rendement de l'osmoseur.

Du coup je ne suis pas sûr que ce soit possible de mettre des electrovannes sur la sortie propre comme tu l'envisages.
Ou alors il faut soigneusement choisir le modèle.
Par exemple une ev qui utilise la pression d'eau pour garantir l'étanchéité lorsqu'elle est fermée, ne conviendra pas.
Pas plus qu'une ev qui, lorsqu'elle est ouverte, a besoin d'un minimum de pression pour que l'eau pousse un clapet à ressort.

Perso je dirigerais plutôt la sortie de l'osmoseur vers une petite cuve intermédiaire de quelques litres, contenant deux pompinettes. La première qui vide la cuve vers le tout à l'égout, la seconde qui vide la cuve vers le réservoir d'eau osmosée. Avec capteurs haut/bas pour déclencher tout ça.
Ce qui permettrait au passage de compter la quantité d'eau osmosée produite, et donc de savoir quand renouveller la membrane de l'osmoseur.

Ou alors, vu que la sortie de l'osmoseur est en petit tuyau souple, un servo qui déplace la tuyau au-dessus de là où ça doit aller = au tout-à-l'égout ou au réservoir.

Comme le dit lesept, il faut tenir compte des mini variations de niveau intempestives générées par le remplissage et la vidange de la cuve de ton osmoloteur.
Je suppose que les capteurs de niveau sont de type à contact sec. Il faut également tenir compte des rebonds des contacts comme pour un bouton poussoir.

Et comme le dit biggil il s'agit bien d'un système à états

Etat 0 : Mise sous tension = état indéterminé si le niveau est supérieur au seuil bas et inférieur au seuil haut
Etat 1 : Cuve pleine (détecté par le capteur de seuil haut). Cet état est fugitif. Dès qu'il est détecté on bascule dans l'état Vidage
Etat 2 : Cuve vide (detecté par le capteur de seuil bas). Cet Etat est fugitif. Dès qu'il est détecté on bascule dans l'état Rinçage
Etat 3 : Rinçage. Cet état se termine à la fin d'une temporisation.A la fin de cet état on bascule dans l'état remplissage.
Etat 4 : Remplissage. Cet état se termine par l'activation du capteur de seuil haut, ou une temporisation de sécurité
Etat 5 : Vidage. Cet état se termine par l'activation du capteur de seuil bas

En se qui concerne les états 4 et 5 la lecture des capteur de seuil ne permet pas de distinguer un état ou l'autre. Dans les 2 cas on a un niveau supérieur au seuil bas et inférieur au seuil haut. Il faut donc mémoriser cet état dans une variable

En ce qui concerne l'état 0, à la mise sous tension on peut forcer l'initialisation du système au choix en état vidage ou remplissage

De plus, pour préserver la membranne de ton osmoseur il ne faut jamais avoir l'électrovanne d'entrée ouverte et les 2 électrovannes de sortie fermées en même temps.
Sur le même principe il vaut mieux éviter de laisser une membranne d'osmoseur inactive trop longtemps. Si aucun remplissage n'est détecté après plusieurs heures, il faut passer en état rinçage pendant quelques minutes.
Un rinçage de 20 minutes est conseillé toutes les 48 heures

Et pour finir, tu peu également cumuler et mémoriser les temps d'utilisation de ta membranne. Connaissant le débit théorique tu auras une indication sur le nombre de litres produits, sachant qu'une membranne à une durée de vie limitée

Merci pour vos retours.

La machine à état me semble une bonne idée, je ne connais pas le principe étant complètement novice en programmation.
Je vais me documenter si je ne m'en sors pas, je viendrai demander conseil

benouahh:
Merci pour vos retours.

La machine à état me semble une bonne idée, je ne connais pas le principe étant complètement novice en programmation.
Je vais me documenter si je ne m'en sors pas, je viendrai demander conseil

Bonsoir
J-M-L à fait/pondu :grin: une excellente approche didactique ICI

Et bricofoy lui créé une lib