Faire marcher une led + potentiometre avec un capteur de pulsation + un servomoteur

Bonjour à tous !

Alors voilà je suis face à un problème que je n'arrive pas à résoudre depuis 3 jours.
J'ai une LED blanche branché sur la broche 11, avec un potentiomètre branché en A0, qui me permet de gérer la luminosité.

D'un autre côté, j'ai un capteur de pulsation avec un servomoteur. Le capteur capte un battement, le servomoteur bouge en fonction, simple.

Seulement voilà, quand j'utilise la ligne "if (pulseSensor.begin()) { ; la led ne fonctionne plus comme je le désire. Elle se met à clignoter très rapidement, mais sans aucune logique. Tantôt elle va clignoter, tantôt non, et le potentiomètre ne fait plus rien.

J'ai essayer de mettre en commentaire tout le reste du code, et j'ai petit à petit dé-commenter le code pour trouver d'où venait le problème, c'est la que j'ai découvert que c'était justement cette ligne au dessus, ligne 24 donc. Sachant que le code du capteur de pulsation est un code que j'ai récupérer sur Youtube, je ne suis pas exactement sur du rôle de chaque ligne, j'ai pu écrire une connerie plus grosse que moi (Et je suis pas un poids plume) et ne pas m'en rendre compte.

Merci d'avoir pris le temps de me lire. C'est la première fois que je poste ici, si j'ai fait une erreur quelconque, n'hésitez pas à me le dire évidemment.

#include <Servo.h>
#define USE_ARDUINO_INTERRUPTS true //--> Set-up low-level interrupts for most acurate BPM math.
#include <PulseSensorPlayground.h> //--> Includes the PulseSensorPlayground Library.   
Servo monServo; //On donne le nom monServo à un servomoteur
//----------------------------------------Led et potentiomètre

int led = 11;
int sensorValue;

//----------------------------------------Variable Declaration

const int PulseWire = 1; //--> Le capteur de pulsation est branché sur A1
int Threshold = 550; //--> Determine quel Signal je dois compter comme un battement et quel signal je dois ingnorer

//----------------------------------------
                               
PulseSensorPlayground pulseSensor; //--> Creates an instance of the PulseSensorPlayground object called "pulseSensor"

//--------------------------------------------------------------------------------void setup
void setup() {  
  monServo.attach (5); //Commande du servomoteur en D5   
  Serial.begin(9600); //--> Set's up Serial Communication at certain speed.

  //----------------------------------------Configure the PulseSensor object, by assigning our variables to it. 
  pulseSensor.analogInput(PulseWire);   
  pulseSensor.setThreshold(Threshold);   
  //----------------------------------------

  //----------------------------------------Double-check the "pulseSensor" object was created and "began" seeing a signal. 
   if (pulseSensor.begin()) {
  Serial.println("We created a pulseSensor Object !"); //--> This prints one time at Arduino power-up,  or on Arduino reset.
  }
  //----------------------------------------
}
//--------------------------------------------------------------------------------

//--------------------------------------------------------------------------------void loop
void loop() {
sensorValue = analogRead(A0);
sensorValue = map(sensorValue, 0, 1023, 0, 255);

analogWrite(led, sensorValue);
  
  int myBPM = pulseSensor.getBeatsPerMinute(); //--> Calls function on our pulseSensor object that returns BPM as an "int". "myBPM" hold this BPM value now.

  //----------------------------------------Constantly test to see if "a beat happened". 
  if (pulseSensor.sawStartOfBeat()) { //--> If test is "true", then the following conditions will be executed.
    Serial.println("♥  Oh ! Un battement de coeur ! "); //--> Print a message "a heartbeat happened".
    Serial.print("BPM: "); //--> Print phrase "BPM: " 
    Serial.println(myBPM); //--> Print the value inside of myBPM. 
  }
  //----------------------------------------
  delay(20); //--> considered best practice in a simple sketch.
    if(myBPM < 40){
      monServo.write (180);
    }
    if((myBPM >= 41) && (myBPM<=49)){
      monServo.write (170);
    }
    if((myBPM >= 50) && (myBPM<=59)){
      monServo.write (160);
    }
    if((myBPM >= 60) && (myBPM<=69)){
      monServo.write (160);
    }
    if((myBPM >= 70) && (myBPM<=79)){
      monServo.write (150);
    }
    if((myBPM >= 80) && (myBPM<=89)){
      monServo.write (140);
    }
    if((myBPM >= 90) && (myBPM<=99)){
      monServo.write (130);
    }
    if((myBPM >= 100) && (myBPM<=109)){
      monServo.write (120);
    }
    if((myBPM >= 110) && (myBPM<=119)){
      monServo.write (110);
    }
    if((myBPM >= 120) && (myBPM<=129)){
      monServo.write (100);
    }
    if((myBPM >= 130) && (myBPM<=139)){
      monServo.write (90);
    }
    if((myBPM >= 140) && (myBPM<=149)){
      monServo.write (80);
    }
    if((myBPM >= 150) && (myBPM<=159)){
      monServo.write (70);
    }
    if((myBPM >= 160) && (myBPM<=169)){
      monServo.write (60);
    }
    if((myBPM >= 170) && (myBPM<=179)){
      monServo.write (50);
    }
    if((myBPM >= 180) && (myBPM<=189)){
      monServo.write (40);
    }
    if((myBPM >= 190) && (myBPM<=199)){
      monServo.write (30);
    }
}

Dans les parenthèses qui suivent le mot clé if on doit trouver une expression booléenne : c'est vrai ou c'est faux.
Exemple le double signe d'égalité == compare ce qui est à gauche avec ce qui est à sa droite :
x== 10 renvois
"vrai" si X est égal à 10
"faux" si x n'est pas égal à 10

Sachant que par convention "vrai" est égal à 1 et "faux" est égal à toutes valeurs différentes de 1.
Ce n'est qu'une convention.

Premièrement est ce que :
pulseSensor.begin()
renvoie quelque chose ?
Si oui est-ce une expression booléenne ?

Dans le moniteur série oui il me renvoie le message.
Je ne pense pas que ça soit une expression booléenne
Je suis assez néophyte en programmation, comment sait-on si c'est une expression booléenne ?

En consultant la documentation de la bibliothèque.

Généralement dans l'univers arduino il n'y a pas de documentation :sleepy:.
Il faut ouvrir les fichiers de la bibliothèque, principalement le fichier *.h qui contient les définitions des fonctions.

Rappel une bibliothèque n'est pas limitée au fichier *.h .
Il y a aussi le fichier *.cpp
*.h = définitions, déclarations
*.cpp = code

Je viens de vérifier et en effet begin() est bien un booléen

Essaie de passer à un débit plus élevé.
Dans les programme de démo ils préconisent de travailler à 115200 pour ne pas trop perturber le calcul du BPM

Dans setup(), led n'est pas définie en sortie.

Sans effet sur la led. Mais je ne m'était même pas rendue compte que la led n'était pas définie en sortie ^^

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.