iT邦幫忙

2023 iThome 鐵人賽

DAY 6
4
自我挑戰組

WiFiBoy Python 玩學機介紹系列 第 6

06.鍵盤輸入值讀取與應用

  • 分享至 

  • xImage
  •  

從玩學機的密技談起

還記不記得前幾天的課程有教過大家一個關於玩學機的密技,「按下方向鍵處的黃鍵,然後開啟電源開關」,玩學機就會跳出電池狀態的畫面?

電池狀態

這是怎麼做到的呢?我們是否可以也編寫一些呼叫特定功能的組合鍵,讓我們帶著玩學機外出時,可以變成一個方便的檢測工具?愛幻想的我,就想要改造玩學機,例如:

  1. 按下藍色按鈕,叫出無線網路基地台的連線資訊,右邊的A、B鍵左右切換選單,兩鍵一起按,確認連線
  2. 按下黃色按鈕,叫出電池狀態檢測程式。
  3. 按下綠色按鈕,叫出超音波測距儀程式,接上超音波感測器後,螢幕顯示距天花板的距離。
  4. 按下紅色按鈕,叫出貪食蛇小遊戲。

這樣好像很有趣,但我們還需要學習很多有關 micropython 的相關知識。

wb.getkey() 讀取按鍵的組合值

  • 玩學機內建的按鍵定義值規則如下:
    • A 鍵(右半邊藍色按鈕): 1
    • B 鍵(右半邊藍色按鈕): 2
    • 右鍵Right(左半邊紅色按鈕): 4
    • 左鍵Left(左半邊綠色按鈕): 8
    • 下鍵Down(左半黃色按鈕): 16
    • 上鍵Up(左半邊藍色按鈕): 32
    • 選單鍵Menu(右半邊綠色按鈕): 64
  • 取得的按鍵值是每個按鍵是否按下去的鍵值總和(按下去就是對應鍵值,放開則對應0)。
  • 例如按下 A 鍵,讀到的數值是 1。按下左鍵,讀到的值是8。
  • 如果同時按下A鍵和B鍵,則讀到 1 + 2 = 3 值。因為 A= 1, B=2,相加為3。

範例一: 讀取按鍵值的小程式

print(wb.getkey())

此範例請直接在命令列輸入,自行測試按鈕,執行程式,查看數值。

範例二: 在命令列上顯示您按下的鍵值

while True:
	print(wb.getkey())

這支程式在 Thonny 環境下因為 Thonny 軟體終端機輸出過慢,會變得反應遲緩,您按下的鍵值要很久才會出現。建議您使用 WiFiBoy Python Playground 來測試程式。

範例三: 使用積木程式,按照按鈕對應數值,印出相對應次數訊息

範例三

對應的 Python 程式

for count in range(int(wb.getkey())):
	print('Hello')

如果您按下紅鍵,應該會印出四次的 Hello 字串。您可以自己試試其他的按鍵組合,看輸出的訊息次數是否跟您計算的數值一致。

範例四: 請根據下列條件要求,印出相對應的訊息

  1. 程式會一直執行,直到使用者按下正確的按鈕,才對印出對應的訊息。
  2. 如果使用者按下藍鍵,玩學機會在命令行印出「數值是32,你按了藍色按鈕!」。
  3. 如果使用者按下黃鍵,玩學機會在命令行印出「數值是16,你按了黃色按鈕!」。
  4. 如果使用者按下綠鍵,玩學機會在命令行印出「數值是8,你按了綠色按鈕!」
  5. 如果使用者按下紅鍵,玩學機會在命令行印出「遊戲結束」

程式碼如下:

while True:
    Key = wb.getkey()
    if Key == 32:
        print('數值是32,你按了藍色按鈕!')
        break;
    if Key == 16:
        print('數值是16,你按了黃色按鈕!')
        break;
    if Key == 8:
        print('數值是8,你按了綠色按鈕!')
        break;
    if Key == 4:
        print('炸彈引爆,遊戲結束!')
        break;

應用範例: 在畫面顯示您按下的按鈕

前面四個範例都是終端機的程式,但我們是用 WiFiBoy Python 玩學機啊!應該要將訊息輸出到 LCD 螢幕才對。不過,避免一開始記下過多的函式,我們晚一點解釋本範例程式的細節,先照著用、試著改,這不就是一般人學習程式設計的過程嗎?

我們可以透過上面的範例了解,程式的邏輯判斷並不需要畫面顯示,在命令列中就能成功執行。給人看的應用軟體畫面,應該要另外處理。因此我們可以把這個程式區分為下列幾步:

  1. 迴圈重複執行
  2. 讀取按鍵值
  3. 判斷按鍵值是否跟我們設定的條件一致?
    • 按到黃鍵,畫面改成黃色背景,訊息顯示「You Press Yellow Button!」。
    • 按到綠鍵,畫面改成綠色背景,訊息顯示「You Press Green Button!」。
    • 按到藍鍵,畫面改成藍色背景,訊息顯示「You Press Blue Button!」。
  4. 判斷是否按到爆炸按鈕?
    • 按到紅色按鈕,畫面改成紅色背景,訊息顯示「Game Over!」,程式結束
wb.cls()
while True:
    Key = wb.getkey()
    if Key == 32:
        wb.cls(wb.BLUE)
        wb.colors(wb.WHITE, wb.BLUE)
        wb.str("You Press", 5, 64, 2, 2)
        wb.str("Blue Button!", 20, 80, 2, 2)
    if Key == 16:
        wb.cls(wb.YELLOW)
        wb.colors(wb.PINK, wb.YELLOW)
        wb.str("You Press", 5, 64, 2, 2)
        wb.str("Yellow Button!", 20, 80, 2, 2)
    if Key == 8:
        wb.cls(wb.GREEN)
        wb.colors(wb.WHITE, wb.GREEN)
        wb.str("You Press", 5, 64, 2, 2)
        wb.str("Green Button!", 20, 80, 2, 2)
    if Key == 4:
        wb.cls(wb.RED)
        wb.colors(wb.WHITE, wb.RED)
        wb.str("Game Over!", 5, 64, 2, 2)
        break;

今天學了不少東西,休息一下。明天繼續上「控制LED燈」課程。


上一篇
05.小龜畫圖模組教學
下一篇
07. 控制LED 燈
系列文
WiFiBoy Python 玩學機介紹30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言