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?
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....
#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.