Faire une moyenne via un tableau avec valeurs d'un capteur

faire une moyenne en boucle via un tableau des valeurs issues d'un capteur sonore

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

bonjour, je sollicite votre aide car je cherche depuis 2 semaines le moyen de programmer une moyenne sur arduino.
j'ai besoin de faire ce programme car étant en terminal SSI je dois réaliser un projet en groupe. Le projet consiste en un boitier qui mesure la température ambiante, la luminosité et le niveau sonore pour évaluer l'ambiance dans une classe (le programme final compare les seuils avec les mesures) et un afficheur (led + écran LCD) affiche si l'ambiance est optimal ou pas pour travailler dans de bonne condition. Pour ma partie je dois m'occuper du capteur sonore. je dois donc faire un programme qui affiche des valeurs en décibel, jusqu’à la aucun soucis j'ai fais une courbe caractéristique avec l'aide d'un capteur sonore (voltcraft) et j'ai récupérer le coefficient directeur. mais on a remarquer que les valeurs du capteur varie trop (passant de 20 a 120 db quelque fois) j'ai donc décidé de faire une moyenne en prenant 10 valeurs en sortie du capteur et faire une moyenne avec. procédure que je dois renouveler a l'infini. Après plusieurs recherche et l'aide d'Eskimon je suis arrivé à ceci. le programme ne marche pas car je n'arrive pas a le compiler, je ne sais pas si il fonctionne non plus :/

define SOUND_SENSOR A0

const int analogInPin = A0; //mettre le capteur sur A0

int sensorValue = 0; int db ;

void setup() { Serial.begin(9600); }

while (TRUE) { //boucle qui se répète à l’infinie

void loop() { sensorValue = analogRead(analogInPin);

Serial.print(“sensor = ” ); Serial.println(sensorValue);

double db = 0.1279*sensorValue ; //formule découlant de la caractéristique du capteur sonore }

float tab[11] = {db}; //remplir tableau avec 10 valeurs du capteur qui se suivent

int somme = 0 ;

for (int i = 0 ; i < 11 ; i++) { somme += tab[11] ; //somme des valeurs (db) du tableau }

float dbm = somme / 10.0 ; //valeur moyenne

Serial.print("db = "); //affichage dbm Serial.println(dbm);

delay(1000); }

je vous remercie d'avance pour vos réponses et votre attention :D

Édité par Coyote

+0 -0

Cette réponse a aidé l'auteur du sujet

Ton code entre balises, bien indenté. Ca ne m'étonne pas qu'il ne compile pas:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#define SOUND_SENSOR A0

const int analogInPin = A0; //mettre le capteur sur A0

int sensorValue = 0;
int db ;

void setup()
{
    Serial.begin(9600);
}   

while (TRUE)
{ //boucle qui se répète à l’infinie

void loop()
{
    sensorValue = analogRead(analogInPin);

    Serial.print(sensor =  );
    Serial.println(sensorValue);

    double db = 0.1279*sensorValue ; //formule découlant de la caractéristique du capteur sonore
}   

    float tab[11] = {db}; //remplir tableau avec 10 valeurs du capteur qui se suivent

    int somme = 0;

    for (int i = 0 ; i < 11 ; i++)
    {
        somme += tab[11] ; //somme des valeurs (db) du tableau
    }   

    float dbm = somme / 10.0 ; //valeur moyenne
    Serial.print("db = "); //affichage dbm
    Serial.println(dbm);

    delay(1000);
}   

code corrigé :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#define NB_SAMPLE    10

const int sensorPin = A0; //mettre le capteur sur A0


void setup()
{
    Serial.begin(9600);
}   

void loop()
{
    int sensorValue = 0;
    static long tab[NB_SAMPLE]; //remplir tableau avec 10 valeurs du capteur qui se suivent
    static int tab_index = 0;
    long somme = 0;
    float dbm; 
    sensorValue = analogRead(sensorPin);

    Serial.print(sensor =  );
    Serial.println(sensorValue);

    tab[tab_index] = sensorValue; //remplir tableau avec 10 valeurs du capteur qui se suivent
    tab_index = (tab_index +1)%NB_SAMPLE;

    for (int i = 0 ; i < NB_SAMPLE ; i++)
    {   
        somme += tab[NB_SAMPLE] ; //somme des valeurs du tableau
    }

    dbm = (somme * 0.1279) / 10.0 ; //valeur moyenne
    Serial.print("db = "); //affichage dbm
    Serial.println(dbm);

    delay(1000);
}

J'ai du mal à faire la liste des corrections: syntaxe, utilisation des bons types de données, sauvegarde des données dans un buffer circulaire persistant, cohérence de la taille du tableau, …

Édité par Natalya

+2 -0
Auteur du sujet

Wouah ! merci beaucoup je débute a peine en programmation ^^ je ne saisi pas encore les modifications. je te remercie énormément !! par contre j'ai plusieurs question: - qu'est ce que le buffer circulaire persistant ? - la différence entre float tab et static long tab [NB_SAMPLE] ? - et NB_SAMPLE c'est le nombre de ligne que je veux mettre dans le tableau c'est ça?

en tout cas merci encore!

je n'arrive toujours pas à compiler … :/

Arduino : 1.6.1 (Windows 8.1), Carte : "Arduino Uno"

C:\Program Files (x86)\Arduino/hardware/tools/avr/bin/avr-g++ -c -g -Os -w -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10601 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR -IC:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino -IC:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\standard C:\Users\mickael\AppData\Local\Temp\build2388884321486908163.tmp\programme_final.cpp -o C:\Users\mickael\AppData\Local\Temp\build2388884321486908163.tmp\programme_final.cpp.o

programme_final.ino:20:5: error: stray '' in program

programme_final.ino:20:5: error: stray '' in program

programme_final.ino: In function 'void loop()':

programme_final.ino:20:19: error: 'u201csensor' was not declared in this scope

programme_final.ino:20:34: error: 'u201d' was not declared in this scope

Erreur lors de la compilation.

j'essaie de chercher l'erreur

Édité par mickou

+0 -0

Cette réponse a aidé l'auteur du sujet

NB_SAMPLE, c'est, en anglais, le nombre d'échantillons. C'est le nombre de valeurs que je veux mettre dans le tableau pour faire ma moyenne. le mot clef static, c'est pour que les variables conservent leur valeur d'un appel de loop au suivant. J'aurais pu faire la même chose en les mettant à la suite de const int sensorPin, la seule différence, c'est que, tel que je l'ai fait, je ne peux y accéder que depuis ma fonction loop (et ça tombe bien, je ne veux y accéder que depuis loop). Accessoirement, j'ai aussi mis des entiers dans le tableau, et je ne fais la multiplication par 0.1279 qu'après avoir fait la somme. D'où le passage de float à long. Par contre, j'aurais du mettre int à la place de long, mon tableau occupe plus d'octets que nécessaire en mémoire.

Pour tes erreurs de compilation, des caractères unicodes se sont insérés dans le code lors du copié collé, le compilo ne les aime pas. Ce sont les guillemets, ligne 20. Retire les et mets des guillemets normaux à la place (les même qu'en ligne 32).

Édité par Natalya

+1 -0
Auteur du sujet

d'accord merci beaucoup :) le float c'est donc pour des valeurs a virgule tant dis que le long pour des entiers d'accord d'accord en tout cas un grand merci a toi :D ça marche nikel :)

+0 -0
Auteur du sujet

Salut, j'ai testé le programme avec mon capteur mais les valeurs sont completement fausse voir meme négative du genre:

sensor = 513 db = 21050692.00

sensor = 500 db = -26710256.00

sensor = 486 db = -20636618.00

sensor = 502 db = -13464931.00

sensor = 474 db = -9562247.00

sensor = 513 db = -2390562.00

sensor = 512 db = 3683074.75

sensor = 505 db = 8683809.00

sensor = 506 db = 14757445.00

sensor = 512 db = 21929132.00

j'ai pas l'impression que le tableau se remplisse avec les 10 valeurs du capteur. je essayé bcp de chose mais je n'arrive pas a trouver qu'elle est le probleme

Édité par mickou

+0 -0

Il faut initialiser tab.

1
    static long tab[NB_SAMPLE] = {0}; //remplir tableau avec 10 valeurs du capteur qui se suivent

Mais je ne comprend pas pourquoi tes valeurs sont si élevée.

PS: Ça n'explique pas l'erreur mais :

1
    dbm = (somme * 0.1279) / NB_SAMPLE ; //valeur moyenne

est plus propre qu'une constante magique 10.0

Édité par ache

ache.one                                                                                   🦊

+1 -0
Auteur du sujet

merci mais rien ne change meme apres l'initialisation … normalement les valeurs doivent s'ajouter or dans le tableau (sur le moniteur serie) je ne vois, dans le tableau que les valeurs du capteur (valeurs numérique) avec un écart de 10; 10 tours après qu'une valeur soit passer je retrouve la même valeurs dans le tableau. du coup je pense qu'il faut mettre le tableau or de la boucle pour qu'il puisse ce remplir mais je ne sais pas comment le faire. toute mes tentative ce sont soldé par: "erreur compilation".

Édité par mickou

+0 -0

Montre nous le code que tu utilises

ache.one                                                                                   🦊

+0 -0
Auteur du sujet

define NB_SAMPLE 10

const int sensorPin = A0; //mettre le capteur sur A0

void setup() { Serial.begin(9600); }

void loop() { int sensorValue = 0; static long tab[NB_SAMPLE]; //remplir tableau avec 10 valeurs du capteur qui se suivent static int tab_index = 0; long somme = 0; float dbm; sensorValue = analogRead(sensorPin);

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
Serial.print(“sensor = ” );
Serial.println(sensorValue);

tab[tab_index] = sensorValue; //remplir tableau avec 10 valeurs du capteur qui se suivent
tab_index = (tab_index +1)%NB_SAMPLE;

for (int i = 0 ; i < NB_SAMPLE ; i++)
{   
    somme += tab[NB_SAMPLE] ; //somme des valeurs du tableau
}

dbm = (somme * 0.1279) / 10.0 ; //valeur moyenne
Serial.print("db = "); //affichage dbm
Serial.println(dbm);

delay(1000);

}

Édité par mickou

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte