top of page

MODI + Python - 進階物聯網編程簡介 (2):讀取輸入模組數據

首先我們來嘗試讀取環境模組的溫度讀數。將網絡模組 (Network Module) 和環境模組 (Environment Module) 連接好,並使用 USB 數據線連接到電腦,請確保每個模組的電源指示燈均亮起。模組連接好後就可以執行以下代碼:

import modi
import time

bundle = modi.MODI()
all_envs = bundle.envs
env = all_envs[0]

while True:
    print('The current temperature is', env.temperature)
    time.sleep(1)

正常情況下應該可以看見類似以下的 Output:

值得注意的是,我們的 Python Script 剛剛連接 MODI 模組時,可能未能及時獲取真實的讀數,因此會暫時顯示為0,但一般來說很快就會回復正常。


現在我們就來拆解以上代碼的原理:


首先,我們需要導入 (import) 兩個需要的 Python package:modi 和 time。前者是我們先前安裝的 PyMODI 的導入名稱,後者是Python 原生的一個關於系統時間的 package。

import modi
import time

然後我們將連接到電腦的所有 MODI 模組以 PyMODI 所定義的一個物件 (Object) 表示,並存到名為「bundle」的變量 (Variable) 中。這裡 MODI() 是屬於 modi package 中的一個函數 (Function) 所以我們會以 modi.MODI() 調用。

bundle = modi.MODI()

以上「bundle」這個物件變量中存有所有已連接到電腦的 MODI 模組,包括我們的環境模組。我們首先調用 bundle.envs 將所有的環境模組以一個列表 (List) 表示,然後存到 all_envs 變量中。再以 all_envs[0] 提取列表中第一個物件,因為 Python 列表的 index 是由 0 開始計算。

all_envs = bundle.envs
env = all_envs[0]

由於我們想持續讀取環境模組的讀數,而不是只讀取一次,所以我們會使用一個無限迴圈 (Infinite Loop),即一個永遠不會停止的迴圈來讀取數據。在 Python 一般會使用以下方式實現:

while True:

然後我們提取 env 物件中名為 temperature 的 property 並利用 print 函數顯示。注意這裡必須向右縮排一格,因為這段代碼屬於以上的 while loop 內。

    print('The current temperature is', env.temperature)

最後我們需要每個迴圈都讓系統「睡眠」一秒,使其每秒只會讀取一次。與之前的 modi.MODI() 相似,這裡 sleep 是屬於 time package 的一個函數,所以需要以 time.sleep 的形式來調用。

    time.sleep(1)
 

如果需要讀取環境模組的其他讀數,可以利用 env.humidity 和 env.brightness 來分別提取濕度和光照度的讀數。我們可以將上面的代碼稍為更改變成以下的代碼:

import modi
import time

bundle = modi.MODI()
all_envs = bundle.envs
env = all_envs[0]

while True:
    print('temperature:', env.temperature, 'humidity:', env.humidity, 'brightness:', env.brightness)
    time.sleep(1)

執行以上代碼後可得到如下格式的 Output:

 

同樣地,我們亦可以讀取其他輸入模組的讀數。以下是各種模組在 PyMODI 的提取方法:


1. 環境模組 (Environment Module)

bundle.envs

2. 陀螺儀模組 (Gyro Module)

bundle.gyros

3. 傳聲器模組 (Microphone Module)

bundle.mics

4. 超聲波模組 (Ultrasonic Module)

bundle.ultrasonics

5. 紅外線模組 (IR Module)

bundle.ultrasonics

6. 按鈕模組 (Button Module)

bundle.buttons

7. 旋鈕模組 (Dial Module)

bundle.dials

以下代碼讀取了所有類型的輸入模組的讀數,並以 print 顯示出來。執行以下代碼前請確保所有輸入模組皆已連接好,或者刪除不必要的代碼部分。

import modi
import time

bundle = modi.MODI()

env = bundle.envs[0]
gyro = bundle.gyros[0]
mic = bundle.mics[0]
ultrasonic = bundle.ultrasonics[0]
ir = bundle.irs[0]
button = bundle.buttons[0]
dial = bundle.dials[0]

print('------------------------------')
while True:
    print('Reading Environment Module...')
    print('temperature:', env.temperature, 'humidity:', env.humidity, 'brightness:', env.brightness, '\n')
    
    print('Reading Gyroscope Module...')
    print('roll:', gyro.roll, 'pitch:', gyro.pitch, 'yaw:', gyro.yaw)
    print('angular velocities:', [gyro.angular_vel_x, gyro.angular_vel_y, gyro.angular_vel_z])
    print('accelerations:', [gyro.acceleration_x, gyro.acceleration_y, gyro.acceleration_z])
    print('vibration:', gyro.vibration, '\n')

    print('Reading Microphone Module...')
    print('volume:', mic.volume, 'frequency:', mic.frequency, '\n')

    print('Reading Ultrasonic Module...')
    print('distance:', ultrasonic.distance, '\n')

    print('Reading IR Module...')
    print('proximity:', ir.proximity, '\n')

    print('Reading Button Module...')
    print('clicked:', button.clicked, 'double clicked:', button.double_clicked, 'pressed:', button.pressed, 'toggled:', button.toggled, '\n')

    print('Reading Dial Module...')
    print('degree:', dial.degree, 'turn speed:', dial.turnspeed)

    print('------------------------------')

    time.sleep(1)

以下是執行以上代碼後的 Output 例子:



69 次查看0 則留言

Comments


bottom of page