ไฟแสดงสถานะและไฟ LED
การแสดงสถานะของหลอดไฟ LED เป็นการจำลองการสั่งงานอุปกรณ์ของระบบอินเทอร์เน็ตของสรรพสิ่ง (Internet of Things) ซึ่งการรับคำสั่งจากผู้ใช้งานนั้น FOBI ได้มีระบบการรับคำสั่งในการเปิดปิดไฟหรืออุปกรณ์ต่างๆ เพื่อให้มีความหลากลายในการรับคำสั่งจากผู้ใช้งาน ทำให้ไม่เกิดความเบื่อหน่ายสำหรับผู้ใช้งาน โดยหลอด LED ที่เรานำใาใช้งานเป็น LED ที่สามารถเลี่ยนสีแบบ RGB ได้ ในการใช้งาน เราจำเป็นจะต้องพูดคำว่าเปิดไฟ เพื่อให้ FOBI รู้ว่าเป็นคำสั่งให้เปิดหลอดไฟ LED ตามด้วยสีที่ต้องการ เช่น “เปิดไฟสีเขียว” “เปิดไฟสีแดง” เป็นต้น และเมื่ออยากจะปิดไฟใช้แค่คำสั่งเสียง “ปิดไฟ” โดยเราจะใช้ Library Neopixel ในการแสดงสถานะไฟของหลอด LED และนอกจากนี้หลอด LED ก็ใช้กับการแสดงสถานะการทำงานของ FOBI อีกด้วย ว่าอยู่ในสถานะอะไร เช่น สีเขียวคือพร้อมรับคำสั่ง สีน้ำเงินกำลังประมวณผลคำสั่ง สีแดงคือมองไม่เห็นผู้ใช้งาน เป็นต้น
Neopixel
วิธีการติดตั้ง Library Neopixel
ในการติดตั้งบน Raspberry pi เราจะใช้คำสั่ง
sudo pip3 install rpi_ws281x adafruit-circuitpython-neopixel
sudo python3 -m pip install --force-reinstall adafruit-blinka
Neopoxel LED
1. เช็คข้อมูลที่รับมาจาก Node-red ว่ามีการส่งข้อมูล “เปิดไฟ “หรือ “ปิดไฟ”
ตัวอย่าง
global res , sub_txt , STATE,ST
while True:
if res.split(",")[0] == "เปิดไฟ":
sub_txt = res
if STATE == "result":
STATE = "not result"
ST = "null"
client.publish("module/talking/result","1")
for a in sub_txt.split(","):
if res.split(",")[0] != "เปิดไฟ" or res != sub_txt:
STATE = "result"
break
LED(a)
elif res.split(",")[0] == "ปิดไฟ":
LED(0)
client.publish("module/talking/result","1")
STATE = "result"
2. เช็คข้อมูลสีที่รับจาก Node-red มีสีอะไรบ้างและเปิดไฟตามสีที่ได้รับจาก Node-red
ตัวอย่าง
global ST
if a != "เปิดไฟ" and a!="":
a = int(a)
ST = "not null"
pixels.fill((R[a], G[a], B[a]))
pixels.show()
time.sleep(2)
elif a!= "เปิดไฟ" and a == "" and ST == "null":
pixels.fill((255, 255, 255))
pixels.show()
เมื่อนำโค้ดแต่ละส่วนมาร่วมเข้าด้วยกันและมี MQTT เป็นโปรโตคอลในการสื่อสารรับส่งข้อมูลกับ Node-red
ตัวอย่าง
import time
import board
import neopixel
import os
import paho.mqtt.client as mqtt
import threading
res = ""
sub_txt = ""
STATE = "result"
ST = "null"
R = [0,255,255,255,0,0,120,255,255,0]
G = [0,255,0,106,0,255,0,0,255,255]
B = [0,255,0,0,255,0,255,212,0,255]
_color = []
pixel_pin = board.D21
num_pixels = 24
ORDER = neopixel.GRB
pixels = neopixel.NeoPixel(pixel_pin, num_pixels, brightness=0.2, auto_write=False,
pixel_order=ORDER)
def LED(a):
global ST
if a != "เปิดไฟ" and a!="":
a = int(a)
ST = "not null"
pixels.fill((R[a], G[a], B[a]))
pixels.show()
time.sleep(2)
elif a!= "เปิดไฟ" and a == "" and ST == "null":
pixels.fill((255, 255, 255))
pixels.show()
def _connectLED():
global res , sub_txt , STATE,ST
while True:
if res.split(",")[0] == "เปิดไฟ":
sub_txt = res
if STATE == "result":
STATE = "not result"
ST = "null"
client.publish("module/talking/result","1")
for a in sub_txt.split(","):
if res.split(",")[0] != "เปิดไฟ" or res != sub_txt:
STATE = "result"
break
LED(a)
elif res.split(",")[0] == "ปิดไฟ":
LED(0)
client.publish("module/talking/result","1")
STATE = "result"
def on_connect(client,userdata,flags,rc):
client.subscribe("module/led/request")
def on_message(client,userdata,msg):
message = msg.payload.decode('utf-8')
if msg.topic == "module/led/request":
global res
res = message
def _mqtt():
client = mqtt.Client()
client.username_pw_set("username",password="hcilab")
client.on_connect = on_connect
client.on_message = on_message
client.connect("192.168.137.188",1883,60)
client.loop_forever()
client.disconnect()
if __name__=="__main__":
MQTTs = threading.Thread(target=_mqtt)
connectLED = threading.Thread(target=_connectLED)
MQTTs.start()
connectLED.start()
การทำ Neopoxel Status
จะรับข้อมูลสีของ Status ที่รับมาจาก Topic “status”
import time
import board
import neopixel
import paho.mqtt.client as mqtt
R = [0,0,255,0]
G = [0,255,0,0]
B = [0,0,0,255]
pixel_pin = board.D21
num_pixels = 16
ORDER = neopixel.GRB
pixels = neopixel.NeoPixel(pixel_pin, num_pixels, brightness=0.2, auto_write=False,
pixel_order=ORDER)
def on_connect(client,userdata,flags,rc):
client.subscribe("status")
def on_message(client,userdata,msg):
message = msg.payload.decode('utf-8')
if msg.topic == "status":
pixels.fill((R[int(message)], G[int(message)], B[int(message)]))
pixels.show()
client = mqtt.Client()
client.username_pw_set("username",password="hcilab")
client.on_connect = on_connect
client.on_message = on_message
client.connect("localhost")
client.loop_forever()
client.disconnect()