TP Projet : Créer un système d'alarme anti-intrusion (Antivol de sac)
Objectif de la séance
L'objectif de ce TP est de programmer de A à Z un autre type d'objet connecté : un système d'alarme anti-intrusion pour sac à dos.
Vous allez construire ce projet étape par étape. À la fin de la séance, votre carte Micro:bit sera capable de :
- S'activer (s'armer) avec un compte à rebours pour vous laisser le temps de fermer votre sac.
- Se désactiver (se désarmer) à l'aide d'un bouton.
- Détecter si quelqu'un déplace ou secoue votre sac grâce à l'accéléromètre.
- Déclencher un signal visuel clignotant (effet gyrophare) en cas d'intrusion.
- Garder en mémoire et afficher le nombre de tentatives d'intrusion détectées.
L'environnement de travail
Comme pour les séances précédentes, nous allons utiliser le simulateur intégré au navigateur.
- Rendez-vous sur le site officiel : https://python.microbit.org/v/3
- Effacez le code de démonstration présent dans l'éditeur.
Étape 1 : Initialiser la mémoire de l'alarme
Pour savoir si notre alarme est en train de surveiller le sac ou non, elle doit retenir son état : "armée" ou "désarmée". Nous allons utiliser une variable booléenne (qui vaut soit True pour Vrai, soit False pour Faux).
Au démarrage, l'alarme doit être désarmée.
Mission 1 :
Au tout début de votre programme (lignes 1 et 2), importez la bibliothèque Micro:bit et créez une variable nommée armee initialisée à False.
Affichez également un smiley endormi (Image.ASLEEP) pour indiquer que l'alarme est éteinte et ne surveille rien.
from microbit import *
# On crée notre variable pour savoir si l'alarme surveille (True) ou non (False)
# À FAIRE : Créer la variable 'armee' et lui donner la valeur False
...
# Image au démarrage pour indiquer que l'alarme est désarmée
# À FAIRE : Afficher l'image Image.ASLEEP à l'écran
...
- Copiez ce code et testez-le sur le simulateur.
- L'image s'affiche-t-elle bien ? Le programme s'arrête-t-il tout de suite ? (La réponse est oui, car nous n'avons pas encore créé notre boucle
while True:).
Étape 2 : Activer et désactiver l'alarme (Boutons A et B)
Nous voulons pouvoir allumer l'alarme quand nous laissons notre sac, et l'éteindre à notre retour.
- Le bouton A servira à armer l'alarme.
- Le bouton B servira à désarmer l'alarme.
Pour laisser le temps de fermer le sac après avoir appuyé sur A, nous allons ajouter un petit compte à rebours visuel de 3 secondes avant d'armer l'alarme.
Mission 2 :
Complétez votre programme en ajoutant la boucle infinie while True: et les conditions associées aux boutons :
from microbit import *
# (Rappel de l'étape 1)
armee = False
display.show(Image.ASLEEP)
while True:
# Si on appuie sur le bouton A : on arme l'alarme
if button_a.is_pressed():
# Compte à rebours visuel
display.show("3")
sleep(1000)
display.show("2")
sleep(1000)
display.show("1")
sleep(1000)
# À FAIRE 1 : Changer la variable 'armee' pour qu'elle devienne True
...
# À FAIRE 2 : Afficher un cadenas fermé (Image.TARGET) ou une icône d'alerte (Image.SKULL) pour confirmer
...
# Si on appuie sur le bouton B : on désactive l'alarme
elif button_b.is_pressed():
# À FAIRE 3 : Remettre la variable 'armee' à False
...
# À FAIRE 4 : Afficher à nouveau l'image de sommeil Image.ASLEEP
...
Testez votre code sur le simulateur : Appuyez sur A, attendez le compte à rebours, vérifiez si l'image change. Appuyez sur B, l'écran doit revenir au mode sommeil.
Étape 3 : Détecter l'intrusion (L'accéléromètre)
Maintenant que l'alarme peut être armée, elle doit surveiller les mouvements du sac. Si quelqu'un le déplace, l'accéléromètre va détecter une secousse (shake).
Mais attention ! On ne doit détecter le mouvement que si l'alarme est armée.
Mission 3 :
Dans votre boucle while True:, ajoutez une condition pour vérifier si l'alarme est armée ET si une secousse est détectée.
Astuce : En Python, pour vérifier deux conditions en même temps, on utilise le mot-clé and (et).
while True:
# (Rappel des boutons A et B de l'étape 2)
if button_a.is_pressed():
...
elif button_b.is_pressed():
...
# À FAIRE : Si l'alarme est armée ET qu'on détecte une secousse ('shake')
elif ... and ... :
# Pour l'instant, on affiche une croix de danger pour signaler l'alerte
display.show(Image.NO)
sleep(2000)
display.clear()
Testez sur le simulateur :
- Armez l'alarme (bouton A) et attendez la fin du compte à rebours.
- Secouez la carte (cliquez sur le bouton blanc "SHAKE" qui apparaît ou secouez votre souris sur la carte). La croix rouge
Image.NOdoit s'afficher ! - Désarmez l'alarme (bouton B). Secouez à nouveau : la croix ne doit pas s'afficher, car l'alarme est désarmée.
Étape 4 : Déclencher la sirène (Alerte continue)
Actuellement, la croix de danger s'efface toute seule après 2 secondes. Une vraie alarme doit clignoter en continu jusqu'à ce que son propriétaire vienne la désactiver avec le bouton B !
Pour cela, nous allons ajouter une nouvelle variable : alerte_declenchee = False.
Mission 4 :
Modifiez votre programme pour intégrer cette variable et créer un effet gyrophare (clignotement).
from microbit import *
armee = False
# À FAIRE 1 : Créer la variable 'alerte_declenchee' et l'initialiser à False
...
display.show(Image.ASLEEP)
while True:
# Bouton A : Armer l'alarme
if button_a.is_pressed():
# (compte à rebours)
...
armee = True
# On réinitialise l'alerte au cas où elle tournait déjà
alerte_declenchee = False
display.show(Image.SKULL)
# Bouton B : Désarmer l'alarme ET arrêter la sirène
elif button_b.is_pressed():
armee = False
# À FAIRE 2 : Remettre la variable 'alerte_declenchee' à False
...
display.show(Image.ASLEEP)
# Détection de secousse
elif armee == True and accelerometer.was_gesture('shake'):
# À FAIRE 3 : Passer la variable 'alerte_declenchee' à True
...
# Effet gyrophare (sirène visuelle)
# À FAIRE 4 : Si 'alerte_declenchee' est True, on fait clignoter l'écran
if ... :
display.show(Image.CHESSBOARD) # Motif 1
sleep(200)
display.clear() # Écran vide (Motif 2)
sleep(200)
Testez ce fonctionnement : Une fois l'alarme armée et secouée, le clignotement doit continuer sans s'arrêter. Si vous appuyez sur B, tout doit s'arrêter et se désarmer.
Étape 5 : Historique des intrusions (Compteur)
Lorsque vous revenez à votre sac, vous voulez savoir si quelqu'un a essayé d'y toucher pendant votre absence. Nous allons compter le nombre de fois où l'alarme s'est déclenchée.
Mission 5 :
- Au tout début de votre programme, créez une variable
intrusionsinitialisée à0. - À chaque fois qu'une secousse est détectée (Étape 3), ajoutez
1à cette variable. - Pour lire ce compteur, ajoutez une condition : si l'utilisateur appuie simultanément sur les boutons A et B, la carte fait défiler le nombre de tentatives d'intrusion.
[!WARNING] Attention à l'ordre des conditions ! En Python, la carte lit les conditions
if/elifdans l'ordre, du haut vers le bas. Si vous mettez le testbutton_a.is_pressed() and button_b.is_pressed()en dessous debutton_a.is_pressed(), la carte s'arrêtera sur le premier bouton détecté et ne lira jamais l'appui double. Pour éviter cela, placez la vérification des deux boutons tout en haut de votre bouclewhile True:!
from microbit import *
# Variables de départ
armee = False
alerte_declenchee = False
# À FAIRE 1 : Créer la variable 'intrusions' à 0
...
display.show(Image.ASLEEP)
while True:
# À FAIRE 2 : Si les boutons A ET B sont pressés ensemble (à mettre en premier !)
if button_a.is_pressed() and button_b.is_pressed():
# Affiche le nombre d'intrusions
display.scroll("Alertes:")
display.scroll(intrusions)
sleep(1000)
elif button_a.is_pressed():
# (Armement)
...
elif button_b.is_pressed():
# (Désarmement)
...
elif armee == True and accelerometer.was_gesture('shake'):
alerte_declenchee = True
# À FAIRE 3 : Augmenter 'intrusions' de 1 (ex: intrusions = intrusions + 1)
...
# Effet gyrophare
if alerte_declenchee == True:
display.show(Image.CHESSBOARD)
sleep(200)
display.clear()
sleep(200)
Testez le programme complet : Secouez plusieurs fois pendant que l'alarme est armée (arrêtez l'alerte avec B entre chaque test). Appuyez ensuite sur A et B en même temps pour lire le score !
🏆 Défis Bonus pour améliorer votre alarme
Défi 1 : Alarme sensible à la lumière 💡
Si un voleur ouvre la fermeture éclair de votre sac, de la lumière va y entrer.
En utilisant le capteur de lumière display.read_light_level() (qui renvoie une valeur entre 0 (nuit totale) et 255 (pleine lumière)), faites en sorte que si l'alarme est armée et que la lumière dépasse 50, l'alarme se déclenche également.
Défi 2 : Code de désarmement secret 🔐
Actuellement, n'importe qui peut éteindre l'alarme en appuyant simplement sur le bouton B. C'est trop facile ! Modifiez le programme pour qu'après avoir appuyé sur B, l'utilisateur doive appuyer sur le bouton A dans les 2 secondes pour valider l'arrêt. Si ce n'est pas fait, l'alarme reste active !
Défi 3 : Sirène sonore 🔊
Si votre carte Micro:bit possède un haut-parleur (comme sur la version V2), importez la bibliothèque music au début de votre code (import music).
Faites retentir un son strident (comme music.SIREN ou music.BA_DING) en même temps que le clignotement visuel.