01 基礎篇(屏幕及按鍵的使用)
(2019/12/30)
下學期的課後社團將使用micropython來玩micro:bit 或Halocode光環板,所以這幾天開始整理micropython的入門講義,今天已完成基礎的入門篇,如下供參。我還是比較建議像科丁的方式國小學Scratch,國中學python,如果覺得要再活潑一點就學micropython來玩micro:bit(或Web:Bit或Halocode)
一、基礎篇
Python入門教學 (何敏煌老師)
Python眾多程式語言中的一種,它是一種直譯式的程式語言,也是一種膠合語言。屬於直譯式的原因是,它的程式在執行時是一行接著一行的,也就是說,系統會先翻譯一行執行它,如果順利執行之後,再翻譯下一行,再執行之。
下載及安裝MU
初識REPL
使用 MicroPython 的一个主要的优点是交互式的 REPL ,REPL(read-evaluate-print loop)代表读取﹣求值﹣输出循环。 REPL 对于学习一门新的编程语言具有很大的帮助,因为它能对初学者写的程序立刻做出回应,这意味着你执行代码,并能马上查看结果,而无需经过先编译再上传的繁琐步骤。
Python REPL 提示符,表示为 >>>
二、屏幕篇
常使用到的指令
from microbit import *
display.show() 顯示文字、圖案 (顯示器元件的顯示函式(括號內為【參數】)
display.scroll() 滾動 (跑馬燈) (顯示器元件的滾動函式)
Image.XXXXX (內建圖案)、Image('99999:00000:55555:77777:99999') (自訂圖案)
display.clear() 螢幕清除
display.show(Image().invert()) 點亮所有的燈
while True: (重複無限次)
sleep (暫停、等待)
顯示笑臉
makecode程式
micropython程式
from microbit import *
display.show(Image.SMILE)
第1行的目的是要匯入所有驅動micro:bit所需要的函數(例如display)
display.show 顯示圖案
display.show("A") (顯示一個文字或數字,用雙引號、單引號都可以,若輸入兩個字母會如何?會先顯示第一個字母後,再顯示第二個,非跑馬燈)
內建圖案的名稱
Image.HEART
Image.HEART_SMALL
Image.HAPPY
Image.SMILE
Image.SAD
Image.CONFUSED
Image.ANGRY
Image.ASLEEP
Image.SURPRISED
Image.SILLY
Image.FABULOUS
Image.MEH
Image.YES
Image.NO
Image.CLOCK12, Image.CLOCK11, Image.CLOCK10, Image.CLOCK9, Image.CLOCK8, Image.CLOCK7, Image.CLOCK6, Image.CLOCK5, Image.CLOCK4, Image.CLOCK3, Image.CLOCK2, Image.CLOCK1
Image.ARROW_N, Image.ARROW_NE, Image.ARROW_E, Image.ARROW_SE, Image.ARROW_S, Image.ARROW_SW, Image.ARROW_W, Image.ARROW_NW
Image.TRIANGLE
Image.TRIANGLE_LEFT
Image.CHESSBOARD
Image.DIAMOND
Image.DIAMOND_SMALL
Image.SQUARE
Image.SQUARE_SMALL
Image.RABBIT
Image.COW
Image.MUSIC_CROTCHET
Image.MUSIC_QUAVER
Image.MUSIC_QUAVERS
Image.PITCHFORK
Image.XMAS
Image.PACMAN
Image.TARGET
Image.TSHIRT
Image.ROLLERSKATE
Image.DUCK
Image.HOUSE
Image.TORTOISE
Image.BUTTERFLY
Image.STICKFIGURE
Image.GHOST
Image.SWORD
Image.GIRAFFE
Image.SKULL
Image.UMBRELLA
Image.SNAKE
螢幕清除:display.clear()
點亮所有的燈:display.show(Image().invert())
顯示Hello,World
makecode程式
micropython程式
from microbit import *
display.scroll("Hello World")
display.scroll 滾動(跑馬燈)函數
完整格式 scroll(string, delay=150, wait=True, loop=False, monospace=False) #逗號後面要空一格,delay控制捲動速度,loop控制是否一直循環出現,monospace文字等寛?
如何顯示 I'm a student
顯示自訂圖案
makecode程式
micropython程式
from microbit import *
display.show(Image('99999:00900:99999:00900:99999'))
數字9表示最亮,0表示不亮
也可用乘法表示 display.show(Image('11111:00100:11111:00100:11111')*9)
前面的內建圖案預設為最亮(9),也可以用以下方法讓它不亮一點 display.show(Image.SMILE*(1/9))
心臟噗通噗通跳
makecode程式
micropython程式
from microbit import *
while True:
display.show(Image.HEART)
sleep(1000)
display.show(Image.HEART_SMALL)
sleep(1000)
縮排一致當做同一個區塊
while True: (重複無限次)
sleep (暫停、等待,單位為毫秒)
三、按鍵篇
常使用到的指令
button_a.is_pressed() 現在正按下A鍵
button_b.was_pressed() 按下B鍵 (按下後馬上恢復原狀,所以長按也只算按一下)
button_a.get_presses() 按下A鍵的次數
if XXXXX: 如果
按A鍵顯示笑臉、按B鍵顯示哭臉
makecode程式
micropython程式
from microbit import *
while True:
if button_a.is_pressed():
display.show(Image.HAPPY)
if button_b.is_pressed():
display.show(Image.SAD)
button_a.is_pressed() 現在正按下A鍵
button_b.is_pressed() 現在正按下B鍵
if XXXXX: 如果
也可以如下:
from microbit import *
while True:
if button_a.is_pressed():
display.show(Image.HAPPY)
elif button_b.is_pressed():
display.show(Image.SAD)
三分法:
if XXXXX:
elif YYYY:
else:
如果...否則如果....否則...
剪刀石頭布遊戲
makecode程式
micropython程式
from microbit import *
while True:
if button_a.is_pressed() and button_b.is_pressed():
display.show(Image.SQUARE)
elif button_a.is_pressed():
display.show(Image.HEART)
elif button_b.is_pressed():
display.show(Image.SQUARE_SMALL)
會有問題,找不到剪刀圖案,先用愛心圖案代替
按A+B時,永遠不會呈現【布】,因為先符合按A或按B的條件
修改一下:
from microbit import *
while True:
if button_a.is_pressed() and button_b.is_pressed():
display.show(Image.SQUARE)
elif button_a.is_pressed():
display.show(Image.HEART)
elif button_b.is_pressed():
display.show(Image.SQUARE_SMALL)
感覺有好一點,但A+B鍵放開後,由於兩鍵會有先後放開,導致會顯示別的圖案
再修改一下:
from microbit import *
while True:
if button_a.is_pressed() and button_b.is_pressed():
display.show(Image.SQUARE)
sleep(100)
elif button_a.is_pressed():
display.show(Image.HEART)
elif button_b.is_pressed():
display.show(Image.SQUARE_SMALL)
加入一段等待時間來消除兩鍵放開的不一致
計數器
makecode程式
micropython程式
from microbit import *
count123 = 0
while True:
if button_a.is_pressed():
count123 = count123 + 1
elif button_b.is_pressed():
display.scroll(str(count123))
一樣有問題,數字會跨張的大,因為按下時,就一直在累加
改用 button_a.was_pressed(),按了馬上就清除記錄,所以即使長按也只算1次
from microbit import *
count123 = 0
while True:
if button_a.was_pressed():
count123 = count123 + 1
elif button_b.is_pressed():
display.scroll(str(count123))
10秒內統計按鍵A按下的次數
from microbit import *
display.show("PRESS A")
sleep(10000)
display.scroll(str(button_a.get_presses()), loop=True)
button_a.get_presses() :buttom_a為物件,get_presses為方法;表按下的次數
四、玩轉LED燈
常使用到的指令
for 變數 in range(0, 5): 計次迴圈
display.set_pixel(x, y, 亮度)
display.clear() 清除屏幕
依序點亮第一列燈
makecode程式
micropython程式
from microbit import *
for x in range(0, 5):
display.set_pixel(x, 0, 9)
sleep(1000)
說明:
for x in range(0, 5): 也可寫成 for x in range(0, 5, 1): 起點、終點、間隔 或 for x in range(5): 這程式當x達指定的數字時就離開迴圈,所以不能寫(0,4),這跟一般的程式比較不一樣!
逗點後面都要有一個空格
display.set_pixel(x, y, 亮度) 亮度由0(不亮)~9(最亮)
依序點亮一顆一顆燈(由左而右,再由上而下)
makecode程式
micropython程式
from microbit import *
for y in range(0, 5):
for x in range(0, 5):
display.set_pixel(x, y, 9)
sleep(1000)
同理,依序點亮一顆一顆燈(由上而下,再由左而右)
from microbit import *
for x in range(0, 5):
for y in range(0, 5):
display.set_pixel(x, y, 9)
sleep(1000)
如果,一次只想亮一顆LED燈,而不要填滿整個屏幕
from microbit import *
for x in range(0, 5):
for y in range(0, 5):
display.clear()
display.set_pixel(x, y, 9)
sleep(1000)
display.clear() 清除屏幕
九九乘法表
makecode程式
micropython程式
from microbit import *
for x in range(1, 10):
for y in range(1, 10):
rr=str(x) + "*" + str(y) + "=" + str(x*y)
display.scroll(rr, delay=100)
加、減、乘、除符號的前後方都要有一個空格
delay=100 加速捲動速度
畫出X圖形
makecode程式
micropython程式
from microbit import *
for y in range(0, 5):
for x in range(0, 5):
if x == y or x + y == 4:
display.set_pixel(x, y, 9)
else:
display.set_pixel(x, y, 0)
sleep(100)
五、隨機
電子骰子(按A鍵,隨機出現1~6)
makecode程式
micropython程式
from microbit import *
import random
while True:
if button_a.is_pressed():
display.show(random.randint(1, 6))
先要匯入random模組,才能使用randint函式
display.show(str(random.randint(1, 6))) 有沒有使用str將數字轉為文字,都沒關係