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.
Défi
MoyenAjoute 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);
}
}
}
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
1Feu de circulation
Cycle du feu de circulationFeu de circulation avec millis()Bouton de traverséeSignal piéton et buzzerEntraînez-vous par vous-même : Playground Arduino