Menu
CoddyTech

Bouton de traversée

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

Les piétons ont besoin d’un moyen de demander à traverser. Le bouton bleu sur la broche 2 est le bouton de passage : une pression pendant le feu vert met immédiatement fin au vert, les voitures passent alors au jaune, puis au rouge.

Comme les feux fonctionnent avec millis(), loop() parcourt l’état vert des milliers de fois par seconde et peut lire le bouton à chaque fois, ainsi que l’horloge. Le vert prend fin lorsque l’une ou l’autre condition est vraie, ce qu’indique || (ou) :

case GREEN:
  if (millis() - lightStart >= 3000 || digitalRead(buttonPin) == LOW) {
    // passer au jaune
  }
  break;

Le bouton relie la broche 2 à la masse, alors configure la broche sur INPUT_PULLUP : elle renvoie HIGH jusqu’à ce que le bouton la fasse passer à LOW.

Seul l’état vert lit le bouton. Au jaune et au rouge, les voitures sont déjà en train de s’arrêter, et le jaune conserve sa seconde entière afin que les conducteurs aient le temps de s’arrêter.

challenge icon

Défi

Moyen

Ajoute le bouton de passage sur la broche 2 :

  • configure la broche 2 sur INPUT_PULLUP
  • tant que le feu est vert, un appui met immédiatement fin au vert (le feu passe au jaune)
  • le jaune et le rouge conservent leur durée, que le bouton soit pressé ou non

Appuie sur Run, attends le feu vert, appuie sur le bouton bleu, puis sur Check.

Essayez vous-même

// Les feux de la voiture
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;

enum Light { GREEN, YELLOW, RED };
Light light = GREEN;
unsigned long lightStart = 0;  // quand 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);
  showLight(greenPin);
}

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

  switch (light) {
    case GREEN:
      if (now - lightStart >= 3000) {
        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 la voiture.
  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