Version finale sans LED : ne pas bloquer la boucle avec sleep()
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
feuRouge = True
11
lastTransm = ticks_ms() # derniere transmission ALIVE de l'esclave
12
clignotant = ticks_ms()
13
14
def afficheRouge():
15
for x in range(3,5):
16
for y in range(2):
17
display.set_pixel(x,y,9)
18
for x in range(3,5):
19
for y in range(3,5):
20
display.set_pixel(x,y,0)
21
def afficheOrange():
22
for x in range(3,5):
23
for y in range(2):
24
display.set_pixel(x,y,0)
25
# orange clignotant
26
couleur = max(0,4 - abs(ticks_ms()-clignotant - 500)//100)
27
for x in range(3,5):
28
for y in range(3,5):
29
display.set_pixel(x,y,couleur)
30
def afficheAttente(attente):
31
display.set_pixel(2,3,0)
32
for x in range(2):
33
for y in range(5):
34
display.set_pixel(x,y, 0 if 5*x+y >= attente else 9)
35
36
while True:
37
# Arrivee du vehicule prioritaire au feu maitre
38
if button_a.was_pressed():
39
feuRouge = False
40
attente = DUREE
41
radio.send("ROUGE")
42
43
# Traitement des messages en provenance de l'esclave
44
incoming = radio.receive()
45
# Arrivee du vehicule priopritaire au feu esclave
46
if incoming == "PRIO" :
47
feuRouge = True
48
attente = DUREE
49
radio.send("VERT")
50
51
# Robustesse du dispositif
52
# L'esclave est en vie :)
53
if incoming == "ALIVE" :
54
lastTransm = ticks_ms()
55
# Mise en securite si l'esclave plante
56
if ticks_ms() - lastTransm > 2000:
57
# Plus de deux secondes sans nouvelles de l'esclave
58
feuRouge = True
59
display.show(Image.SAD)
60
else:
61
# Affichage Rouge / Orange
62
if feuRouge :
63
afficheRouge()
64
else :
65
afficheOrange()
66
67
# Action toutes les secondes
68
if ticks_ms()-clignotant > 1000:
69
clignotant = ticks_ms()
70
attente -= 1
71
afficheAttente(attente)
72
radio.send(str(attente))
73
74
# Alternance du feu
75
if attente == 0 :
76
attente=DUREE
77
feuRouge = not feuRouge
78
79
# Le maitre envoie l'etat du feu a l'esclave toutes les secondes
80
if feuRouge :
81
radio.send("VERT")
82
else:
83
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
feuRouge = True
9
clignotant = ticks_ms()
10
lastTransm = ticks_ms() # derniere transmission du maitre
11
lastAlive = ticks_ms() # derniere transmission ALIVE de l'esclave
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
# orange clignotant
25
couleur = max(0,4 - abs(ticks_ms()-clignotant - 500)//100)
26
for x in range(3,5):
27
for y in range(3,5):
28
display.set_pixel(x,y,couleur)
29
def afficheAttente(attente):
30
display.set_pixel(2,3,0)
31
for x in range(2):
32
for y in range(5):
33
display.set_pixel(x,y, 0 if 5*x+y >= attente else 9)
34
35
while True:
36
incoming = radio.receive()
37
if incoming:
38
if incoming == "VERT" :
39
feuRouge = False
40
lastTransm = ticks_ms()
41
elif incoming == "ROUGE" :
42
feuRouge = True
43
lastTransm = ticks_ms()
44
elif len(incoming) ==1:
45
afficheAttente(int(incoming))
46
47
# Robustesse du dispositif :
48
# L'esclave envoie un message au maitre toutes les secondes
49
if ticks_ms() - lastAlive > 1000:
50
radio.send("ALIVE")
51
lastAlive = ticks_ms()
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
# Arrivee vehicule prioritaire
59
if button_a.was_pressed():
60
radio.send("PRIO")
61
62
# Affichage Rouge / Clignotant
63
if feuRouge :
64
afficheRouge()
65
else :
66
afficheOrange()
67
68
# Compteur temps à 0 toute les secondes
69
if ticks_ms()-clignotant > 1000:
70
clignotant = ticks_ms()