2025年12月28日 星期日

[物聯網與智慧工藝] 利用MQTT整合兩塊micro:bit來做燈光控制

MQTT Broker:MQTT GO

micro:bit物聯網和藍芽橋接器:

積木程式:


Python程式:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
def on_button_pressed_a():
    global LEDmode
    LEDmode = (LEDmode + 1) % 10
    basic.show_number(LEDmode)
input.on_button_pressed(Button.A, on_button_pressed_a)

def on_mqtt_qos_list_qos0(message):
    global LEDmode
    if message == "on":
        basic.show_icon(IconNames.CHESSBOARD)
    elif message == "off":
        basic.clear_screen()
    else:
        LEDmode = parse_float(message)
        basic.show_number(LEDmode)
        radio.send_number(LEDmode)
        basic.show_number(LEDmode)
ESP8266_IoT.mqtt_event("NFU/Q-Robot/LED-mode",
    ESP8266_IoT.QosList.QOS0,
    on_mqtt_qos_list_qos0)

def on_button_pressed_b():
    radio.send_number(LEDmode)
input.on_button_pressed(Button.B, on_button_pressed_b)

connect = 0
LEDmode = 0
basic.show_icon(IconNames.HEART)
radio.set_group(88)
LEDmode = 0
basic.pause(1000)
ESP8266_IoT.init_wifi(SerialPin.P8, SerialPin.P12, BaudRate.BAUD_RATE115200)
ESP8266_IoT.connect_wifi("ChiYuan", "22515103")
if ESP8266_IoT.wifi_state(True):
    basic.show_icon(IconNames.YES)
    basic.pause(1000)
    ESP8266_IoT.set_mqtt(ESP8266_IoT.SchemeList.TCP, "NFU_Q-Robot0001", "", "", "")
    ESP8266_IoT.connect_mqtt("MQTTGO.io", 1883, True)
    if ESP8266_IoT.is_mqtt_broker_connected():
        connect = 1
        basic.show_icon(IconNames.HAPPY)
    else:
        connect = 0
        basic.show_icon(IconNames.SAD)
else:
    basic.show_icon(IconNames.NO)

def on_forever():
    pass
basic.forever(on_forever)

具有藍芽通訊能力的燈光控制器:

Python程式:

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
def rainbow2():
    global ShiftCount
    strip.show()
    strip.shift(1)
    basic.pause(10)
    ShiftCount = (ShiftCount + 1) % (Number2 + 1)
    if ShiftCount == 0:
        strip.show_rainbow(1, 360)
def rainbow3():
    global range2, ShiftCount
    strip.clear()
    range2 = strip.range(0, ShiftCount)
    range2.show_rainbow(1, 360)
    range2.show()
    ShiftCount = (ShiftCount + 1) % (Number2 + 1)
    basic.pause(10)

def on_received_number(receivedNumber):
    global mode, strip
    mode = receivedNumber
    basic.show_string("" + str(mode))
    if mode == 3 and mode <= 4:
        strip = neopixel.create(DigitalPin.P0, Number2, NeoPixelMode.RGB)
        strip.show_rainbow(1, 360)
    elif mode >= 5:
        strip.clear()
        strip.show()
radio.on_received_number(on_received_number)

def monochrome():
    if submode == 0:
        strip.show_color(neopixel.colors(NeoPixelColors.RED))
    elif submode == 1:
        strip.show_color(neopixel.colors(NeoPixelColors.ORANGE))
    elif submode == 2:
        strip.show_color(neopixel.colors(NeoPixelColors.YELLOW))
    elif submode == 3:
        strip.show_color(neopixel.colors(NeoPixelColors.GREEN))
    elif submode == 4:
        strip.show_color(neopixel.colors(NeoPixelColors.BLUE))
    elif submode == 5:
        strip.show_color(neopixel.colors(NeoPixelColors.INDIGO))
    elif submode == 6:
        strip.show_color(neopixel.colors(NeoPixelColors.VIOLET))
    elif submode == 7:
        strip.show_color(neopixel.colors(NeoPixelColors.PURPLE))
    elif submode == 8:
        strip.show_color(neopixel.colors(NeoPixelColors.WHITE))
    elif submode == 9:
        strip.show_color(neopixel.colors(NeoPixelColors.BLACK))
    strip.show()

def on_button_pressed_a():
    global mode, strip
    mode = (mode + 1) % maxMode
    basic.show_string("" + str(mode))
    if mode == 3 and mode <= 4:
        strip = neopixel.create(DigitalPin.P0, Number2, NeoPixelMode.RGB)
        strip.show_rainbow(1, 360)
    elif mode >= 5:
        strip.clear()
        strip.show()
input.on_button_pressed(Button.A, on_button_pressed_a)

def loudness():
    strip.clear()
    strip.show_bar_graph(Math.map(input.sound_level(), 0, 255, 0, 16), 16)
    strip.show()
def rainbow5():
    global range2, ShiftCount
    strip.clear()
    range2 = strip.range(randint(0, Number2 - 1), 1)
    range2.show_color(randint(0, 65535))
    range2.show()
    ShiftCount = (ShiftCount + 1) % (Number2 + 1)
    basic.pause(10)
def rainbow():
    strip.rotate(77)
    strip.show()
    basic.pause(100)
def rainbow4():
    global range2, ShiftCount
    strip.clear()
    range2 = strip.range(ShiftCount, 1)
    range2.show_rainbow(1, 360)
    range2.show()
    ShiftCount = (ShiftCount + 1) % (Number2 + 1)
    basic.pause(10)

def on_button_pressed_b():
    global submode
    submode = (submode + 1) % 10
input.on_button_pressed(Button.B, on_button_pressed_b)

def brightness():
    strip.clear()
    strip.show_bar_graph(Math.map(input.light_level(), 0, 255, 0, 16), 16)
    strip.show()
range2: neopixel.Strip = None
strip: neopixel.Strip = None
ShiftCount = 0
Number2 = 0
submode = 0
maxMode = 0
mode = 0
mode = 0
maxMode = 10
submode = 0
Number2 = 300
ShiftCount = 0
strip = neopixel.create(DigitalPin.P0, Number2, NeoPixelMode.RGB)
radio.set_group(88)
basic.show_string("" + str(mode))

def on_forever():
    global submode
    if mode == 0:
        strip.clear()
        strip.show()
    elif mode == 1:
        monochrome()
    elif mode == 2:
        monochrome()
        basic.pause(500)
        submode = (submode + 1) % 10
    elif mode == 3:
        rainbow()
    elif mode == 4:
        rainbow2()
    elif mode == 5:
        rainbow3()
    elif mode == 6:
        rainbow4()
    elif mode == 7:
        rainbow5()
    elif mode == 8:
        loudness()
    else:
        brightness()
basic.forever(on_forever)

沒有留言:

張貼留言