CyberPi 健身輔助神器

現代愈來愈多的人有上健身房的習慣。在使用健身器材時,同一個器材教練都會要求要做3到5組,每組動作12~15次,組和組之間要休息1到1.5分鐘。在健身的過程中,要計算同一個動作做了幾次沒有問題,但是,每一組動作之間要休息的時間並不是每一個器材都有支援這個功能。在這篇文章中,我們就用CyberPi來製作一個輔助神器,讓它可以提醒我們,該做下一組動作了。

因為CyberPi本身具有動作感測器,因此我們可以用它來檢查目前CyberPi是否有在晃動,我們的設計方法是,當CyberPi開機之後,它就會不停地計數,如果累計的計數到達我們設定的時間點時,就要發出聲音讓我們知道,休息夠了,該進行下一組了。當我們又開始運動時,計數的值就要歸零重新計算。

第一版的程式如下所示,它只要一開機就開始計數,晃動就把時間歸零重算,如果計數超過90秒(一分半)就會發出聲音:

import cyberpi as cp
import event, time

counter = 0

@event.start
def on_start():
    while True:
        global counter 
        cp.display.show_label(counter, 32, "center")
        time.sleep(1)
        counter += 1
        if counter > 20:
            cp.audio.play_until('sprint')

@event.is_shake
def on_shake():
    global counter
    counter = 0

這個程式使用了一個counter變數用來計算停止動作到目前為止累計的時間,用2個事件來進行操作,start事件在CyberPi一通上電源時就開始執行顯示計數器以及累計計數器的工作,同時它會檢查如果超過設定的時間(在此範例以20秒為例,同學們可以自行更改),就會發出’sprint’這個聲音,當然聲音也可以自行更換。

is_shake是偵測CyberPi是否晃動的事件,如果發生晃動了,就把counter設定為0。因為counter這個變數是兩個事件函式都要操作的,所以要把它定義在外部,在函式中要操作時要先用global counter宣告才行。

上述的程式可以正常地運作,不過它的缺點是在程式中固定了計數的時間,此種方式會讓它的實用性大打折扣,畢竟並不是每一個人或是每一個動作所需要的休息時間都是相同的。下一個程式我們引入了另外一個變數limit,以及搖桿上下的事件,讓使用者可以自由地調整要發出聲響的時間,程式如下:

import cyberpi as cp
import mbuild, event, time

counter = 0
limit = 60

@event.start
def on_start():
    while True:
        global counter, limit 
        cp.display.show_label("{}/{}".format(counter,limit), 32, "center")
        time.sleep(1)
        counter += 1
        if counter > limit:
            cp.audio.play_until('sprint')

@event.is_shake
def on_shake():
    global counter
    counter = 0

@event.is_press('down')
def on_up():
    global limit
    limit = limit - 10
    if limit < 10:
        limit = 10
        
@event.is_press('up')
def on_down():
    global limit
    limit = limit + 10
    if limit > 120:
        limit = 120

上面這個程式已經可以讓我們自由地調整休息的時間了。但有時候如果我們想要讓它暫停一下,那又該如何設計呢?請參考以下的程式:

import cyberpi as cp
import mbuild, event, time

counter = 0
limit = 60
pause = False

@event.start
def on_start():
    while True:
        global counter, limit, pause
        if not pause:
            cp.display.show_label("{}/{}".format(counter,limit), 32, "center")
            time.sleep(1)
            counter += 1
        else:
            cp.display.show_label("Paused", 32, "center")
        if counter > limit:
            cp.audio.play_until('sprint')

@event.is_shake
def on_shake():
    global counter
    counter = 0

@event.is_press('down')
def on_up():
    global limit
    limit = limit - 10
    if limit < 10:
        limit = 10
        
@event.is_press('up')
def on_down():
    global limit
    limit = limit + 10
    if limit > 120:
        limit = 120

@event.is_press('a')
def on_a():
    global pause
    pause = True

@event.is_press('b')
def on_b():
    global pause
    pause = False    

在最終版的程式中我們加入了另外兩個按鈕,a按鈕表示要暫停,b按鈕表示要繼續。同時為了讓CyberPi可以真正執行暫停的作業,再加入一個全域變數pause,如果它不是True的時候才要執行counter = counter + 1以及顯示計數現況的操作,如果是pause是True的話,則不要計數,同時顯示”Paused”這段文字。

以下就是此健身輔助神器的操作展示:

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *