La Guerre Des Boutons Poussoirs

Schéma

Code du circuit :

int buzzer = 8;

int boutonPlus = A0;
int boutonMoins = A1;
int boutonAlarme = A2;

int frequence = 400;

bool ancienEtatPlus = LOW;
bool ancienEtatMoins = LOW;

void setup()
{
  pinMode(buzzer, OUTPUT);

  pinMode(boutonPlus, INPUT);
  pinMode(boutonMoins, INPUT);
  pinMode(boutonAlarme, INPUT);

  pinMode(LED_BUILTIN, OUTPUT);
}

void loop()
{
  bool etatPlus = digitalRead(boutonPlus);
  bool etatMoins = digitalRead(boutonMoins);
  bool etatAlarme = digitalRead(boutonAlarme);

  // ===== BOUTON 1 : PLUS AIGU =====
  if (etatPlus == HIGH && ancienEtatPlus == LOW)
  {
    frequence += 100;

    if (frequence > 2000)
    {
      frequence = 2000;
    }

    tone(buzzer, frequence, 50);

    digitalWrite(LED_BUILTIN, HIGH);
    delay(5);
    digitalWrite(LED_BUILTIN, LOW);
  }

  // ===== BOUTON 2 : PLUS GRAVE =====
  if (etatMoins == HIGH && ancienEtatMoins == LOW)
  {
    frequence -= 100;

    if (frequence < 100)
    {
      frequence = 100;
    }

    tone(buzzer, frequence, 50);

    digitalWrite(LED_BUILTIN, HIGH);
    delay(5);
    digitalWrite(LED_BUILTIN, LOW);
  }

  // ===== BOUTON 3 : ALARME NUCLEAIRE =====
  if (etatAlarme == HIGH)
  {
    // montée + descente ultra rapide
    for (int i = 0; i < 3; i++)
    {
      // montée
      for (int f = 600; f <= 1800; f += 25)
      {
        tone(buzzer, f);
        digitalWrite(LED_BUILTIN, HIGH);
        delay(1);

        if (digitalRead(boutonAlarme) == LOW)
        {
          noTone(buzzer);
          digitalWrite(LED_BUILTIN, LOW);
          return;
        }
      }

      // descente
      for (int f = 1800; f >= 600; f -= 25)
      {
        tone(buzzer, f);
        digitalWrite(LED_BUILTIN, LOW);
        delay(1);

        if (digitalRead(boutonAlarme) == LOW)
        {
          noTone(buzzer);
          digitalWrite(LED_BUILTIN, LOW);
          return;
        }
      }
    }
  }
  else
  {
    noTone(buzzer);
    digitalWrite(LED_BUILTIN, LOW);
  }

  ancienEtatPlus = etatPlus;
  ancienEtatMoins = etatMoins;

  delay(1);
}

Explication du programme Arduino (ligne par ligne)






int buzzer = 8;

➡️ Définit la broche 8 de l’Arduino comme sortie pour le buzzer (haut-parleur).






int boutonPlus = A0;

➡️ Le bouton connecté à A0 sert à augmenter la fréquence du son (son plus aigu).






int boutonMoins = A1;

➡️ Le bouton connecté à A1 sert à diminuer la fréquence du son (son plus grave).






int boutonAlarme = A2;

➡️ Le bouton connecté à A2 sert à activer ou désactiver l’alarme.






int frequence = 400;

➡️ Définit la fréquence de départ du son (400 Hz).






bool ancienPlus = HIGH;

➡️ Stocke l’ancien état du bouton plus pour détecter un nouvel appui.






bool ancienMoins = HIGH;

➡️ Stocke l’ancien état du bouton moins pour détecter un nouvel appui.






bool alarmeActive = false;

➡️ Variable qui indique si l’alarme est activée ou non.


⚙️ setup()





void setup()

➡️ Fonction exécutée une seule fois au démarrage de l’Arduino.






pinMode(buzzer, OUTPUT);

➡️ Configure le buzzer en sortie pour produire du son.






pinMode(boutonPlus, INPUT_PULLUP);

➡️ Configure le bouton A0 en entrée avec résistance interne (INPUT_PULLUP).






pinMode(boutonMoins, INPUT_PULLUP);

➡️ Configure le bouton A1 en entrée avec résistance interne.






pinMode(boutonAlarme, INPUT_PULLUP);

➡️ Configure le bouton A2 en entrée avec résistance interne.






pinMode(LED_BUILTIN, OUTPUT);

➡️ Configure la LED intégrée de l’Arduino comme sortie.


🔁 loop()





void loop()

➡️ Fonction qui s’exécute en boucle infinie.






bool plus = digitalRead(boutonPlus);

➡️ Lit l’état actuel du bouton plus (appuyé ou non).






bool moins = digitalRead(boutonMoins);

➡️ Lit l’état actuel du bouton moins.






bool alarme = digitalRead(boutonAlarme);

➡️ Lit l’état du bouton alarme.


🚨 Gestion de l’alarme





if (alarme == LOW && alarmeActive == false)

➡️ Si on appuie sur le bouton alarme et qu’elle est désactivée.






alarmeActive = true;

➡️ Active l’alarme.






else if (alarme == LOW && alarmeActive == true)

➡️ Si on réappuie sur le bouton alarme.






alarmeActive = false;

➡️ Désactive l’alarme.


🚨 Mode alarme





int f = 600 + (millis() % 1200);

➡️ Crée une variation automatique de fréquence pour faire une sirène.






tone(buzzer, f);

➡️ Produit le son du buzzer avec la fréquence calculée.






digitalWrite(LED_BUILTIN, millis() % 100 < 50);

➡️ Fait clignoter la LED comme un gyrophare.


🔼 Bouton plus (aigu)





if (plus == LOW && ancienPlus == HIGH)

➡️ Détecte un nouvel appui sur le bouton A0.






frequence += 100;

➡️ Augmente la fréquence (son plus aigu).






tone(buzzer, frequence);

➡️ Joue le son avec la nouvelle fréquence.


🔽 Bouton moins (grave)





if (moins == LOW && ancienMoins == HIGH)

➡️ Détecte un nouvel appui sur le bouton A1.






frequence -= 100;

➡️ Diminue la fréquence (son plus grave).






tone(buzzer, frequence);

➡️ Joue le son modifié.


🔊 Maintien du son





tone(buzzer, frequence);

➡️ Maintient le son actif en continu même sans appuyer.


🔁 Mise à jour des états





ancienPlus = plus;

➡️ Sauvegarde l’état actuel du bouton plus.






ancienMoins = moins;

➡️ Sauvegarde l’état du bouton moins.


⏱️ Pause





delay(10);

➡️ Petite pause pour stabiliser le programme.