Objectif du projet :

Programmer un feu tricolore intelligent avec bouton piéton qui :

1. Présentation du projet

Vidéo de présentation de la micro:bit et du feu tricolore

Vidéo tutorielle présentant le kit du du feu tricolore et de la carte micro:bit (source: La Digitale)

Composants utilisés

Composant micro:bit Rôle dans le projet
Matrice LED 5x5 Affichage des feux (haut=rouge, milieu=orange, bas=vert)
Bouton A Bouton d'appel piéton
Haut-parleur Signal sonore lorsque le feu piéton passe au vert (optionnel)
Accéléromètre Détection des secousses pour mode test (prolongement possible)

2. Programme complet

Version de base

from microbit import *

# Définition des images pour les feux
feu_rouge = Image("99999:00000:00000:00000:00000")
feu_orange = Image("00000:99900:00000:00000:00000")
feu_vert = Image("00000:00000:00000:00000:99999")

# États possibles
ROUGE = 0
ORANGE = 1
VERT = 2

# Variables du programme
etat = ROUGE
demande_pieton = False

while True:
    # 1. Vérification de l'appui sur le bouton piéton
    if button_a.was_pressed():
        demande_pieton = True
    
    # 2. Machine à états du feu tricolore
    if etat == ROUGE:
        display.show(feu_rouge)
        if demande_pieton:
            sleep(3000)  # Délai de sécurité
            etat = ORANGE
            demande_pieton = False
        else:
            sleep(2000)  # Temps rouge normal
    
    elif etat == ORANGE:
        display.show(feu_orange)
        sleep(1000)  # Temps orange fixe
        etat = VERT
    
    elif etat == VERT:
        display.show(feu_vert)
        sleep(3000)  # Temps vert
        etat = ROUGE

Fonctionnement : Ce programme implémente une machine à états simple avec trois états (rouge, orange, vert) et une gestion du bouton piéton.

Version améliorée avec signal sonore

from microbit import *
import music

# Images personnalisées
feux = [
    Image("99999:00000:00000:00000:00000"),  # Rouge
    Image("00000:99900:00000:00000:00000"),  # Orange
    Image("00000:00000:00000:00000:99999")   # Vert
]

etat = 0  # Commence à rouge
attente_pieton = False

while True:
    # Gestion du bouton piéton
    if button_a.was_pressed() and not attente_pieton:
        attente_pieton = True
    
    # Machine à états
    if etat == 0:  # État rouge
        display.show(feux[0])
        if attente_pieton:
            sleep(3000)  # Délai sécurité véhicules
            etat = 1     # Passer à orange
            attente_pieton = False
        else:
            sleep(2000 + randint(0, 3000))  # Temps aléatoire
    
    elif etat == 1:  # État orange
        display.show(feux[1])
        sleep(1000)
        etat = 2     # Passer à vert
    
    elif etat == 2:  # État vert
        display.show(feux[2])
        music.play(['C4:1'], wait=False)  # Bip sonore
        sleep(3000)
        etat = 0     # Retour à rouge

Améliorations : Ajout d'un signal sonore, code plus structuré avec liste d'images, temps d'attente aléatoire en mode normal.

3. Explications détaillées

Concepts clés

Machine à états : Notre feu tricolore peut être dans 3 états distincts (rouge, orange, vert) avec des transitions bien définies entre eux.

Programmation événementielle : Le programme réagit à l'événement "appui sur le bouton" sans bloquer l'exécution principale.

Temporisation : Les délais entre les changements d'état sont gérés par la fonction sleep().

Fonctions importantes

Fonction Description Exemple
button_a.was_pressed() Détecte si le bouton A a été pressé if button_a.was_pressed():
display.show() Affiche une image sur la matrice LED display.show(feu_rouge)
sleep() Pause l'exécution (en ms) sleep(1000) # 1 seconde
music.play() Joue un son ou une mélodie music.play(['C4:1'])

4. Prolongements possibles

Idées d'amélioration

  1. Compte à rebours : Afficher le temps restant avant changement d'état
  2. Mode nuit : Faire clignoter le feu orange entre minuit et 6h
  3. Feu piéton : Ajouter un deuxième feu avec bonhomme rouge/vert
  4. Connexion physique : Brancher de vrais feux LED via les broches GPIO
  5. Détection de panne : Simuler une panne aléatoire avec secousse

Exemple de code pour le compte à rebours

# À ajouter dans l'état VERT
for secondes in range(3, 0, -1):
    display.show(str(secondes))
    sleep(1000)

5. Ressources complémentaires