Corrigé situation A sans LED : Améliorer la robustesse du dispositif

MéthodeCode feu Maître

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