如何調整Micro:bit 顯示的亮度

Micro:bit 在預設使用display.show() 或是 display.scroll() 時預設使用的亮度都是最高的,這使得在教學上有時會造成學生眼睛的不適感。實際上Microbit 在顯示上是可以對亮度進行控制。並且可以針對每一個LED 的Pixel 進行亮度的調整。在LED 顯示上,我們用0-9 這十個整數來控制LED 的亮度。

我們可以使用

microbit.display.get_pixel(x, y)

來取得(x,y) 這一個pixel 上LED 的亮度,他會傳回一個0-9之間的整數。我們可以用

microbit.display.set_pixel(x, y, value)

來修改在(x,y) pixel 上的亮度,因此我們可以用下列的範例,把Microbit 上正在顯示的圖形亮度下降一階。

from microbit import *

display.show(Image.HAPPY)
sleep(5000)

for x in range(5):
   for y in range(5):
      n = display.get_pixel(x,y)
      if n>1:
         display.set_pixel(x,y,n-1)
sleep(5000)

這樣就可以把正顯示在Micro:bit 上的Happy 圖形亮度下降一階。 

在MicroPython 中有預設許多內建的圖形提供程式設計者使用,例如Image.HAPPY, Image.SAD, Image.DUCK, Image.HOUSE, Image.GHOST 等等,我們也可以自己定義一個圖像,例如:

from microbit import *

boat = Image("05050:"
             "05050:"
             "05050:"
             "99999:"
             "09990")

display.show(boat)

 

很自然地,我們會有需要從一個內建的圖像提取內容再修改的時候,這時我們可以使用repr() 這個函數把一個影像的內容變成字串的形式。例如

from micorbit import *

image = Image.HAPPY
S = repr(image)
display.scroll(S)

 我們便可以從LED 上看到完整的字串,這時我們只要修改字串的內容,就可以快速地讓我們做出新的圖像出來。下列的範例是我們利用修改影像內容的方式,來控制顯示圖像的亮度,透過AB 鍵的按壓,來控制增亮或是減亮。

from microbit import *

image=Image.HAPPY
display.show(image)
sleep(2000)
n=0

#Get the maxima value of LED
for x in range(5):
	for y in range(5):
		n=max([n, display.get_pixel(x, y)])

def img2str(res):
    # get the readable strings of an image
    A = repr(res)
    A = A.replace("Image('","")
    A = A.replace(":')","")
    return A
    
A = img2str(image)

while True:
	if button_a.is_pressed():
		if (n!=0) and (n<9):
			A=A.replace(str(n), str(n+1))
			n+=1
			display.show(str(n))
			sleep(500)
	if button_b.is_pressed():
		if (n!=0) and (n>1):
			A=A.replace(str(n), str(n-1))
			n-=1
			display.show(str(n))
			sleep(500)
	display.show(Image(A))

 

 另外一個程式是加入方向感測的功能來亂數更換顯示的圖像,透過與上列亮度調整程式的結合,做出更富有變化的遊戲。

from microbit import *
import random

Img_list=[Image.HOUSE, Image.DUCK, Image.HAPPY, Image.GHOST, Image.HEART]
image=random.choice(Img_list)
display.show(image)
sleep(1000)

n = 0
#Get the maxima value of LED
for x in range(5):
	for y in range(5):
		n=max([n, display.get_pixel(x, y)])

display.show(str(n))
sleep(500)

def img2str(res):
    # get the readable strings of an image
    A = repr(res)
    A = A.replace("Image('","")
    A = A.replace(":')","")
    return A
    
A = img2str(image)


while True:
	gesture=accelerometer.current_gesture()
	
	if gesture=="shake":
		image=random.choice(Img_list)
		n=9
		A=img2str(image)
	
	display.show(Image(A))
	
	if button_a.is_pressed():
		if (n!=0) and (n<9):
			A=A.replace(str(n), str(n+1))
			n+=1
			display.show(str(n))
			sleep(500)
			
	if button_b.is_pressed():
		if (n!=0) and (n>1):
			A=A.replace(str(n), str(n-1))
			n-=1
			display.show(str(n))
			sleep(500)