Voilà je souhaiterais savoir si il est possible de sauvegarder la valeur d'une variable tous les "x secondes".
Je m'explique, j'ai une variable "rpm" qui est apparemment trop instable ou rapide (capteur magnétique KMZ) pour servir de référence pour différentes commandes (voir mes posts précédents), donc afin de pouvoir récupérer une valeur stable, l'idée serait de stocker tous les "x secondes" la valeur lue afin d'avoir une sorte de moyenne servant de référence pour différentes commandes (ex : arrêt moteur quand rpm=4000).
un tableau contenant les N dernières valeurs et on fait la moyenne sur ces valeurs. A chaque nouvelle mesure on enlève la plus ancienne et on ajoute la nouvelle.
une moyenne pondérée. V = a * mesure + (1-a) * Vprécédent. Ce filtre dispense de gérer un tableau. En jouant sur la valeur de a on pondère plus ou moins l'influence de la dernière mesures par rapport aux précédentes.
Mike74:
comment l'appliquer à ce code qui permet de lire et d'afficher la vitesse rpm :
merci
unsigned byte rpmcount;
float rpm, rpmFiltre;
// Ajuster la valeur suivante entre 0 et 1.0
// plus la valeur est faible plus la mesure actuelle est prépondérante et donc le résultat suit de plus près les variations de l'entrée
// plus la valeur est élevée plus l'historique est prépondérant et donc les variations rapides de l'entrée sont atténuées
float coef = 0.5;
unsigned long timeold;
void setup()
{
Serial.begin(9600);
attachInterrupt(0, rpm_fun, RISING);
}
void loop() {
if (rpmcount >= 20) {
rpm = 60*1000/(millis() - timeold)*rpmcount;
rpmFiltre = lpfilter(rpm, coef, rpmFiltre );
timeold = millis();
rpmcount = 0;
Serial.println(rpm);
}
void rpm_fun()
{
rpmcount++;
//Each rotation, this interrupt function is run twice
}
float lpfilter(float data, float filterVal, float filteredVal){
if (filterVal > 1){
filterVal = .99;
}
else if (filterVal <= 0){
filterVal = 0;
}
filteredVal = (data * (1 - filterVal)) + (filteredVal * filterVal);
return filteredVal;
}
super je te remercie par contre saurais tu comment je peux remettre la valeur rpmFiltre affichée à zero lorsque mon moteur ne tourne plus et comment afficher cette valeur sur un afficheur série ELCD 4 x 20 (lextronic) car cela fait des mois que je me bats avec ce bout de code et je n'y comprend rien. merci.
Pour la remise à zero j'ai essayé cela mais ca marche pas.
volatile byte rpmcount = 0;
float rpm, rpmFiltre = 0;
// Ajuster la valeur suivante entre 0 et 1.0
// plus la valeur est faible plus la mesure actuelle est prépondérante et donc le résultat suit de plus près les variations de l'entrée
// plus la valeur est élevée plus l'historique est prépondérant et donc les variations rapides de l'entrée sont atténuées
float coef = 0.99;
unsigned long timeold = 0;
unsigned long timeoldmesure = 0;
void setup()
{
Serial.begin(9600);
attachInterrupt(0, rpm_fun, RISING);
}
void loop() {
if (rpmcount >= 20){
rpm = 60*1000/(millis() - timeold)*rpmcount;
timeold = millis();
rpmcount = 0.00;
}
if ((rpm > 100) && ((millis() - timeoldmesure)>1000)){
rpmFiltre = lpfilter(rpm, coef, rpmFiltre );
}
else {
rpmFiltre = 0;
}
Serial.println(rpmFiltre);
}
void rpm_fun() {
rpmcount++;
//Each rotation, this interrupt function is run twice
}
float lpfilter(float data, float filterVal, float filteredVal){
if (filterVal > 1){
filterVal = .99;
}
else if (filterVal <= 0){
filterVal = 0;
}
filteredVal = (data * (1 - filterVal)) + (filteredVal * filterVal);
return filteredVal;
}