Google cloud + Pi + micro:bit part 2

Spread the love

ต่อจากตอนที่แล้ว (Part 1) ตอนนี้เราจะเชื่อมต่อทั้งหมดเข้าด้วยกัน โดยหน้าที่ของแต่ละส่วนเป็นดังนี้

  1. Pi จะเรียกข้อมูลจาก web service ที่จะ return ข้อมูลกลับมาในรูปแบบ JSON ประกอบด้วย String และ List of String ตามรูป และส่งข้อมูลที่อยู่ใน List of String ไปแสดงผลที่ micro:bit ทีละตัว ทาง usb serial ทุกกี่วินาทีที่กำหนด
  2. micro:bit รับข้อมูลทาง usb serial มาแสดงผล
  3. เมื่อกดปุ่ม A ที่ micro:bit จะเป็นการร้องขอข้อมูลชุดใหม่จาก Pi ให้ Pi ส่งกลับมาทันที ไม่ต้องรอตามรอบ
รูปแบบข้อมูล JSON


vdo แสดงการทำงาน

code ของ micro:bit เขียนด้วย JavaScript Blocks Editor ที่ http://microbit.org/code/ ตามนี้

ส่วนโปรแกรมใน Pi ใช้ Python

from threading import Thread,Event
import requests
import serial
import io

def getNewData():
    try:
        r = requests.get("https://avian-foundry-132023.appspot.com/")
        if (r.status_code != 200):
            raise Exception()
        return r.json()['words']
    except:
        return ['1','2','3','4','5']

def sendDataToSerial():
    word = data.pop(0)
    print(word)
    word = word + '\n'
    ser.write(str.encode(word))
    if (len(data) < 3):
        data.extend(getNewData())

def readDataFromSerial():
    """
    1. read newline terminated data from serial port with 1s. timeout
    2. if the data equals to request command ("#a") then send new data to serial port
    """
    inword = sio.readline().strip()
    print("input >> "+inword)
    if (inword == "#a"):
        print("new word command received")
        sendDataToSerial()

class SerialThread(Thread):
    def __init__(self, event):
        Thread.__init__(self)
        self.stopped = event

    def run(self):
        while not self.stopped.wait(30):
            sendDataToSerial()



data = getNewData()
try:
    ser = serial.Serial('/dev/ttyACM0', 115200, timeout=5)
except Exception as e:
    print(str(e))
sio = io.TextIOWrapper(io.BufferedRWPair(ser, ser))
stopFlag = Event()
thread = SerialThread(stopFlag)
print('starting periodic thread')
sendDataToSerial()
thread.start()

try:
    while(1):
        readDataFromSerial()
except:
    stopFlag.set()
    ser.close()


Spread the love

Add a Comment

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.