Activer lecture/pause fichier wav grâce à capteur PIR

Bonjour,

Je me permet de vous demander votre aie car je suis dans une impasse… Comme l’indique le sujet je voudrais grâce à mon capteur de mouvement PIR déclencher la lecture d’un fichier .wav 8bit 32kHz d’un lecteur de carte SD.

Je me retrouve coincé au niveau de la programmation, c’est à dire que j’arrive à faire un programme pour lancer la lecture de mon fichier audio et l’envoyer dans une enceinte, et j’arrive à faire un programme afin de lire l’état de mon capteur. Malheureusement, lorsque j’essaye de combiner les deux ça coince…

Mon setup est ok, c’est dans mon programme en boucle qu’il y a un problème. Je lui dis que quand la valeur du capteur est haute il faut lire le fichier et quand elle est basse (plus de mouvement) il doit s’arrêter. Mais il y a un problème au niveau de la boucle je ne comprend pas…

Je ne suis pas extrêmement familier de la programmation c++ du coup si quelqu’un aurais une idée de code à faire pour que mon montage fonctionne j’en serais infiniment reconnaissant !

Merci en tout cas d’avoir pris la peine de me lire et je vous souhaite une excellente soirée à tous !

Cordialement.

Postez votre code.

Un PIR généralement va maintenir le signal de détection pendant un certain temps (réglable sur le module par un potentiomètre parfois) même si aucun mouvement n’est détecté

Bonjour tout d’abord merci de ta réponse ! Oui j’hésitais à le poster mais j’avais peut que cela donne un message trop condensé. Voici mon code, je suis parti sur les bases les plus simples en mixant certains modèle de code:

//
#include <SPI.h>
#include <SD.h> 
#define SDPIN 4 
#include <TMRpcm.h> 
File myFile;
TMRpcm tmrpcm;
char caractere;
int inputPin = 2;              
int pirState = LOW;             
int val = 0;     

void setup(){
  Serial.begin(9600); 
     pinMode(inputPin, INPUT);  
  tmrpcm.speakerPin = 9;  
  if (!SD.begin(SDPIN)) { 
    Serial.println("initialization failed!"); 
    return;
  }}

void loop(){
  val = digitalRead(inputPin);  // read input value
  if (val==HIGH) { 
      tmrpcm.play("sounds/pisse1.wav");
      delay(1000);
  if (val==LOW) { 
      tmrpcm.pause;
      delay(1000);
   } } }

void playSound(char *file){
 tmrpcm.play(file);
 return; 
}

Voila malheureusement, un mouvement devant le capteur déclenche la lecture du fichier wav mais je voudrais qu’il s’arrête dès qu’il n’y a plus de mouvement.

Quand tu me dis que je peux varier le temps d’intégration du PIR grâce à un potentiomètre, tu veux dire les deux petits oranges avec les emboues en croix pour accueillir un tournevis cruciforme?

Encore merci.

faut virer ce delay() tout moche :slight_smile: et faire un code qui est plutôt une machine à état (les états seraient au repos et musique en cours et les événements à gérer l'activation ou désactivation du PIR et la fin de la chanson (cf mon tuto éventuellement si vous voulez voir comment on approche ce genre de programme)

Quand tu me dis que je peux varier le temps d'intégration du PIR grâce à un potentiomètre, tu veux dire les deux petits oranges avec les emboues en croix pour accueillir un tournevis cruciforme?

Oui un c'est pour la durée du maintient du déclenchement et l'autre la sensibilité. mais vous ne pourrez sans doute pas régler la durée à 0, c'est toujours quelques secondes ou dizaines de secondes car c'est composants sont fabriqués en grande série pour être intégré dans des éclairages pilotés

un PIR a besoin de 30s à 60s de repos pour se calibrer. faut intégrer cela dans le setup()

Vous pouvez lire cet article pour plus d'infos

---- sinon:
corrigez votre post ci dessus et rajoutez les code tags autour du code:
[code]`` [color=blue]// votre code ici[/color] ``[/code].

ça doit ressembler à cela:// votre code ici
(faites aussi ctrl-T (PC) or cmd-T (Mac) dans l'IDE avant de copier le code pour qu'il soit indenté correctement)

Ok du coup je suis parti sur un code de machine à état mais il y a un petit point que je n'arrive pas à déterminer, que dois-je mettre comme variable? Puis-je directement mettre le "pirState" ou dois définir une variable qui y correspond?

Bon finalement j'ai plus ou moins "réussi" avec votre méthode mais j'ai toujours le même problème, le fichier se lance mais je n'arrive pas à l'arrêter, c'est comme si il ne prenait pas en compte mon état bas de capteur.

Avec la méthode if, j'arrive à programmer pour qu'il lit simplement la musique lors d'un mouvement, mais lorsque je veut ajouter une condition pour l'état bas avec "tmrpcm.pause()", il ne le prend pas en compte (la musique continue malgré l'absence de mouvement et la lecture est comme ralentie (chose que je n'ai pas lorsque le capteur à simplement un rôle de déclencheur).

Voilà j'espère être assez clair et surtout qu'il y a une solution à mon problème...

Merci encore en tout cas.

postez le code

//
   void loop(){
   val=digitalRead(inputPin);
    switch (val) {
       case 1:
    tmrpcm.play("sounds/pisse1.wav");
      break;
     case 0:
     tmrpcm.pause();
     break;
   
    }}

Voici ce que j'ai fait pour la progra état, comme je le dit avant ca envoi la musique (ralentie) et elle ne s'arrête pas.

     void loop(){
    val = digitalRead(inputPin);
   tmrpcm.play("sounds/pisse1.wav");  
    if (val==0){
     tmrpcm.pause();}
     else{
     tmrpcm.pause();
     }  }

Je suis ensuite parti sur cette config en suivant le langage tmrpcm audio et la fonction "tmrpcm.pause();" qui permet de stopper et relancer la lecture mais rien (comme un problème de boucle). J'ai également testé cette manip avec la fonction "switch" (état).

Bref j'ai essayé avec la fonction "do..while", avec le "return" en me disant que c’était un problème de boucle (j'ai l'impression que les états du capteur changent tellement vite que dans ma boucle il lance la lecture et l’arrête et ainsi de suite à l'infini qui me fait un genre de noise de lecture). En effet j'ai également essayé plutôt que de stopper la lecture d'envoyer un fichier pour un état du capteur et un autre vide (puis un normal) pour l'autre état mais pareil, un noise comme celui du lancement de lecture causé par le delay du traitement du capteur et de ses données par l'arduino.

J'ai tout simplement l'impression que cela vient du langage tmrpcm audio qui ne peut pas prendre en charge ce que je veut faire.

Ce n’est pas la bonne approche - vous lancez la musique à chaque tour de loop()... lisez le tuto

Vous devez démarrer dans l’état « je ne fais rien ». Quand vous recevez l’evenement « mouvement » vous déclenchez la musique et passez à l’état « musique en cours capteur actif ». Là deux évènements peuvent se produire : « fin du mouvement » ou « fin de la musique ». Vous devez définir ce que vous faites pour chacun des états.

Si c’est fin de la musique alors vous retournez dans l’état « je ne fais rien ».

Si vous voulez arrêtez la musique au prochain mouvement, quand vous recevez « fin du mouvement » et êtes dans l’état « musique en cours capteur actif» vous passez dans un nouvel état « musique en cours capteur inactif»

Et vous attendez les événements
pour « fin de musique » vous retournez dans l’état « je ne fais rien ».
Pour « mouvement » vous éteignez la musique et retournez dans l’état « je ne fais rien ».

En gros - c’est ça,que doit faire la machine à états. Faites un dessin comme dans le tuto et vous verrez que ça se programme simplement