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
[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()
[/python]


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.