FOBI

FOBI

ไฟแสดงสถานะและไฟ 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()