Version finale sans LED : ne pas bloquer la boucle avec sleep()

MéthodeCode 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éthodeCode 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()