智慧物聯 — 愛上雲端情境燈

光,是溫暖的陪伴 — -

光的顔色可以作用於人的感官,刺激人的神經,進而在情緒和心理上産生效應。科學研究發現紅色使人興奮,藍色使人安靜,橙色刺激食慾,黑色則讓人感到恐懼和緊張。同時,不同的色溫和亮度也能幫助人們改善生活品質:閱讀時,高亮度的燈光能讓人聚精會神,保持專注。休息時,輕柔的暖色光更能快速緩解疲勞,輔助睡眠。緩慢增加枕邊的照明強度到一定數值後,有利於輕鬆起床,調節情緒。光的作用還遠不止於此。光,是有魔力的。

今天, 我想介紹一下自己設計的雲端控制情境燈。

  • 它可已被遠端遙控
  • 可以依情境氣氛調控照明亮度、色溫、全彩顏色變幻。
  • 可以經由手機或平板透過 MQTT 通訊遠端控制燈具
  • 可以控制燈光開關, 12種顏色, 一些特殊的情境照明效果

重點材料

* WS2812 LED 燈條

* 使用的 MicroPython 套件

範例中所使用的是我個人開發設計的套件:MySimpleWifi, MyMQTT and MyKitNeoPixel 函式套件。

實體接線圖

MQTT 通訊協定

這裡, 我們後續將會接觸到現今物聯網的熱門通訊協定 MQTT。範例所使用的 MCU (此例所用為 ESP8266) 將扮演 MQTT 的 Subscriber, 而利用手機或 PC/NB 做為遠端控制指令的發布者, 經由 MQTT Broker (Server) 傳送至 ESP8266 進而控制其 LED 燈 (周邊裝置) 照明亮度、色溫、全彩顏色的變換。

*MQTT Broker

*MQTT Client — Publisher (訊息發佈者)

負責將訊息送出給 MQTT Broker。

  1. Google 輸入 mqttbox 搜尋, 點選 MQTTBox — Chrome 線上應用程式商店 — Google Chrome

範例程式碼

[boot.py]import MySimpleWifi
MySimpleWifi.myWifi(“你的 WiFi SSID”, “你的 WiFi 密碼”)
[main.py]
# 勇哥: 新增main.py – 讓 ESP8266同時擔任控制與被控制端, 並自動執行接收到的指令動作
from MyMQTT import myMQTT
from MyKitNeoPixel import myNeoPixel
from machine import Pin
import time
np = myNeoPixel(14, 8) # 將 8 pixels 的 LED 燈接在 D5 腳位 CLIENT_ID = "你的 MQTT 的 Client ID"
TOPIC = "led"
# 收到指令後的動作
def callbackLED(topic, msg):
if topic == TOPIC:
if len(msg) > 6 and msg[:6] == "color-":
np.setColor(msg[6:])
np.lightON()
elif msg == "on":
np.lightON()
elif msg == "off":
np.lightOFF()
elif msg == "toggle":
np.lightToggle()
elif msg == "blink":
np.show('blink', 2000)
elif msg == "forward":
np.show('forward', 100)
elif msg == "backward":
np.show('backward', 100)
elif msg == "bounce" or msg == "cycle":
np.show('bounce', 50)
elif msg == "random":
np.show('random', 1000)
elif msg == "rainbow":
np.show('rainbow', 1000)
elif msg == "colors":
np.show('colors', 50)
elif msg == "dance":
np.show('dance', 500)
# 此 Demo 範例的 Client 同時為訂閱者, 也是發佈者. 一般情形角色可二擇一即可.
def main(client_id):
mq = myMQTT(client_id)
mq.connect()
# 被控制端裝置
mq.setCallback(callbackLED)
mq.subscribe(TOPIC)
# 控制端裝置 (模擬的自動發送訊息)
message = ['color-yellow', 'on', 'toggle', 'toggle', 'blink', 'random', 'forward', 'rainbow', 'backward', 'colors', 'bounce', 'dance', 'off']
for msg in message:
mq.publish(TOPIC, msg)
time.sleep(1)
print(mq.checkMsg())
try:
while True:
print(mq.checkMsg())
finally:
mq.disconnect()
if __name__ == '__main__':
print('Main start up !!')
main(CLIENT_ID)

實作影片

如此而已, 就是這麼簡單, 希望能對你有發生了一點點小幫助 !

作者:Yungger 勇哥

--

--

Maker & Freelancer

Love podcasts or audiobooks? Learn on the go with our new app.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store