bonjour !
Dans le cadre d'un stage, je suis en train de faire un montage qui permet de faire des exercices de respiration.
débutant arduino, j'ai passé plus de 2j sur le problème, et impossible de trouver comment faire!
voici mon problème: Je souhaite faire l'intégrale du signal analogique que je récupère sur A0 afin de faire correspondre un volume d'air à un "volume" de tension.
float sensorValue;
float Volume = 0;
float Vt=0;
int k=0;
float Tension;
void setup() {
Serial.begin(9600);
}
void loop() {
sensorValue = analogRead(A0);
if ((sensorValue > (519))||(sensorValue <(497))){ // Si le signal != capteur au repos
Calcul_Volume(); // on appelle la boucle Calcul_Volume
}
else{
if (Volume != 0.00){
Vt=Volume;
Serial.println("vT:");
Serial.println(Vt); // Affiche le résultat de mon intégrale
}
Volume=0;
k=0;
}
}
void Calcul_Volume(){
while (sensorValue > (519)){ // Ne boucle que si le signal correspond à une inspiration
sensorValue = analogRead(A0); // lis la valeur sur A0
sensorValue = sensorValue -508; // fait le 0 (508 etant la valeur de mon capteur au repos)
Tension = sensorValue * (5.0/1024.0); // transforme en Volts
Volume= ((Tension)*0.01) + Volume; // Calcul l'intégrale du signal récupéré
k++; // nombre de point de mesure pris
}
}
le problème c'est que je multiplie par 10ms alors que je ne sais pas toutes les combien de seconde la lecture de A0 se fait. J'aimerais donc dire à mon arduino d’exécuter l’intérieur de ma boucle while précisément toutes les 10ms pour que la lecture soir adaptée à mon calcul.
j'ai testé avec Simple.timer, Timer.h, msTImer2 ... je suis paumée.
Merci d'avance, j’espère avoir été assez claire pour que vous puissiez m'aider
bonjour,
déjà tu te complique la vie
if ((sensorValue > (519))||(sensorValue <(497))){
...
...
if (Volume != 0.00){
..
..
..
while (sensorValue > (519)){
void loop() {
sensorValue = analogRead(A0);
if ((sensorValue > 519)){ // Si le signal != capteur au repos
Calcul_Volume(); // on appelle la boucle Calcul_Volume
}
else{
Vt=Volume;
Serial.println("vT:");
Serial.println(Vt); // toujours = 0 puisque non calculé quelque part
Volume=0;
k=0;
}
}
void Calcul_Volume(){
// Ne boucle que si le signal correspond à une inspiration
sensorValue = analogRead(A0); // lis la valeur sur A0
Tension = (sensorValue -508)* (5.0/1024.0); // fait le 0 (508 etant la valeur de mon capteur au repos)
Volume= ((Tension)*0.01) + Volume; // Calcul l'intégrale du signal récupéré
k++; // nombre de point de mesure pris
}
il faudrait savoir combien de temps mettent la boucle et le calcul
fonction millis() dans ce cas
ton analogRead A0, c'est quoi comme capteur?
il lui faut combien de temps pour l'acquisition?
Coucou, merci de ta réponse mais je ne peux pas prendre le problème de timer dans le sens que tu voudrais. Le calcul n'est pas un calcul fixe puisqu'il dépend de la respiration et de l'effort qu'on est en train de faire. Et il doit être assez précis puisque mon projet s'inscrit dans un cadre médical pour aider des patients.
Pour répondre tout de même à ta question il s'agit d'un capteur différentiel de pression et il va au dela de 10ms pour l’acquisition.
enfin pour les modifications de code, ça ne va pas parce que :
if ((sensorValue > (519))||(sensorValue <(497))){ // définit l'endroit ou sortir de la boucle principale, afin que le programme puisse effectivement exectuer la boucle en moins de 10ms.
...
...
if (Volume != 0.00){ //c'est pour n'afficher le Vt que si il est différent de zéro, car puisque je le ... reset a la fin de la loop, il n'est affiché que très peu de tps, pas assez pour .. être lisible;
..
..
..
while (sensorValue > (519)){ // permet de faire une boucle qui dure moins de 10ms à s’exécuter
if ((sensorValue > (519))||(sensorValue <(497))){
ca signifie que la valeur prise en compte est entre 0 et 496 OU 520 et 1023
après tu ne prends que la valeur au dessus de 519 dans ton while, donc où est l'intérêt?
puisque tu pars du loop si <497 pour prendre au dessus de 519.
tu perds du temps en ms déjà
il va au dela de 10ms pour l'acquisition.
s'il prend plus de 10ms pour l'acquisition, comment veux tu faire une acquisition toutes les 10ms?
J'aimerais donc dire à mon arduino d'exécuter l'intérieur de ma boucle while précisément toutes les 10ms
il y a un non sens quelque part, non?
donc pour dire de faire un calcul toutes les 10ms, utilise millis()
top_depart = millis()
si millis() - top_depart < 10 ===> on lance le calcul
Bonjour
Une manière ultra-simple d'exécuter une fonction toto() toutes les 10 ms :
#include "simpleMinuteur.h"
simpleMinuteur tempo(10);
void setup() {
...
}
void loop() {
if (tempo) toto();
}
void toto() {
...
}
Le fonction toto() elle-même doit avoir une durée d'exécution inférieure à 10 ms.
Elle sera alors déclenchée toutes les 10 ms.
Nécessite la bibliothèque simpleMinuteur.h
forcément si je m'exprime aussi mal: quand je disais au dela de 10ms c’était pour dire qu'il pouvait faire l'acquisition bien plus rapidement que cela ^^
Sinon merci bricoleau, j'ai essayé avec ta méthode et ça marche enfin
merci aussi a infobarquee