Go Down

Topic: capteur infrarouge sharp utilisation (Read 11768 times) previous topic - next topic

vike229


Un exemple de code en bas de cette page:
http://dfrobot.com/wiki/index.php/Sharp_GP2Y0A21_Distance_Sensor_%2810-80cm%29_%28SKU:SEN0014%29

Je ne sais pas s'il existe sur terre un capteur destiné à fonctionner avec un Arduino qui n'a pas un exemple de code qui traine quelque part. C'est ce que tu dois chercher en premier quand tu as un problème de ce type.


désolé je ne comprend pas le programme , ce ne serait pas un goto ?



la seule séance que j'ai c'est vendredi (2h) je pensais juste que le temps nous manquait , donc essayer d'etre le plus précis possible.
c'est vrai c'est pas le meilleur choix
le changement de technologie est impossible car tout notre systeme est fait pour un capteur infrarouge. Pour changer de référence il nous suffirai de déconnecter l'ancien et de reconnecter le nouveau .
Mais en 2 heures on peut toujours essayer, je suis désolé d'avoir oublié de mentionner l'autre capteur

pas de probleme , si tu en a aussi un de dispo et qu'il semble plus adapté à l'etendue de mesure.

2 heures c'est tres vite passé (et c'est surement 2 heures "theoriques" , mais en pratique ...  :smiley-mr-green:  )

perso , je crois qu'il faut oublier l'utilisation d'une Vref externe
et te concentrer sur du (pseudo) filtrage numerique

à ta place , je pense que je preparerais plusieurs programmes "verifié en compil OK" puisque tu ne dispose pas de la maquette.
en jouant essentiellement sur les parametres de filtrage/lissage.

expose déjà ici un programme faisant une moyenne simple sur X acquisitions (X = ~ 10 )
ça demontrera que tu aura bien compris le principe, et ensuite "on" affinera  :smiley-mr-green:

merci du conseil ! j'ai pas trop compris le principe, c'est a dire je lis x fois le niveau de la cuve puis je trouve une valeur moyenne ?

Artouste



... j'ai pas trop compris le principe, c'est a dire je lis x fois le niveau de la cuve puis je trouve une valeur moyenne ?

voilà
par exemple 10 acquisitions de niveau et tu "sort" la moyenne

vike229

#17
Feb 09, 2014, 12:29 pm Last Edit: Feb 09, 2014, 12:33 pm by vike229 Reason: 1
Code: [Select]
#include <LiquidCrystal.h> // librairie

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
int valeur1;
int valeur2;
int valeur3;
int valeur4;
int valeur5;
int capteur = A5;
int moyenne;

void setup() {
  lcd.begin(16, 2); // configurer le lcd
}

void loop () {
  valeur1 = analogRead(capteur);
  delay(2000);
  valeur2 = analogRead(capteur);
  delay(2000);
  valeur3 = analogRead(capteur);
  delay(2000);
  valeur4 =analogRead(capteur);
  delay(2000);
  valeur5 = analogRead(capteur);
  delay(2000);
  moyenne = (valeur1 + valeur2 + valeur3 + valeur4 + valeur5)/5;
  lcd.print(moyenne);
}
 

Voila ...

Artouste


Code: [Select]
#include <LiquidCrystal.h> // librairie

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
int valeur1;
int valeur2;
int valeur3;
int valeur4;
int valeur5;
int capteur = A5;
int moyenne;

void setup() {
  lcd.begin(16, 2); // configurer le lcd
}

void loop () {
  valeur1 = analogRead(capteur);
  delay(2000);
  valeur2 = analogRead(capteur);
  delay(2000);
  valeur3 = analogRead(capteur);
  delay(2000);
  valeur4 =analogRead(capteur);
  delay(2000);
  valeur5 = analogRead(capteur);
  delay(2000);
  moyenne = (valeur1 + valeur2 + valeur3 + valeur4 + valeur5)/5;
  lcd.print(moyenne);
}
 

Voila ...

oui, mais il y a peut etre plus simple  :smiley-mr-green:
imagine que tu doive faire la moyenne de 10000 valeurs ?

vike229

#19
Feb 09, 2014, 12:49 pm Last Edit: Feb 09, 2014, 12:51 pm by vike229 Reason: 1
il faut utiliser un fonction do while ?
ou plutôt la fonction for ?

Artouste


il faut utiliser un fonction do while ?
ou plutôt la fonction for ?

allez part plutot sur une boucle for  :smiley-mr-green:
et rappelle toi qu'une  moyenne ordinaire (arithmétique) c'est juste une somme (d'additions) / le nombre d'additions

vike229

Code: [Select]
#include <LiquidCrystal.h> // librairie

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
int valeur;
int capteur = A5;
int moyenne;

void setup() {
  lcd.begin(16, 2); // configurer le lcd
}

void loop () {
for (valeur = 1 ; valeur<=10 ;valeur++){
  valeur = analogRead(capteur);
}
moyenne = valeur / 10;
lcd.print(moyenne);
}


comment faire pour que les dix valeurs stockées soient additionnées ?

Artouste


Code: [Select]
#include <LiquidCrystal.h> // librairie

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
int valeur;
int capteur = A5;
int moyenne;

void setup() {
  lcd.begin(16, 2); // configurer le lcd
}

void loop () {
for (valeur = 1 ; valeur<=10 ;valeur++){
  valeur = analogRead(capteur);
}
moyenne = valeur / 10;
lcd.print(moyenne);
}


comment faire pour que les dix valeurs stockées soient additionnées ?

hé non
là ça ne marche pas  :smiley-mr-green:
relis tranquillement ma reponse au dessus
je remets ici

Quote
rappelle toi qu'une  moyenne ordinaire (arithmétique) c'est juste une somme (d'additions) / le nombre d'additions



fdufnews

#23
Feb 09, 2014, 01:45 pm Last Edit: Feb 09, 2014, 02:00 pm by fdufnews Reason: 1
Tu n'as pas l'impression d'utiliser valeur pour faire 2 choses différentes dans la même boucle

vike229

Code: [Select]
#include <LiquidCrystal.h> // librairie

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
int valeur;
int somme;
int capteur = A5;
int moyenne;
int valeurCapteur;

void setup() {
  lcd.begin(16, 2); // configurer le lcd
}

void loop () {
for(int i=1 ; i<=10 ;i++){
  valeurCapteur = analogRead(capteur);
  valeur = valeurCapteur + valeur;
}
moyenne = valeur / 10;
lcd.print(moyenne);
}

voila ma deuxième proposition, c'est juste ?

Artouste


...
voila ma deuxième proposition, c'est juste ?

c'est bien moins pire  :smiley-mr-green:

2 remarques :
- tu defini des variables que tu n'utilise finalement pas ( ex: somme)
- tu oublie la lecture du datasheet du capteur qui expose un delai mini entre 2 mesures pour disposer d'un etat VOutput considéré stable.

retour à ton clavier , pour faire mieux  8)




vike229

#26
Feb 09, 2014, 03:28 pm Last Edit: Feb 09, 2014, 03:33 pm by vike229 Reason: 1
D'accord il suffit donc de rajouter un delay dans le for et de supprimer la variable de trop ? :smiley-roll-sweat:

Code: [Select]
#include <LiquidCrystal.h> // librairie

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
int valeur;
int capteur = A5;
int moyenne;
int valeurCapteur;

void setup() {
 lcd.begin(16, 2); // configurer le lcd
}

void loop () {
for(int i=1 ; i<=10 ;i++){
 valeurCapteur = analogRead(capteur);
 valeur = valeurCapteur + valeur;
 delay(2000);
}
moyenne = valeur / 10;
lcd.print(moyenne);
}

un delay de 500ms suffirait ?

EDIT:  je sais pas trop , enfin je le ferais comme ça

Artouste


D'accord il suffit donc de rajouter un delay dans le for et de supprimer la variable de trop ? :smiley-roll-sweat:


un delay de 500ms suffirait ?


peut etre, peut etre pas  :smiley-mr-green:
Je ne sais pas , je ne connais pas le capteur  :smiley-mr-green:
mais c'est surement une information de delai mini que tu trouvera suite à la lecture du datasheet  8)

vike229

selon le constructeur "38.3ms±9.6ms"donc un delay de 50 à 100ms suffirait .
pour la suite du programme je fait un index (des nombres), je compare la valeur moyenne du capteur  à l'index  puis avec cette distance je calcul le volume ?

en tout cas merci infiniment !  :D :smiley-mr-green:

fdufnews

Au début de loop il faudrait peut être remettre valeur à zéro.

Go Up