Allumer/éteindre lampe avec un micro

Bonjour à tous et à toutes,
Je suis débutant en arduino. J'ai fait un peu de python au lycée et je maîtrise quelques bases en C++.
Mon projet
est de réaliser une bande LED qui s'allume par le son (en claquant des doigts par ex). Lors du premier son la bande LED s'allume et lors du deuxième la bande LED s'éteint etc...
Le circuit
Pour cela j'ai à disposition une arduino nano, un module KY-037 et un relais qui est relié à la bande led.



Le problème
C'est au niveau du code je pense. Quand je téléverse le programme, le relais s'active mais quand je claque des doigts le relais ne réagit pas.

int relais=8;
int micro=3;
boolean activation=0;

void setup() {
  pinMode(micro,INPUT);
  pinMode(relais, OUTPUT);
}

void loop() {

  if(digitalRead(micro)==0){ 
    if(activation==1){
      activation=0;
      digitalWrite(relais,LOW);
    } 
    else {
      activation=1;
      digitalWrite(relais,HIGH);
    }
    }
}

veuillez m'excuser pour mon vocabulaire peu développé dans le domaine. Merci d'avance pour vos réponses.

Bonjour perseverant

Est ce que la LED
image
s'allume quand il y a du bruit?

Si elle s'allume, tu est bien calibré.

Par contre dans ton programme tu mets:
if(digitalRead(micro)==0){
C'est mieux de mettre:
if(digitalRead(micro)==1){
la broche D0 du module passe à 1 en cas de bruit.

A+
Cordialement
jpbbricole

votre micro (electret) dispose d'un potentiomètre qui règle le niveau sonore pour lequel la sortie numérique (DO) s'active.

image

il faut le régler de telle sorte que votre claquement de doigt déclenche cette sortie

sinon prendre la sortie AO (Analog out) et la lire avec un analogRead() et comparer avec un seuil pertinent que vous réglez en logiciel

pour trouver le seuil vous pouvez prendre ce petit code

const byte pinMicroAnalogique = A0; // connectez la broche AO du micro vers broche A0 de l'arduino
const byte pinMicroNumerique =  3;  // connectez la broche DO du micro vers broche 3 de l'arduino

void setup() {
  pinMode(pinMicroNumerique, INPUT);
  Serial.begin(115200);
  Serial.println("D\tA");
}

void loop() {

  Serial.print(digitalRead(pinMicroNumerique) == LOW ? 0 : 1023);
  Serial.write('\t');
  Serial.println(analogRead(pinMicroAnalogique));

  delay(50);
}

chargez le code, ouvrez la console série à 115200 bauds (en mode graphique ou texte) et regardez les valeurs qui défilent lorsque vous claquez des doigts versus le bruit ambiant habituel.

vous pouvez aussi jouer (doucement) sur la vis du potentiomètre.


sinon un booléen c'est true ou false qu'on utilise, pas 0 ou 1 qui sont des entiers (même si c'est converti, ce n'est pas "prorpe")

J'ai oublié, mets une temporisation en toute fin de ton if(digitalRead(micro)==1):

		}
	delay(200);
	}
}

Ca évite au relais de faire rapidemenz on/off.

Merci pour vos réponses😃. J'ai réglé le potentiomètre. J'ai également modifié le programme mais cette fois-ci quand un son est détecté le relais s'active pendant 200 millisecondes.

Bonsoir
Comportement normal vu le code
Il faut declarer une variable booleene correspondant a l allumage et dans la loop changer cette variable quand il y a du bruit puis affecter cette variale a la sortie
Ne pas tester le cas ou il n y a pas de bruit

Il suffit de ne pas l’éteindre…

const int relais=8;
const int micro=3;

void setup() {
  pinMode(micro,INPUT);
  pinMode(relais, OUTPUT);
}

void loop() {
  if(digitalRead(micro) == HIGH) digitalWrite(relais,HIGH);
}

Excusez moi.:sweat_smile:"Lors du premier son la bande LED s'allume et reste allumé .Lors du deuxième son la bande LED s'éteint et reste éteinte etc..."

c’est typiquement une définition de programme qui se prête bien à la programmation par machine à états (cf mon tuto éventuellement)

Il suffit de stocker l'état du relais dans une variable et de faire changer l'état et d'utiliser cette variable pour activer/désactiver le relais à chaque bruit.

Cela fonctionne avec ce code:

int relais=8;
int micro=3;
boolean activation=true;
boolean etatR=true;

void setup() {
  pinMode(micro,INPUT);
  pinMode(relais, OUTPUT);
}

void loop() {

  if(digitalRead(micro)==true){ 
    if(!activation && !etatR){
      activation=true;
      etatR=true;
      digitalWrite(relais,LOW);
    } 
    else {
      activation=false;
      etatR=false;
      digitalWrite(relais,HIGH);
    }
  delay(200);
  }
}

la fonction digitalRead() retourne HIGH ou LOW, pas true ou false.

void loop() {

  if(digitalRead(micro)>seuil){ 
   
      digitalWrite(relais,!digitalRead(relais));
    } 
}

la valeur de seuil est a adapter

si vous jouez avec un seuil, il faut prendre une broche analogique et un analogRead()

sinon c'est juste à comparer avec HIGH ou LOW

OUps oui ...j'avais mis high mais dans ce cas ca declenche au moindre bruit ou il y a un seuil ???

➜ cf post 3...

OK donc oui ca depend de la sortie du truc

Donc

void loop() {

  if(digitalRead(micro)==HIGH){ 
      digitalWrite(relais,!digitalRead(relais));
    } 
}

non ce n'est pas propre vous appliquez un opérateur booléen sur une variable de type inconnu qui vaut HIGH ou LOW. en pratique ça fonctionne jusqu'au jour où arduino changera le type de HIGH et LOW (ils l'ont déjà fait)

donc on écrit soit avec un if

if (digitalRead(relais) == HIGH) 
  digitalWrite(relais, LOW);
else 
  digitalWrite(relais, HIGH);

soit une opération ternaire

digitalWrite(relais, (digitalRead(relais) == HIGH)  ? LOW : HIGH);

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