Activation/désactivation d'une alarme en appuyant sur un bouton

Bonjour,
Je voudrais faire une alarme avec un détecteur à ultrason. (uniquement pour les vacances)
Dès que quelqu’un est détecté un buzzer s’active. Un bouton permet de désactiver l’alarme après qu’elle se soit déclanchée pendant 30 minutes (que j’ai simplifié à 10 secondes ici).

Le code est compilé mais ce que je veux faire ne marche pas.
Pourriez-vous m’aider ?
Le problème est dans le code.

#define trigPin 2
#define echoPin 3
// Define variables:
long duration;
int distance;

int bouton = 0;
void setup() {
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  
  Serial.begin(9600);
}
void loop() {
 
  
  
  
  digitalWrite(trigPin, LOW);
  delayMicroseconds(5);
 
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  
  duration = pulseIn(echoPin, HIGH);
  // Calculate the distance:
  distance= duration*0.034/2;
  Serial.print("Distance = ");
  Serial.print(distance);
  Serial.println(" cm");
  delay(50);
  if (distance < 20) {       //je mettrai à 400 cm mais là j'ai simplifié
    digitalWrite(13, HIGH);//ceci doit mettre en marche un buzzer
  }
  else {
    digitalWrite(13, LOW);
  }
  bouton = digitalRead(4);
  if (bouton == LOW); {
    digitalWrite(13, LOW);
    delay(10000); //j'aurais aimé que ceci suspende l'alarme pendant dix secondes
  }
  
}

Bonjour,

Qu'est ce qui ne fonctionne pas? Il faut mettre ta pin 13 en output. Est ce que tu as bien mis une résistance de pull-up sur ton bouton? Sinon utilises INPUT_PULLUP Il y a un ; de trop après le if (bouton == LOW)

De même il manque un pinMode pour le bouton, pin numéro 4

Merci de vos réponses;
Il y a eu une petite amélioration mais le bouton ne stoppe pas le buzzer du tout et les mesures(sur le capteur d’ultrason) sont prises toutes le temps que je voulait stopper l’alarme code ci-dessous.

bouton = digitalRead(4);
  if (bouton = HIGH); {
    digitalWrite(13, LOW);
    delay(10000); //si on met 10000 les mesures seront prises toutes les 10 sec, 5000 toutes les 5 sec...

Le bouton marche bien j’ai fait des tests. Il me semble que le problème soit dans le code du bouton. Pouvez vous le modifiez ?

Le code complet est ici.

#define trigPin 2
#define echoPin 3
// Define variables:
long duration;
int distance;
int bouton=4;

void setup() {
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(13, OUTPUT);
  pinMode(4, INPUT);
  
  Serial.begin(9600);
}
void loop() {
 
  
  
  
  digitalWrite(trigPin, LOW);
  delayMicroseconds(5);
 
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  
  duration = pulseIn(echoPin, HIGH);
  // Calculate the distance:
  distance= duration*0.034/2;
  Serial.print("Distance = ");
  Serial.print(distance);
  Serial.println(" cm");
  delay(50);
  if (distance < 20) {       //je mettrai à 400 cm mais là j'ai simplifié
    digitalWrite(13, HIGH);//ceci doit mettre en marche un buzzer
    delay(10000);
  }
  else {
    digitalWrite(13, LOW);
  }
  bouton = digitalRead(4);
  if (bouton = HIGH); {
    digitalWrite(13, LOW);
    delay(10000); //j'aurais aimé que ceci suspende l'alarme pendant dix secondes
  }
  
}

Il y a toujours le ; en trop dans le if if (bouton = HIGH); { De plus la comparaison c'est == et non = Le code devrait donc être:

if (bouton == HIGH) {

Merci pour le point virgule ;) Du coup les mesures sont prises tout le temps. Mais le bouton ne permet toujours pas de couper le buzzer :'(

Tu as bien corrigé le = ? Tu as bien une résistance de pullup sur le bouton?

Je ne comprends pas les mesures sont toujours prises toutes les 10 secondes et le bouton ne marche toujours pas le = c’est bon et la résistance pull up aussi.

#define trigPin 2
#define echoPin 3
// Define variables:
long duration;
int distance;
int bouton=4;

void setup() {
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(13, OUTPUT);
  pinMode(4, INPUT);
 
  Serial.begin(9600);
}
void loop() {
 
 
 
 
  digitalWrite(trigPin, LOW);
  delayMicroseconds(5);
 
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
 
  duration = pulseIn(echoPin, HIGH);
  // Calculate the distance:
  distance= duration*0.034/2;
  Serial.print("Distance = ");
  Serial.print(distance);
  Serial.println(" cm");
  delay(50);
  if (distance < 20) {       //je mettrai à 400 cm mais là j'ai simplifié
    digitalWrite(13, HIGH);//ceci doit mettre en marche un buzzer
    delay(10000);
  }
  else {
    digitalWrite(13, LOW);
  }
  bouton = digitalRead(4);
  if (bouton == HIGH) {
    digitalWrite(13, LOW);
    delay(10000); //j'aurais aimé que ceci suspende l'alarme pendant dix secondes mais ça fait la prise de mesures
  }
 
}

Tu as ajouté un delay(10000) qui empêche la détection du bouton (à moins d’appuyer plus de 10s)

  if (distance < 20) {       //je mettrai à 400 cm mais là j'ai simplifié
    digitalWrite(13, HIGH);//ceci doit mettre en marche un buzzer
    delay(10000);
  }

Supprimes le.

Oui je l'ai fait mais ça ne marche toujours pas. Et le buzzer doit s'arreter pendant 30 minutes quand le bouton est appuyé.

Memorisez le fait que le bouton est appuyé ou pas (un booleen supplementaire)

Si le bouton est appuyé, calculez la date (en milliscondes depuis le démarrage de l'arduino) après laquelle le buzzer sera réautorisé; si la date courante (en millisecondes depuis le démarrage; voir millis) est inferieure à cette date de péremption et que le bouton a été appuyé, le buzzer doir être inactivé...

Mets le dernière version de ton programme.

J'ai recherché des choses sur la fonction milis mais je n'ai pas bien compris comment le faire à mon programme :sob:

Pourrait tu me mettre le code qu'il faudrait? Ou as-tu vu une leçon qui permettrait de résoudre ce problème ?

Ce code fonctionne

#define trigPin 2
#define echoPin 3
// Define variables:
long duration;
int distance;

int bouton = 0;
void setup() {
  Serial.begin(9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(13,OUTPUT);
  pinMode(4,INPUT_PULLUP);
}
void loop() {
  digitalWrite(trigPin, LOW);
  delayMicroseconds(5);
 
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  
  duration = pulseIn(echoPin, HIGH);
  // Calculate the distance:
  distance= duration*0.034/2;
  Serial.print("Distance = ");
  Serial.print(distance);
  Serial.println(" cm");
  delay(50);
  if (distance < 20) {       //je mettrai à 400 cm mais là j'ai simplifié
    digitalWrite(13, HIGH);//ceci doit mettre en marche un buzzer
  }
  else {
    digitalWrite(13, LOW);
  }
  bouton = digitalRead(4);
  Serial.print("Bouton: "); Serial.println(bouton);
  if (bouton == LOW) {
    digitalWrite(13, LOW);
    delay(10000); //j'aurais aimé que ceci suspende l'alarme pendant dix secondes
  }
  
}

Si necessaire (si ton code doit faire d’autres choses) tu peux l’améliorer en utilisant la fonction millis() au lieu de delay()

Pourriez-vous me rajouter la fonction millis voir code, parce que je ne comprends rien à cette fonction j’ai pas trouvé de bonne leçon. Avec la fonction delay dès que le buzzer s’active on ne peut pas la stopper et c’est ça mon but.

#define trigPin 2
#define echoPin 3
// Define variables:
long duration;
int distance;

int bouton = 0;
void setup() {
  Serial.begin(9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(13,OUTPUT);
  pinMode(4,INPUT_PULLUP);
}
void loop() {
  digitalWrite(trigPin, LOW);
  delayMicroseconds(5);
 
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
 
  duration = pulseIn(echoPin, HIGH);
  // Calculate the distance:
  distance= duration*0.034/2;
  Serial.print("Distance = ");
  Serial.print(distance);
  Serial.println(" cm");
  delay(50);
  if (distance < 20) {       
    digitalWrite(13, HIGH);
    delay(10000);              //j'aimerais que ça soit en millis
  }
  else {
    digitalWrite(13, LOW);
  }

  bouton = digitalRead(4);
  Serial.print("Bouton: "); Serial.println(bouton);
  if (bouton == LOW) {
    digitalWrite(13, LOW);
    delay(10000); //j'aurais aimé que ceci suspende l'alarme pendant dix secondes
  } 
}

Ca ne m'étonne pas que ça ne fonctionne pas!!! Tu as remis le delay(10000) ou il ne faut pas. Essaies le programme que je t'ai mis au post #13

Oui mais du coup le buzzer ne marche que quand quelqu'un est devant l'ultrason. Si la personne reste et qu'on appuie sur le bouton ça marche mais le problème c'est que je veux que le buzzer s'allume 10 sec même si une personne passe devant le capteur d'ultrason 1 sec. C'est pour ça que je veux utiliser la fonction millis mais je ne sais pas l'utiliser.

Et a quoi sert le bouton? A raccourcir le temps de fonctionnement du buzzer?
Qu’est ce qui se passe lorsque quelqu’un reste devant le capteur? ça sonne pendant 10s ou jusqu’à la personne sorte (plus 10s)
Si c’est le cas, tu peux faire comme ça:

#define trigPin 2
#define echoPin 3
// Define variables:
long duration;
int distance;

int bouton = 0;
void setup() {
  Serial.begin(9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(13,OUTPUT);
  pinMode(4,INPUT_PULLUP);
}
void loop() {
  static unsigned long debutActionBuzzer=0;
  
  digitalWrite(trigPin, LOW);
  delayMicroseconds(5);
 
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  
  duration = pulseIn(echoPin, HIGH);
  // Calculate the distance:
  distance= duration*0.034/2;
  Serial.print("Distance = ");
  Serial.print(distance);
  Serial.println(" cm");
  delay(50);
  if (distance < 20) {       //je mettrai à 400 cm mais là j'ai simplifié
    debutActionBuzzer=millis();
    digitalWrite(13, HIGH);//ceci doit mettre en marche un buzzer
  }

  bouton = digitalRead(4);
  Serial.print("Bouton: "); Serial.println(bouton);
  if (bouton == LOW) {
    digitalWrite(13, LOW);
    debutActionBuzzer=0;
    delay(10000); //j'aurais aimé que ceci suspende l'alarme pendant dix secondes
  }

  if (debutActionBuzzer!=0 && millis()-debutActionBuzzer>=10000)
  {
    digitalWrite(13, LOW);
    debutActionBuzzer=0;
  }
}

Merci pour le code. Je pars en vacances demain, merci.
Pourrait t’on le faire avec la tonalité alarme.
:

for (uint8_t i=0; i<300; i++) { //le 300 c'est 300 fois le "tiui"
    for(int x=0;x<180;x++){

    sinVal=(sin(x*(3.1412/180)));                     //tout ça c'est le bruit de la sirène
    toneVal=2000+(int(sinVal*1000));
    tone(13,toneVal);
    delay(2);
  }

il ne faut pas oublier de déclarer:

float sinVal;
int toneVal;