Détecteur de sons(Projet TPE 1ereS)[RESOLU]

Bonjour à tous,
Bon premièrement je sais que demander de l'aide sur un forum sans se présenter avant c'est pas forcément génial et j'en suis désolé..Mais c'est surtout parce que je viens ici exceptionnellement pour notre fameux projet si je devais y devenir un membre plus actif je me présenterais avec plaisirs ^^.

Bon alors, comme dit dans le titre je suis en projet de TPE en 1ereS,
notre projet consiste à améliorer un petit bateau rameur électrique, qui ne peut qu'avancer ou reculer.
Seulement pour l'activer il faut déclencher manuellement un levier, ce qui n'est pas pratique du tout.
Nous avons donc voulus faire en sorte qu'il se déclenche par le son.

En gros voilà ce qu'on veut faire :
-Un claquement de mains : le bateau avance
-Deux claquements de mains : le bateau recule
-Trois claquements de mains : le bateau s’arrête

Pour ce faire on dispose d'un processeur, d'un relayeur et d'un détecteur son,
Le problème d'origine viens du code.. mais là en le vérifiant chez moi je me rends compte que le détecteur son ne détecte rien.. on a dût le débrancher pour le monter sur une plaque plexi, je l'ai prit chez moi pour le travailler, mais je croit bien que je n'arrive pas a bien faire les branchements.. ><

Le détecteur a :
1fil jaune connecté a la borne "SIG" que j'ai connecté au "S" de l'entrée analogique A3 de l'arduino
1fil blanc non connecté
1fil rouge "VCC" connecté au "V" de l'arduino enA3
1fil noir "GND" connecté au G de l'arduino aussi en A3

pourtant tout me semble correct et ça marchait bien en classe..

et le code ou je l'appelle :

int valeurSortante = 0;
bool ledsOn = false;

void setup() 
{
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);

Serial.begin(9600);
}

void loop() 
{
 valeurSortante = digitalRead(A3);
 StopLeds();

 if(valeurSortante >= 10 && ledsOn == false)
 {
    digitalWrite(4, HIGH);
    digitalWrite(5, HIGH);
    ledsOn = true;
 }
}

void StopLeds()
{
  delay(2000);
  if(ledsOn == true)
  {
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
    ledsOn = false;
  }
}

merci d'avance!

edit : Sujet résolu, code final :

int valeurSortante = 0;
unsigned long top;
int totaltop = 0;
int filtre = 300;
int totalTip = 0;
int topcount;
void setup()
{
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);

  Serial.begin(9600);
}


void loop()
{
  valeurSortante = analogRead(A0);
  // Serial.println(valeurSortante);

  if (valeurSortante >= filtre && topcount == 0)
  {
    top = millis();
topcount = 1;
Serial.println(top);
    Serial.println("boucle depart");
  }
if(totaltop > 3) totaltop = 0;

  if (valeurSortante >= filtre && topcount == 1 && millis() - top < 1000)
  {
    totaltop++;
    top = millis();
    Serial.println(totaltop);
    Serial.println("boucle deux");
    Serial.println(valeurSortante);
  }

  if (topcount == 1 && totaltop < 4 && millis() - top > 1000)
 //  if (topcount == 2 && millis() - top > 1000)

  {
    Serial.println("boucle trois");

    Serial.println(totaltop);

    //totalTip = totaltop;
    switch (totaltop) {
      case 1 :

        AllumerLesDeuxLeds();
        break;

      case 2 :

        AllumerUneLed();
        break;
      case 3 :

        EteindreLesLeds();
        break;
    }
 
                totaltop = 0;
                topcount = 0;
  }
  Serial.println(totaltop);
        //totaltop = 0;





}




void AllumerLesDeuxLeds()
{
  digitalWrite(4, HIGH);
  digitalWrite(5, HIGH);
  
  Serial.println("1all");
                totaltop = 0;
                topcount = 0;
                delay(5000);
return;
}

void  AllumerUneLed()
{
  digitalWrite(4, HIGH);
  digitalWrite(5, LOW);
  Serial.println("2all");
              totaltop = 0;
                              topcount = 0;

                delay(5000);

return;

}

void EteindreLesLeds()
{
  digitalWrite(4, LOW);
  digitalWrite(5, LOW);
  Serial.println("3all");
              totaltop = 0;
              topcount = 0;

                delay(5000);

return;

}

pensez à régler la valeur de "filtre" en fonction de l'endroit

OH MON DIEU, je viens de comprendre a quel point je suis débile!
J'ai utilisé le digitalRead au lieu de analogRead ce qui fait qu'effectivement mon programme ne lisait jamais la valeur et que mon branchement fonctionne très bien... --
Du coup j'ai toujours mon premier problème pour lequel je suis venu à la base..

En fait le problème viens du code, j'ai quelques bases en prog(pas en électronique néanmoins.. ) et j'ai donc pût assez facilement faire détecter un claquement de main au détecteur puis faire allumer les leds en conséquences (les moteurs ne sont pas encore branchés mais ça ce n'est que des branchements/variables)
La difficulté vient quand je doit trier ses actions en fonction du nombre de claquements consécutifs qu'il reçoit.

J'ai donc en premier lieu cherché sur internet si il n'y avait pas de tutos à ce propos et je n'ai malheureusement rien trouvé..

Voici pour le moment la solution à laquelle j'ai pensé, elle me semble bonne du moins en théorie, mais je n'arrive pas a bien la retranscrire en code...
Pour moi ça donnerait quelque chose dans le genre :

-si je détecte un son :
j'attends quelques millièmes de secondes
-alors :
si j'ai bien entendu un son :
je ré attend pour un autre son
-sinon :
j'avance

Et bien sur en répétant la boucle une autre fois pour reculer ou s'arrêter
Je me suis donc tourné vers les if/else if et else mais malheureusement cela ne marche pas du tout, je pense que cela vient du fait que la fonction tourne en boucle, mais du coup je ne voit pas comment procéder..

J'ai aussi pensé qu'une boucle while/do..while pourrait marcher mais ça me semble un peut tordu..

Le code est toujours le même ^^(j'ai refait les branchements en A0)

int valeurSortante = 0;
bool ledsOn = false;

void setup() 
{
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);

Serial.begin(9600);
}

void loop() 
{
 valeurSortante = analogRead(A0);
 StopLeds();

 if(valeurSortante >= 10 && ledsOn == false)
 {
    digitalWrite(4, HIGH);
    digitalWrite(5, HIGH);
    ledsOn = true;
 }
}

void StopLeds()
{
  delay(2000);
  if(ledsOn == true)
  {
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
    ledsOn = false;
  }
}

Merci d'avance pour votre aide! :slight_smile:

bonjour,
fonction millis()
ca pourrait donner un truc de ce genre

si un son est détecté => top = millis() => total_top = 1
si un autre son est détecté ET millis()-top < 1000 (1 seconde pour exemple) total_top +1 et top = millis()
si aucun son est détecté OU un autre son est détecté ET millis()- top > 1000 total_tip = total_top

si total_tip = 1 => faire telle action => total_top = 0
si total_tip = 2 => faire telle action => total_top = 0
si total_tip = 3 => faire telle action => total_top = 0

Merci beaucoup de ta réponse, en effet j'ai bêtement pensé que la fonction millis équivoquait à la fonction delay() alors que pas du tout..

Je pense avoir comprit le principe, seulement, que représente top, tip, total_tip, total_top?
Je suppose que c'est le nombre de claquements de mains détectés mais je suis un peut perdu, surtout pour tip? au final c'est quoi? parce que je ne te voit l'utiliser qu'a la toute fin

edit : je viens de voir que total_tip = total_top autant pour moi je vais déjà retranscrire ceci en code et éclaircir les zones sombres mais je pense avoir comprit ^^

j'ai mis top tip etc ... comme j'aurai pu mettre salade concombre, pistache. :slight_smile:

Ahah oui j'ai bien comprit qu'il sagissait de nom de variables, sur le coup c'était leur rôle ect que j'avais pas comprit ^^

Bon pour l'instant j'ai ceci :

int valeurSortante = 0;
int top = 0;
int totalTop = 0;
int filtre = 600;
int currTime = 0;
int totalTip = 0;

void setup() 
{
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);

Serial.begin(9600);
}

void loop() 
{
 currTime = millis();
 valeurSortante = analogRead(A0);

 if(valeurSortante >= filtre)
 {
   top = millis();
   totalTop = 1;
   //totalTip = totalTop;
   if(valeurSortante >= filtre && millis()-top < 1000)
   {
    totalTop = 2;
    top = millis();
    totalTip = totalTop;   
    
    if(totalTip == 1)
   {
    AllumerLesDeuxLeds();
   }
   else if(totalTip == 2)
   {
    AllumerUneLed();
   }
   else if(totalTip == 3)
   {
    EteindreLesLeds();
   }
   }
 }
}

void AllumerLesDeuxLeds()
{
    digitalWrite(4, HIGH);
    digitalWrite(5, HIGH);    
    totalTop = 0;
}

void  AllumerUneLed()
{
  digitalWrite(4, HIGH);
  digitalWrite(5, LOW);
  totalTop = 0;
}

void EteindreLesLeds()
{
  digitalWrite(4, LOW);
  digitalWrite(5, LOW);
  totalTop = 0;
}

Le problème étant que la fonction "AllumerUneLed()" se lance instantanément après que je tape des mains... j'ai bien essayer de mettre un delay avant les vérifications de "totalTip" pour laisser le temps de calculer mais ça ne marche pas.. je ne comprends pas pourquoi passe par le deuxième condition directement..

testes ca

void loop()
{
 valeurSortante = analogRead(A0);

 if(valeurSortante >= filtre && totaltop == 0)
 {
   top = millis();
  totaltop++;
}


   if(valeurSortante >= filtre && totaltop > 0 && millis()-top < 1000)
   {
    totalTop++;
    top = millis();
     }

  if(valeurSortante >= filtre && totaltop > 0 && millis()-top > 1000)
   {
    totalTip = totalTop;   

                 if(totalTip == 1)
                {
                totaltop =0;
               AllumerLesDeuxLeds();
               }
               if(totalTip == 2)
               {
               totaltop =0;
               AllumerUneLed();
              }
              if(totalTip == 3)
             {
               totaltop =0;
               EteindreLesLeds();
              }


     }else{
      totaltop =0;
      EteindreLesLeds();
    }



   
 
   
 }

Je viens d'essayer et rien ne se passe ><
Pourtant j'ai beau lire et relire le code je ne voit pas du tout où se situe le problème...
Mais là les leds ne s'allument pas du tout ce qui veut dire qu'il ne prend même pas en compte le 1er clap...

ton filtre est à 600 alors qu'au début il était à 10
dans ce cas, un serial print de la valeur du clap et de totaltop pour debugger

Les prints sont supposés s'afficher sur mon écran d'ordi ou il faut aussi un composant? Parce que je n'ai aucune fenêtre de debuggage qui s'affiche..
Aussi mon relayeur xBee viens de faire clignoter a toute vitesse les leds RL1 et RL2 en faisant un bip je pense pas que ce soit normal... ._.
Pour l'histoire du filtre en effet je l'ai passé à 600 entre temps mais ce n'est pas le problème, je l'avais passé à 600 bien avant celà et les sons étaient détectés parfaitement(j'ai aussi essayer de le passer à 10 sur ce programme au cas où mais ça n'a pas marché, c'est là que le bip c'est produit j'ai de suite arretté)

si tu ouvres pas la console de l'ide, comment veux tu voir quelque chose?
tu as déjà Serial.begin(9600); dans le setup
a toi de mettre des
Serial.println(valeurSortante);
et
Serial.println(totaltop);
pour oir

quant au bip du xbee, il faudrait tout dire aussi.

Bon après recherches, je n'ai rien trouvé concernant une activation quelconque d'un debugger..

Perso les 2 seules consoles que j'ai pût trouvé sont celles là :

J'ai pourtant bien essayer un simple println("Hellow World") au setup mais rien ne s'affiche.. et quand j'ai fait les recherches les personnes ne donnent que les commandes et non une quelconque activation a faire, à l'exeption d'un seul mais qu est sur une version totalement différente de l'arduino que je possède..
Pareil pour la doc officielle, seulement des commandes ils en parlent comme si la console était présente au démarrage.

Ensuite pour le bip il ne fait plus, cependant avec ton programme et les prints les voyants RL1 et RL2 continuent de clignoter à toute vitesse au bout de quelques secondes, serait-ce justement parce que je print sans console??

Je suis désolé de toutes ces questions idiotes qui ont l'air de t'énerver un peu ce que je comprend parfaitement, mais je t'assures que j'essaie du mieux que je peut.. ça fait depuis 11h que je suis là dessus nonstop a faire des tests et des recherches mais rien n'y fait ..

déjà, ca m'étonnerait fortement que ton arduino soit en COM1 comme sur l'image.
il faut sélectionner le bon port COM

la console est bien la fenêtre blanche, ca permet de voir le fameux hello world d'exemple.
évidemment que tu ne trouve rien sur debugger dans l'ide, mais la console permet de le faire en faisant des serial print et voir si les variables sont bien prises en compte, après tu peux les commenter avec des // , les lignes commentées ne seront pas prises en compte dans le prog.

J'avais débranché l'arduino au moment du screen car effectué après les tests mais sinon c'est bien branché sur le COM3 installé uand arduino est branché.
Merci de la confirmation, je vais essayer de voir ce qui cloche et pourquoi je n'ai absolument rien qui s'affiche..

bon j'ai retrouvé un electret et fais des tests
ca fonctionne, sauf que l'electret ne redescend pas assez vite et compte parfois un autre clap

int valeurSortante = 0;
unsigned long top;
int totaltop = 0;
int filtre = 300;
int totalTip = 0;
int topcount;
void setup()
{
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);

  Serial.begin(9600);
}


void loop()
{
  valeurSortante = analogRead(A0);
  // Serial.println(valeurSortante);

  if (valeurSortante >= filtre && topcount == 0)
  {
    top = millis();
topcount = 1;
Serial.println(top);
    Serial.println("boucle depart");
  }
if(totaltop > 3) totaltop = 0;

  if (valeurSortante >= filtre && topcount == 1 && millis() - top < 1000)
  {
    totaltop++;
    top = millis();
    Serial.println(totaltop);
    Serial.println("boucle deux");
    Serial.println(valeurSortante);
  }

  if (topcount == 1 && totaltop < 4 && millis() - top > 1000)
 //  if (topcount == 2 && millis() - top > 1000)

  {
    Serial.println("boucle trois");

    Serial.println(totaltop);

    //totalTip = totaltop;
    switch (totaltop) {
      case 1 :

        AllumerLesDeuxLeds();
        break;

      case 2 :

        AllumerUneLed();
        break;
      case 3 :

        EteindreLesLeds();
        break;
    }
 
                totaltop = 0;
                topcount = 0;
  }
  Serial.println(totaltop);
        //totaltop = 0;





}




void AllumerLesDeuxLeds()
{
  digitalWrite(4, HIGH);
  digitalWrite(5, HIGH);
  
  Serial.println("1all");
                totaltop = 0;
                topcount = 0;
                delay(5000);
return;
}

void  AllumerUneLed()
{
  digitalWrite(4, HIGH);
  digitalWrite(5, LOW);
  Serial.println("2all");
              totaltop = 0;
                              topcount = 0;

                delay(5000);

return;

}

void EteindreLesLeds()
{
  digitalWrite(4, LOW);
  digitalWrite(5, LOW);
  Serial.println("3all");
              totaltop = 0;
              topcount = 0;

                delay(5000);

return;

}

Merci beaucoup!! Ca marche!
Je doit juste régler la valeur du filtre parce que avec l'echo des foits la veleur augmente de plus de 1, et ja vais me renseigner sur le fameux electret et voir si il y a moyen d'arranger cela, il y a juste le "unsigned long" pour la variable top que je ne connaissait pas j'irais voir ce que c'est, pareil pour les cases, je connait à peut près mais je ne maîtrise pas..

Un grand merci de ta patiente et de m'avoir aidé à ce point, j'aurais jamais trouvé tout seul...

de rien
même si c'est un projet exam, au moins tu as fait des efforts de compréhension et d'essayer de trouver par toi même.

Oui j'en ai fait des recherches.. ^^ et même si je ne l'ai pas fait tout seul je peut déjà le comprendre et l'expliquer pour le dossier ce qui est le plus important tu nous sauves vraiment la vie.

édites ton premier message et rajoutes dans le titre [RESOLU]

Ah oui dsl, pas de problème je le fait de suite