Corrigé situation B sans LED : Améliorer la robustesse du dispositif
Méthode : Code feu Maître
1
from microbit import *
2
from time import ticks_ms
3
import radio
4
5
radio.config(group=2)
6
radio.on()
7
8
DUREE = 10 # 10 secondes
9
attente = DUREE
10
lastTransm = ticks_ms() # derniere transmission de l'esclave
11
feuRouge = True
12
13
def afficheRouge():
14
for x in range(3,5):
15
for y in range(2):
16
display.set_pixel(x,y,9)
17
for x in range(3,5):
18
for y in range(3,5):
19
display.set_pixel(x,y,0)
20
def afficheOrange():
21
for x in range(3,5):
22
for y in range(2):
23
display.set_pixel(x,y,0)
24
for x in range(3,5):
25
for y in range(3,5):
26
display.set_pixel(x,y,4)
27
def afficheAttente(attente):
28
display.set_pixel(2,3,0)
29
for x in range(2):
30
for y in range(5):
31
display.set_pixel(x,y, 0 if 5*x+y >= attente else 9)
32
33
while True:
34
# Arrivee du vehicule prioritaire au feu maitre
35
if button_a.was_pressed():
36
feuRouge = False
37
attente = DUREE
38
radio.send("ROUGE")
39
40
# Traitement des messages en provenance de l'esclave
41
incoming = radio.receive()
42
# Arrivee du vehicule priopritaire au feu esclave
43
if incoming == "PRIO" :
44
feuRouge = True
45
attente = DUREE
46
radio.send("VERT")
47
# L'esclave est en vie :)
48
if incoming == "ALIVE" :
49
lastTransm = ticks_ms()
50
51
# Mise en securite si l'esclave plante
52
if ticks_ms() - lastTransm > 2000:
53
display.clear()
54
# Plus de deux secondes sans nouvelles de l'esclave
55
feuRouge = True
56
display.show(Image.SAD)
57
else:
58
# Affichage Rouge / Orange
59
if feuRouge :
60
afficheRouge()
61
else :
62
afficheOrange()
63
64
# Gestion de l'attente
65
sleep(1000)
66
attente -= 1
67
afficheAttente(attente)
68
radio.send(str(attente))
69
70
# Alternance du feu
71
if attente == 0 :
72
attente=DUREE
73
feuRouge = not feuRouge
74
75
# Le maitre envoie l'etat du feu a l'esclave toutes les secondes
76
if feuRouge :
77
radio.send("VERT")
78
else:
79
radio.send("ROUGE")
Méthode : Code feu Esclave
1
from microbit import *
2
from time import ticks_ms
3
import radio
4
5
radio.config(group=2)
6
radio.on()
7
8
lastTransm = ticks_ms() # derniere transmission du maitre
9
lastAlive = ticks_ms() # derniere transmission ALIVE de l'esclave
10
feuRouge = True
11
attente=0
12
13
def afficheRouge():
14
for x in range(3,5):
15
for y in range(2):
16
display.set_pixel(x,y,9)
17
for x in range(3,5):
18
for y in range(3,5):
19
display.set_pixel(x,y,0)
20
def afficheOrange():
21
for x in range(3,5):
22
for y in range(2):
23
display.set_pixel(x,y,0)
24
for x in range(3,5):
25
for y in range(3,5):
26
display.set_pixel(x,y,4)
27
def afficheAttente(attente):
28
display.set_pixel(2,3,0)
29
for x in range(2):
30
for y in range(5):
31
display.set_pixel(x,y, 0 if 5*x+y >= attente else 9)
32
33
while True:
34
# Traitement des messages du maitre
35
incoming = radio.receive()
36
if incoming:
37
if incoming == "VERT" :
38
feuRouge = False
39
lastTransm = ticks_ms() # message recu
40
elif incoming == "ROUGE" :
41
feuRouge = True
42
lastTransm = ticks_ms() # message recu
43
elif len(incoming) ==1:
44
afficheAttente(int(incoming))
45
46
# Robustesse du dispositif :
47
# L'esclave envoie un message au maitre toutes les secondes
48
if ticks_ms() - lastAlive > 1000:
49
radio.send("ALIVE")
50
lastAlive = ticks_ms()
51
52
# Mise en securite si le maitre plante
53
if ticks_ms() - lastTransm > 2000 :
54
# Plus de deux secondes sans nouvelles du maitre
55
feuRouge = True
56
display.show(Image.SAD)
57
else:
58
# Affichage Rouge / Orange
59
if feuRouge :
60
afficheRouge()
61
else :
62
afficheOrange()
63
64
# Arrivee vehicule prioritaire
65
if button_a.was_pressed():
66
radio.send("PRIO")
67