Mesure de niveau d'eau

Bonjour,

J'utilise un capteur pour mesurer un niveau d'eau comme celui ci :

J'ai défini après quelques essais les valeurs qui me servent à allumer des leds de couleurs différentes pour m'indiquer ce niveau (ça fait joli)....

Malheureusement le signal reçu est trop aléatoire, les leds s'allument un peu n'importe comment.

J'ai donc fait plusieurs mesures (10) avec un delai de 100ms entre chaque et calculer une moyenne.

L'affichage par les leds est un peu + stable mais ne refléte pas la réalité. Les leds m'indiquent un niveau bas, un haut un trés haut ect. Ca ne fonctionne pas bien.

Quelqu'un a t il une idée pour rendre cette mesure + stable ou est-ce le capteur qui est en cause?

Merci pour votre aide.

Bonjour,

quel est la référence de ton capteur? A tu sa datasheet?

bonjour

non rien de tout çà :cry:

Désolé

Regarde sur ton capteur, il n'y a pas une référence du genre meb-12c-5 (c'est juste un exemple) écrite dessus?

Non, rien du tout à part Gnd + et S...., une led rouge, un connecteur 3 fils et quelques résistances ..... c'est tout

Voici une photo de MA sonde

J'ai cherché un peu et j'ai trouvé que ton capteur est:
-un capteur d'eau funduino KY-059
-Product Name: water level sensor
-Operating voltage: DC3-5V
-Operating current: less than 20Ma.
-Sensor Type: Analog.
-Detection Area: 40mmx16mm.
-Production process: FR4 double-sided HASL.
-Operating temperature:10?-30?.
-Humidity: 10% -90% non-condensing.
-Product Dimensions: approx. 62mmx20mmx8mm (LWH).
-Weight: About 3.5g.

J'ai pas trouvé de datasheet.

Comme ça pour toi et pour ceux qui voudront t'aidé se sera un peu plus simple en ayant ça.

IL faudrait aussi que tu post ton code s'il te plait (n'oublie pas d'utiliser les balise code).

Voici le bout de code qui gère les leds de niveau :

//  GESTION DU NIVEAU D'EAU

  {
        
    for (int i = 0; i < 10 ; i++)
      {
      SondeNiveau = analogRead(Niveau);
      delay(100); 
      SondeNiveau += SondeNiveau;
      }
      
    Sonde = (SondeNiveau);
  
    if (Sonde < 300) 
      {
        digitalWrite(NBB, HIGH); digitalWrite(NB, LOW); digitalWrite(NN, LOW); digitalWrite(NH,LOW); digitalWrite(NHH, LOW);  // allume la led rouge du niveau très bas
      }
    else if (Sonde >= 300 && Sonde <400) 
      {
        digitalWrite(NBB, HIGH); digitalWrite(NB, HIGH); digitalWrite(NN, LOW); digitalWrite(NH,LOW); digitalWrite(NHH, LOW);  // allume la led orange du niveau bas et éteint la rouge du niveau très bas
      }
    else if (Sonde >= 400 && Sonde < 530) 
      {
        digitalWrite(NBB, HIGH); digitalWrite(NB, HIGH); digitalWrite(NN, HIGH); digitalWrite(NH,LOW); digitalWrite(NHH, LOW);  // allume la led verte du niveau normal et éteint les leds des niveaux inférieurs
      }
    else if (Sonde >= 530 && Sonde < 600) 
      {
        digitalWrite(NBB, HIGH); digitalWrite(NB, HIGH); digitalWrite(NN, HIGH); digitalWrite(NH,HIGH); digitalWrite(NHH, LOW);  // allume la led orange du niveau bas et éteint les leds des niveaux inférieurs
      }
    else if (Sonde >= 600) 
      {
        digitalWrite(NBB, HIGH); digitalWrite(NB, HIGH); digitalWrite(NN, HIGH); digitalWrite(NH,HIGH); digitalWrite(NHH, HIGH);  // allume la led rouge du niveau bas et éteint les leds des niveaux inférieurs
      }

    SondeNiveau = 0;
  }

NBB correspond à la led niveau très bas, NB niveau bas ect....

Post tout ton code, se serais mieux. Merci.

Bonjour,

Dans ton code tu ne fais jamais la moyenne.
Il ne manquerait pas un Sonde=SondeNiveau/10 ?

Voici le code :

#include <config.h>

#include <LiquidCrystal_I2C.h>
#include <Wire.h>

LiquidCrystal_I2C lcd(0x27,20,4);

  
  // Variables et broches pour l'indication de niveau d'eau

  int Niveau = A6; // assigne la pin 6 à l'entrée du signal sonde de niveau
  int SondeNiveau;  // variable de stockage lecture sonde
  int Sonde; // Moyenne pour les leds
  int NHH = 40;  // pilote la led rouge niveau trés haut
  int NH = 41;  // pilote la led orange niveau haut
  int NN = 42;  // pilote la led verte niveau normal
  int NB = 43;  // pilote la led orange niveau bas
  int NBB = 44; //pilote la led rouge niveau trés bas

    
void setup()

  {
    
  pinMode(Niveau, INPUT); pinMode(NHH, OUTPUT); pinMode(NH, OUTPUT); pinMode(NN, OUTPUT); pinMode(NB, OUTPUT); pinMode(NBB, OUTPUT);
    
  lcd.begin();
  lcd.clear();
  Wire.begin();
 
  Serial.begin(9600);
 
  }

void loop()

  
//  GESTION DU NIVEAU D'EAU

  {
        
    for (int i = 0; i < 10 ; i++)
      {
      SondeNiveau = analogRead(Niveau);
      delay(100); 
      SondeNiveau += SondeNiveau;
      }
      
    Sonde = (SondeNiveau);
  
    if (Sonde < 300) 
      {
        digitalWrite(NBB, HIGH); digitalWrite(NB, LOW); digitalWrite(NN, LOW); digitalWrite(NH,LOW); digitalWrite(NHH, LOW);  // allume la led rouge du niveau très bas
      }
    else if (Sonde >= 300 && Sonde <400) 
      {
        digitalWrite(NBB, HIGH); digitalWrite(NB, HIGH); digitalWrite(NN, LOW); digitalWrite(NH,LOW); digitalWrite(NHH, LOW);  // allume la led orange du niveau bas et éteint la rouge du niveau très bas
      }
    else if (Sonde >= 400 && Sonde < 530) 
      {
        digitalWrite(NBB, HIGH); digitalWrite(NB, HIGH); digitalWrite(NN, HIGH); digitalWrite(NH,LOW); digitalWrite(NHH, LOW);  // allume la led verte du niveau normal et éteint les leds des niveaux inférieurs
      }
    else if (Sonde >= 530 && Sonde < 600) 
      {
        digitalWrite(NBB, HIGH); digitalWrite(NB, HIGH); digitalWrite(NN, HIGH); digitalWrite(NH,HIGH); digitalWrite(NHH, LOW);  // allume la led orange du niveau bas et éteint les leds des niveaux inférieurs
      }
    else if (Sonde >= 600) 
      {
        digitalWrite(NBB, HIGH); digitalWrite(NB, HIGH); digitalWrite(NN, HIGH); digitalWrite(NH,HIGH); digitalWrite(NHH, HIGH);  // allume la led rouge du niveau bas et éteint les leds des niveaux inférieurs
      }

    SondeNiveau = 0;
  }

En fait , j'ai modifié les valeurs de seuils je les ai multipliées par 10, donc pas besoin de diviser pat 10 le résultat.

Ca parait être des valeurs très faibles

Erreur ici

      SondeNiveau = analogRead(Niveau);
      delay(100); 
      SondeNiveau += SondeNiveau;

En sortie de boucle for, ta variable contient juste le double de la dernière valeur lue.
Y a mieux comme calcul de moyenne :slight_smile:

Au passage, tes "sonde >= xxx" sont inutiles dans tes if, puisque le cas contraire a déjà été pris dans les if précédents.

Bien vu!

exact,

Merci je vais rectifier ça