Projet d'automatisation de renouvellement d'eau pour aquarium

Cool pour le INPUT_PULLUP, il sera effectivement câblé entre l'entrée 12 et le GND.
pour ce qui est du flotteur effectivement j'ai pu faire quelques essais à l'ohm mètre.
Sinon je ne comprends pas bien la syntaxe AND, je souhaiterai que si une des 2 conditions est remplie arrêter la boucle, c'est le cas avec le AND?

do while est équivalent à "tant que".
Le remplissage doit s'effectuer tant que :

  • la distance est supérieure à 30mm
  • ET
  • le flotteur n'est pas actionné (digitalRead(flotteur) == HIGH)
    Lorsque le flotteur sera actionné, digitalRead(flotteur) retournera LOW.
1 Like

Effectivement c'est plus clair ! J'ai du mal avec le do while. (je vais me remettre une couche sur les boucle)

not, and et or font partie du langage. il y a toute une liste d'alternative aux codes classiques:

Habituel Alternative
&& and
&= and_eq
& bitand
~ compl
! not
!= not_eq
|| or
|= or_eq
^ xor
^= xor_eq
{ <%
} %>
[ <:
] :>
# %:
## %:%:
1 Like

&& et || sont des réflexes datant du siècle dernier :wink:

Et il s'est glissé une coquille de parenthèses dans les bouts de code précédents :
Ce serait plutôt comme ceci :
} while (mm > 30 && digitalRead(flotteur) == HIGH);

c'est ce que j'utilise aussi, même si je peste à chaque fois qu'un caractère invisible est inséré après le | si je tape trop vite... (idem souvent pour le ] ou } - le Mac doit essayer d'être smart sur le caractère UTF8 à insérer et l'IDE ne fait rien pour éviter cela...)

Cela dit, il est préférable que les débutants connaissent && et ||, très largement utilisés.

Des nouvelles ? J'espère que la serpillière n'est pas de sortie :rofl:

Ahah non ca va, a tout moment je décâble l'arduino ^^
J'ai passer pas mal de temps à fabriquer la pièce qui maintient le flotteur, j'ai du rallumer le poste TIG, meuleuse etc... ^^ Sinon la je fait chauffer le fer a souder pour les câbles du flotteur justement, je vais pouvoir tester dans un premier temps simplement avec le flotteur.

Juste pour la serpillière :sweat_smile: j'ai testé avec ce code j'ai du arrêter manuellement :thinking:
le flotteur est câblé en 12 et gnd.

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

    
    // ***********  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 (digitalRead(flotteur) == HIGH); //arrêt dés 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);
  }
}

Je vais essayer faire un petit code pour afficher dans le moniteur de série l'état du flotteur et voir si ce n'est pas un souci de câblage sous réserve que le code soit bon.

le flotteur est où ? est-ce qu'il ne passe pas LOW quand vous l'actionnez (vu que c'est sur un PULLUP)?

C'était une erreur de câblage ... Câblé sur le 5V au lieu du gnd a coté ... Quand le flotteur est actionné il est bien en LOW je confirme.
Le flotteur se trouve à la surface, il colle quand le niveau haut est atteint.
Il me semble que cette ligne est bonne:

} while (digitalRead(flotteur) == HIGH); //arrêt dés le flotteur est actionné

OK oui s'il est tout en haut il passe à LOW quand c'est plein

1 Like

Ca marche !
Prochaine étape, câbler la pompe sur le relais qui est en pin 6, pour la couper pendant le remplissage.

Merci à tous pour le coup de main, ça m'a permis de faire avancer ce projet, mention spéciale à @hbachetti et @J-M-L :wink:

Filtre externe (pompe) câblé sur le relais (NO), la pompe coupe pendant le remplissage.

je souhaiterai trouver ou faire un panneau avec des boutons poussoirs momentané, un reset + un start, et également un rotatif 3 positions (position 1 : vidange, position 2 : off, position 3 : remplissage) qui me permettrait d'ajuster le niveau en marche forcé.

Auriez-vous des références à proposer ?

Salut,
Après plusieurs essais le code marchait bien, mais depuis peu impossible de téléverser le code pourtant avant fonctionnel, j'ai des messages d'erreurs.
Si vous avez des idées du pourquoi :

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 && digitalRead(flotteur) == HIGH); //arrêt dés 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);
  }
}

Message d'erreur:

Arduino : 1.8.19 (Windows 10), Carte : "Arduino Uno"

controle_electrovanne_basique_2022-03-14-10-46-56:1:12: error: redefinition of 'const byte ACTIF'

 const byte ACTIF = LOW;

            ^~~~~

E:\document\Arduino\controle_electrovanne_basique\controle_electrovanne_basique.ino:1:12: note: 'const byte ACTIF' previously defined here

 const byte ACTIF = LOW;

            ^~~~~

controle_electrovanne_basique_2022-03-14-10-46-56:2:12: error: redefinition of 'const byte INACTIF'

 const byte INACTIF = HIGH;

            ^~~~~~~

E:\document\Arduino\controle_electrovanne_basique\controle_electrovanne_basique.ino:2:12: note: 'const byte INACTIF' previously defined here

 const byte INACTIF = HIGH;

            ^~~~~~~

controle_electrovanne_basique_2022-03-14-10-46-56:4:12: error: redefinition of 'const byte trig'

 const byte trig = 2; //HC-SR04

            ^~~~

E:\document\Arduino\controle_electrovanne_basique\controle_electrovanne_basique.ino:4:12: note: 'const byte trig' previously defined here

 const byte trig = 2; //HC-SR04

            ^~~~

controle_electrovanne_basique_2022-03-14-10-46-56:5:12: error: redefinition of 'const byte echo'

 const byte echo = 3;

            ^~~~

E:\document\Arduino\controle_electrovanne_basique\controle_electrovanne_basique.ino:5:12: note: 'const byte echo' previously defined here

 const byte echo = 3;

            ^~~~

controle_electrovanne_basique_2022-03-14-10-46-56:6:12: error: redefinition of 'const byte inwater'

 const byte inwater = 4; //pin relais remplissage

            ^~~~~~~

E:\document\Arduino\controle_electrovanne_basique\controle_electrovanne_basique.ino:6:12: note: 'const byte inwater' previously defined here

 const byte inwater = 4; //pin relais remplissage

            ^~~~~~~

controle_electrovanne_basique_2022-03-14-10-46-56:7:12: error: redefinition of 'const byte outwater'

 const byte outwater = 5; //pin relais vidange

            ^~~~~~~~

E:\document\Arduino\controle_electrovanne_basique\controle_electrovanne_basique.ino:7:12: note: 'const byte outwater' previously defined here

 const byte outwater = 5; //pin relais vidange

            ^~~~~~~~

controle_electrovanne_basique_2022-03-14-10-46-56:8:12: error: redefinition of 'const byte pompe'

 const byte pompe = 6; //pin relais arrêt pompe

            ^~~~~

E:\document\Arduino\controle_electrovanne_basique\controle_electrovanne_basique.ino:8:12: note: 'const byte pompe' previously defined here

 const byte pompe = 6; //pin relais arrêt pompe

            ^~~~~

controle_electrovanne_basique_2022-03-14-10-46-56:9:12: error: redefinition of 'const byte flotteur'

 const byte flotteur = 12; //pin flotteur niveau eau (sécutité en cas de défaillance de la sonde HC-SR04)

            ^~~~~~~~

E:\document\Arduino\controle_electrovanne_basique\controle_electrovanne_basique.ino:9:12: note: 'const byte flotteur' previously defined here

 const byte flotteur = 12; //pin flotteur niveau eau (sécutité en cas de défaillance de la sonde HC-SR04)

            ^~~~~~~~

controle_electrovanne_basique_2022-03-14-10-46-56:10:12: error: redefinition of 'const byte bouton'

 const byte bouton = 13; //pin bouton poussoir momentané

            ^~~~~~

E:\document\Arduino\controle_electrovanne_basique\controle_electrovanne_basique.ino:10:12: note: 'const byte bouton' previously defined here

 const byte bouton = 13; //pin bouton poussoir momentané

            ^~~~~~

E:\document\Arduino\controle_electrovanne_basique\controle_electrovanne_basique_2022-03-14-10-46-56.ino: In function 'long int lireDistanceEnmm()':

controle_electrovanne_basique_2022-03-14-10-46-56:13:6: error: redefinition of 'long int lireDistanceEnmm()'

 long lireDistanceEnmm() {

      ^~~~~~~~~~~~~~~~

E:\document\Arduino\controle_electrovanne_basique\controle_electrovanne_basique.ino:13:6: note: 'long int lireDistanceEnmm()' previously defined here

 long lireDistanceEnmm() {

      ^~~~~~~~~~~~~~~~

E:\document\Arduino\controle_electrovanne_basique\controle_electrovanne_basique_2022-03-14-10-46-56.ino: In function 'void setup()':

controle_electrovanne_basique_2022-03-14-10-46-56:20:6: error: redefinition of 'void setup()'

 void setup() {

      ^~~~~

E:\document\Arduino\controle_electrovanne_basique\controle_electrovanne_basique.ino:20:6: note: 'void setup()' previously defined here

 void setup() {

      ^~~~~

E:\document\Arduino\controle_electrovanne_basique\controle_electrovanne_basique_2022-03-14-10-46-56.ino: In function 'void loop()':

controle_electrovanne_basique_2022-03-14-10-46-56:31:6: error: redefinition of 'void loop()'

 void loop() {

      ^~~~

E:\document\Arduino\controle_electrovanne_basique\controle_electrovanne_basique.ino:31:6: note: 'void loop()' previously defined here

 void loop() {

      ^~~~

exit status 1

redefinition of 'const byte ACTIF'



Ce rapport pourrait être plus détaillé avec
l'option "Afficher les résultats détaillés de la compilation"
activée dans Fichier -> Préférences.

N'y aurait-il pas plusieurs fichiers dans le répertoire ?

Effectivement, merci !

J'ai ce code qui fonctionne actuellement que je fais évoluer, j'ai actuellement rajouter une thermistance, pour avoir la température de l'eau de l'aquarium.
modèle de la sonde étanche NTC 3950 10K: lien
j'ai trouver un bout de code sur le net qui fonctionne que j'ai ajouté au projet de base, la précision laisse a désiré :


Pensez-vous qu'il soit possible d'amélioré la précision de la température ?
Le code général est-il clair ? Peut-il être optimisé ?

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;
}

//*****************************TEMPERATURE EAU AQUARIUM**********************************
#include <math.h> //librairie pour le calcul de la thermistance
#define PIN_NTC 0 //pin analogique de la thermistance


double Rref = 10000.0; //Résistance de référence à 25°C
double V_IN = 5.0; //Alimentation électrique
 
//Information de la thermistance
double A_1 = 3.354016E-3;
double B_1 = 2.569850E-4;
double C_1 = 2.620131E-6;
double D_1 = 6.383091E-8;
 
double SteinhartHart(double R)
{
  //Division de l'équation en 4 parties. La premiere est 
  //uniquement A1
  double equationB1 = B_1 * log(R/Rref);
  double equationC1 = C_1 * pow(log(R/Rref), 2);
  double equationD1 = D_1 * pow(log(R/Rref), 3);
  double equation = A_1 + equationB1 + equationC1 + equationD1;
  return pow(equation, -1);
 
}

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;
mm = lireDistanceEnmm();
Serial.print("Distance en mm :"); Serial.println(mm);

//***********************TEMPERATURE EAU************************
//Calcul de la tension sur la borne analogique
double valeurAnalog = analogRead(PIN_NTC);
double V =  valeurAnalog / 1024 * V_IN;
 
//Calcul de la résistance de la thermistance
double Rth = (Rref * V ) / (V_IN - V);
Serial.print("Rth = ");
Serial.print(Rth);
 
//Calcul de la température en kelvin( Steinhart and Hart)
double kelvin = SteinhartHart(Rth);
short int celsius = kelvin - 273.15; //Conversion en celsius
Serial.print(" Ohm  -  T = ");
Serial.print(celsius);
Serial.print("°C\n");
delay(5000);
if (celsius > 30)
  {
      Serial.print("Temperature trop haute\n");
  }
  else if (celsius < 17)
  {
      Serial.print("Temperature trop basse\n");
  }
  else
  {
      Serial.print("Temperature OK\n");
  }
  
if (digitalRead(flotteur) == LOW)
  {
    Serial.print("Flotteur HAUT\n");
  }

  else
  {
      Serial.print("Flotteur BAS\n");
  }
   
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 && digitalRead(flotteur) == HIGH); //arrêt dés 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);

}
}

Merci d'avance :wink:

Lorsqu'on lit un capteur analogique il est préférable d'utiliser une référence de tension stable et précise, sinon le résultat est directement dépendant de la tension d'alimentation. Par exemple si l'on alimente par USB ou en 5V par la broche 5V le résultat sera forcément différent.
Pour cela il faut soit utiliser une référence précise :

  • la référence interne 1.1V : pas très précise ni très stable en température. Il faut la mesurer sur la broche AREF après l'avoir sélectionné (analogReference(INTERNAL))
  • une référence externe précise : la sortie du régulateur 3.3V
  • autre référence de tension du genre TL431

Pourquoi ne pas avoir adopté un capteur numérique DS18B20, précis à 0.5° ?

1 Like