Problème avec mes variables

Bonjour ou Bonsoir, je dois finir un projet pour ma matière au baccalauréat (ISN : Informatique et Sciences du Numérique)
Je dois réaliser un “clavier” virtuel, où grâce à un capteur, je joue une note de musique.
Mais j’ai un problème, j’ai défini des variables qui oscille entre la valeur 1 (cas où je joue une note de musique)
et la valeur 0 (cas où je ne joue pas une note de musique)

Mais ce qui me pose problème, c’est que quand je passe brievement ma main devant le capteur, la note se joue sans problème, mais une fois que je garde ma main sur mon capteur, la variable que j’ai défini prend une “infinité” de fois la valeur 1, qui fait que ma note se joue en boucle, je n’entend donc pas ma note.

Ma question est donc, pouvons nous “affecter” une seule et unique fois une valeur sur une variable, pour me permettre de tenir ma note?

Merci :slight_smile:

bonjour,
un code a proposer déjà?
entre balise code </>

Oui,

  char recvChar1 = '0';
  char recvChar2 = '0';

  if (!(digitalRead(2)))
  {recvChar1 = '1';
  }
  else
  {recvChar1 = '0';
  }

    if (!(digitalRead(3)))
  {recvChar2 = '1';
  }
  else
  {recvChar2 = '0';
  }
  


 switch (recvChar1)
    {
        case '1':
            SpecifyMusicPlay(1);
            break;
        
        default:
            break;
    }
            
 switch (recvChar2)
    {
        case '1':
            SpecifyMusicPlay(2);
            break;
        
        default:
            break;
    }
    Serial.print("char 1    ");
    Serial.print( recvChar1 );
   
    Serial.print(" char 2     ");
    Serial.print( recvChar2 );
    Serial.println(); }

J'initialise mes variables à 0 pour qu'une note ne se joue
ensuite mes deux IF sont les conditions pour avoir une note oupas, dès que ma variable est égal à 1, ça joue une note, et comme je l'ai dis, si la variable reste à 1 quand je laisse ma main sur le capteur, ça joue indéfiniment ma note.

C'est normal, dans ton programme l'action est déclenchée par une détection de niveau logique.

La solution est de modifier légèrement le programme pour que l'action se lance sur un changement d’état de la pin.

	if (!digitalRead(PUSH_BUTTON_PIN_1)) {
		delay(10);
		if(digitalRead(PUSH_BUTTON_PIN_1)) {
    
                      // Faire action Y X Z..
                }
}

-Standby:
C'est normal, dans ton programme l'action est déclenchée par une détection de niveau logique.

La solution est de modifier légèrement le programme pour que l'action se lance sur un changement d’état de la pin.

	if (!digitalRead(PUSH_BUTTON_PIN_1)) {
	delay(10);
	if(digitalRead(PUSH_BUTTON_PIN_1)) {

// Faire action Y X Z..
                }
}

Je comprend pas du tout ce qu'est l'état de la pin, tu peux m'expliquer car le jour de l'examen si je lâche cette ligne de code sans la comprendre je vais perdre des points :smiley:

Je comprend pas du tout ce qu'est l'état de la pin, tu peux m'expliquer car le jour de l'examen si je lâche cette ligne de code sans la comprendre je vais perdre des points :smiley:

si tu appuie sur le bouton du klaxon, ca fait quoi?
donc le contact est HIGH dans ce cas ou LOW suivant comment tu as cablé.
et inversement si tu relache

infobarquee:
si tu appuie sur le bouton du klaxon, ca fait quoi?
donc le contact est HIGH dans ce cas ou LOW suivant comment tu as cablé.
et inversement si tu relache

Hum c’est pas un bouton de klaxon que j’ai, j’ai ce module ci:
http://wiki.seeed.cc/Grove-Infrared_Reflective_Sensor/

Pour ça la ligne de code qu’on m’a donné je la comprend pas étant donné que dans :

if (!digitalRead(PUSH_BUTTON_PIN_1)) {
delay(10);
if(digitalRead(PUSH_BUTTON_PIN_1)) {

Il n’y a aucun lien avec mon capteur, appart si pin_X où X est le port de mon capteur

Mais j'ai un problème, j'ai défini des variables qui oscille entre la valeur 1 (cas où je joue une note de musique)
et la valeur 0 (cas où je ne joue pas une note de musique)

et ca fait quoi à ton avis?
ca serait pas comme un bouton poussoir?

infobarquee:
et ca fait quoi à ton avis?
ca serait pas comme un bouton poussoir?

Bah dans le moniteur série, quand je reste au dessus de mon capteur la valeur reste 1

Bah dans le moniteur série, quand je reste au dessus de mon capteur la valeur reste 1

et si tu retire le doigt, ca passe à 0, donc c’est comme un bouton poussoir, non?

J’initialise mes variables à 0 pour qu’une note ne se joue
ensuite mes deux IF sont les conditions pour avoir une note oupas, dès que ma variable est égal à 1, ça joue une note, et comme je l’ai dis, si la variable reste à 1 quand je laisse ma main sur le capteur, ça joue indéfiniment ma note.

normal vu que c’est dans le loop, donc une boucle infinie.

si tu veux que ca ne joue qu’une seule fois la note même si tu laisse la main, il va falloir passer par la fonction millis()

si capteur est à 1 start = millis()
si millis() - start < 1 seconde par exemple ===> on joue la note
si millis() - start > 1 seconde ====> on ne fait rien

infobarquee:
et si tu retire le doigt, ca passe à 0, donc c’est comme un bouton poussoir, non?
normal vu que c’est dans le loop, donc une boucle infinie.

si tu veux que ca ne joue qu’une seule fois la note même si tu laisse la main, il va falloir passer par la fonction millis()

si capteur est à 1 start = millis()
si millis() - start < 1 seconde par exemple ===> on joue la note
si millis() - start > 1 seconde ====> on ne fait rien

la fonction millis() fait quoi?

la fonction millis() fait quoi?

C'est pourtant pas loin du forum :
https://www.arduino.cc/en/Reference/HomePage

Les deux pieds dans le même sabot ......................

68tjs:
C'est pourtant pas loin du forum :
Arduino Reference - Arduino Reference

Les deux pieds dans le même sabot ......................

J'ai déjà regardé ça, le problème c'est que je sais toujours pas comment intégrer la fonction millis() avec mon programme

Et bien regarde l'exemple "blink without delay" !

Ou lit le tuto d'Eskimon ce que tu aurai du faire il y a 6 mois.

Je suis bloqué, je sais pas du tout comment je peux faire

#include <SoftwareSerial.h>
#include <MP3Player_KT403A.h>
unsigned long start = 0

SoftwareSerial mp3(6, 7);

void setup()
{
   mp3.begin(9600);
    Serial.begin(9600); 
    delay(500);

    
    SelectPlayerDevice(0x02);     
    SetVolume(30);
    unsigned long currentMillis = millis();
}
void loop(){
  char recvChar1 = '0';
  char recvChar2 = '0';

  if (recvChar1 - start <= 1000)
   {
    }

  if (!(digitalRead(2)))
  {
    recvChar1 = '1';
  }
  else
  {
    recvChar1 = '0';
  }

  if (!(digitalRead(3)))
  {
    recvChar1 = '1';
  }
  else
  {
    recvChar1 = '0';
  }


  switch (recvChar1)
    {
        case '1':
            SpecifyMusicPlay(1);
            break;
        
        default:
            break;
    }
            
 switch (recvChar2)
    {
        case '1':
            SpecifyMusicPlay(2);
            break;
        
        default:
            break;
    } }

En gros, si j’ai bien compris la ligne de infobarquee,

si capteur est à 1 start = millis()
si millis() - start < 1 seconde par exemple ===> on joue la note
si millis() - start > 1 seconde ====> on ne fait rien

if (recvChar1 = 1)
{ millis() = start }
if (recvChar 1 - start <= 1000)
{}

et là je suis bloqué, car pour “jouer ma note” il faut que recvChar1 soit égal à 1, or dans mon début de code, recvChar1 est déjà égal à 1, du coup que dois-je faire?

En gros, si j’ai bien compris la ligne de infobarquee,

si capteur est à 1 start = millis()
si millis() - start < 1 seconde par exemple ===> on joue la note
si millis() - start > 1 seconde ====> on ne fait rien

if (recvChar1 = 1)
{ millis() = start }
if (recvChar 1 - start <= 1000)
{}

et là je suis bloqué, car pour “jouer ma note” il faut que recvChar1 soit égal à 1, or dans mon début de code, recvChar1 est déjà égal à 1, du coup que dois-je faire?

je sais pas, mais tu le fais exprès ou tu veux un code tout cuit pour le bac?
et ca devrait être lundi je pense.

t’es en train de comparer des millisecondes avec un caractère que tu recois.

moi je laisse tomber quand aucun effort n’est fait et que l’on s’y prend que quelques jours avant l’exam.

infobarquee:
je sais pas, mais tu le fais exprès ou tu veux un code tout cuit pour le bac?
et ca devrait être lundi je pense.

t’es en train de comparer des millisecondes avec un caractère que tu recois.

moi je laisse tomber quand aucun effort n’est fait et que l’on s’y prend que quelques jours avant l’exam.

J’ai reçu mon lecteur mp3 grove qui va sur Arduino il y a une semaine, depuis une semaine j’ai trouvé comment faire marcher mes notes selon quel capteur j’utilisais et changer de mode (j’utilise trois instruments différents) etc, il ne me reste plus rien à faire appart régler ce problème… Alors me dire que je m’y prend au dernier moment c’est un peu gros

Résumons nous, c’est un QCM:

1/ Est-ce que tu comprends ce que fait la fonction millis() ? O/N

2/ Est-ce que tu comprends comment fonctionne l’exemple Blink without delay ? O/N

3/ Est-ce que ce que tu veux obtenir c’est que la note ne soit jouée qu’une fois pendant 1 seconde (c’est un exemple) même si pendant les 5 secondes suivantes (c’est un exemple) ta main fait des aller-retours devant le capteur ? O/N

ard_newbie:
Résumons nous, c'est un QCM:

1/ Est-ce que tu comprends ce que fais la fonction millis() ? O/N

2/ Est-ce que tu comprends comment fonctionne l'exemple Blink without delay ? O/N

3/ Est-ce que ce que tu veux obtenir c'est que la note ne soit jouée qu'une fois pendant 1 seconde (c'est un exemple) même si pendant les 5 secondes suivantes (c'est un exemple) ta main fait des aller-retours devant le capteur ? O/N

  1. A moitié disons, je comprend que millis() est un "compteur" qui permet de savoir depuis combien de temps tel chose fonctionne.

  2. Pas du tout c'est bien le problème, sinon j'aurai déjà finis mon programme

  3. Alors chaque note que j'ai dure 7sec, ce que je veux c'est que la note soit joué UNE fois si je tiens ma main sur le capteur (autrement dit, quand mon capteur est alimenté)
    A la place que la note soit jouée une infinité de fois (cela vient du faite que si ma variable vaut 1, cela joue en boucle ma note)

J'espère avoir été assez clair pour que tu puisses m'aider :slight_smile:

Sinon je pense à une autre solution, puis-je "écrire" une seule fois la valeur 1 grâce à la fonction
Serial.write( XX ); ?