Menu
CoddyTech

Signal piéton et buzzer

Fait partie de la section Projets du Journey Arduino de Coddy. Leçon 4 sur 24.

Les piétons ont leurs propres feux : rouge sur la broche 7 (attendre) et vert sur la broche 6 (traverser). Quand les voitures ont le feu rouge, les piétons voient le feu vert ; le reste du temps, ils voient le feu rouge.

Le signal piéton change à seulement deux moments : quand les voitures passent au rouge et quand elles quittent cette phase. Écris une fonction pour les feux piétons et appelle-la à ces deux endroits :

void showWalk(bool walk) {
  if (walk) {
    digitalWrite(walkRedPin, LOW);
    digitalWrite(walkGreenPin, HIGH);
  } else {
    digitalWrite(walkGreenPin, LOW);
    digitalWrite(walkRedPin, HIGH);
  }
}

Les passages piétons émettent aussi des bips quand on peut traverser en toute sécurité, pour les personnes qui ne voient pas les feux. tone() peut prendre un troisième nombre, qui indique la durée de lecture : tone(buzzerPin, 1000, 100) joue un son de 1000 Hz pendant 100 ms et s’arrête tout seul. Le programme n’attend pas la fin du son.

Pour émettre un bip toutes les 500 ms uniquement pendant la phase rouge, ajoute un troisième minuteur millis() dans case RED:.

challenge icon

Défi

Moyen

Ajoute le signal piéton et son avertisseur sonore :

  • rouge piéton sur la broche 7 et vert piéton sur la broche 6, les deux en sortie
  • tant que les voitures ont le feu rouge : vert piéton allumé, rouge piéton éteint, et un bip de 100 ms à 1000 Hz sur la broche 8 toutes les 500 ms
  • le reste du temps : rouge piéton allumé, vert piéton éteint, aucun son

Appuie sur Run, puis sur Check.

Essayez vous-même

// Les feux de circulation pour les voitures
const int redPin = 12;
const int yellowPin = 11;
const int greenPin = 10;
// La LED intégrée à la carte : le voyant d’état du contrôleur
const int statusPin = 13;
// Le bouton de traversée
const int buttonPin = 2;

enum Light { GREEN, YELLOW, RED };
Light light = GREEN;
unsigned long lightStart = 0;  // moment où le feu actuel s’est allumé

bool statusOn = false;
unsigned long lastBlink = 0;

// Allumer un feu et éteindre les deux autres.
void showLight(int pin) {
  digitalWrite(redPin, LOW);
  digitalWrite(yellowPin, LOW);
  digitalWrite(greenPin, LOW);
  digitalWrite(pin, HIGH);
}

void setup() {
  pinMode(redPin, OUTPUT);
  pinMode(yellowPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(statusPin, OUTPUT);
  pinMode(buttonPin, INPUT_PULLUP);
  showLight(greenPin);
}

void loop() {
  unsigned long now = millis();

  switch (light) {
    case GREEN:
      // Un appui sur le bouton de traversée met fin au feu vert plus tôt.
      if (now - lightStart >= 3000 || digitalRead(buttonPin) == LOW) {
        light = YELLOW;
        lightStart = now;
        showLight(yellowPin);
      }
      break;
    case YELLOW:
      if (now - lightStart >= 1000) {
        light = RED;
        lightStart = now;
        showLight(redPin);
      }
      break;
    case RED:
      if (now - lightStart >= 3000) {
        light = GREEN;
        lightStart = now;
        showLight(greenPin);
      }
      break;
  }

  // Le voyant d’état clignote toutes les 500 ms, indépendamment des feux de circulation pour les voitures.
  if (now - lastBlink >= 500) {
    lastBlink = now;
    if (statusOn) {
      statusOn = false;
      digitalWrite(statusPin, LOW);
    } else {
      statusOn = true;
      digitalWrite(statusPin, HIGH);
    }
  }
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Projets

Entraînez-vous par vous-même : Playground Arduino