# LED（燈光）顯示功能

不同於其它的開發板，micro:bit本身就具備有25顆LED可以用於顯示的資訊，而且它的每一顆LED均可以使用(x, y)座標單獨控制，除了可以指定某一特定點的LED加以顯示之外，還可以得知該點的目前狀態，以及使用切換的方式來控制該點的明滅，善加運用這些功能，就可以做多許多非常有趣的功能。

micro:bit在燈光的部份可以使用的積木分別如下：

![](https://2988174335-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMo8UCGGycRFYs2Gx9M%2F-LNjhnRd2UpDes_b01cT%2F-LNjmRP-GXQCsl8BHMTO%2F2018-10-01_21-20-26.png?alt=media\&token=57f35d83-f373-436a-b2fc-9b90a5e32f51)

其中，第一個積木顧名思義，就是直接指定(x, y)座標所在位置的LED要點亮它，第二個積木當然就是要讓該座標所在位置的LED熄滅。第三個積木比較有趣，它會依照(x, y)座標所在的LED做切換的操作，也就是如果原來是亮的就把它熄滅，如果原來是暗的就把它點亮。

倒數第二個積木是用來查詢(x, y)位置上的LED之明暗資訊，因為是傳回值而不是一個操作，所以它的積木形狀和其它的不一樣。

最後一個積木比較特別，它把整個LED當作是一個長條圖來看，你給它一個最大值，以及一個你要它顯示的值，它就會依照比例來顯示出LED所佔的比重。例如，我們把最大值設定為100，然後顯示值給它20，如下所示：

![](https://2988174335-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMo8UCGGycRFYs2Gx9M%2F-LNjhnRd2UpDes_b01cT%2F-LNjoYb9xNPVphF__5uH%2F2018-10-01_21-29-29.png?alt=media\&token=24a88bd4-7280-4427-bfd7-160bdc1dcafc)

顯示出來的結果如下所示：

![](https://2988174335-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMo8UCGGycRFYs2Gx9M%2F-LNjhnRd2UpDes_b01cT%2F-LNjoen-YQO73yIiyzAQ%2F2018-10-01_21-30-07.png?alt=media\&token=c78df470-9d69-4e56-b8d7-7579369e2c9b)

如果把顯示值改為50，則模擬器呈現如下所示的畫面：

![](https://2988174335-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMo8UCGGycRFYs2Gx9M%2F-LNjhnRd2UpDes_b01cT%2F-LNjor8XbCPgpkNb8gmQ%2F2018-10-01_21-31-02.png?alt=media\&token=205df6a4-4ff8-4243-b393-b7366b3cba9c)

接著分別是80和100的樣子：

![](https://2988174335-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMo8UCGGycRFYs2Gx9M%2F-LNjhnRd2UpDes_b01cT%2F-LNjozsIMvbkaQmE6ZyC%2F2018-10-01_21-31-44.png?alt=media\&token=8f7cc97f-7c31-420f-9ced-1ef9613f5aa3)

![](https://2988174335-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMo8UCGGycRFYs2Gx9M%2F-LNjhnRd2UpDes_b01cT%2F-LNjp6UPBVjJV66-OFu3%2F2018-10-01_21-32-14.png?alt=media\&token=900f8c59-7918-4808-8e48-c0475d6b1cfa)

## 長條圖計數器實作

利用這個特性，我們就可以編寫一個以長條圖為顯示的計數器或是倒數計時器，以下的程式積木就是以長條圖的方式來計時，由於是每0.1秒增加1，所以會看到LED會在10秒之後填滿。

![](https://2988174335-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMo8UCGGycRFYs2Gx9M%2F-LNjpiSf6Z5OlBAGIWO5%2F-LNjqJxvw-1PiAX05wzi%2F2018-10-01_21-34-57.png?alt=media\&token=d4421a38-f3bb-4350-9606-2fd96a5cceb6)

上述程式搭配如果積木，可以做倒數計時，在時間到的時候隨即產生出時間到的效果。以下的程式積木讓我們的計時器在按下A按鈕時開始計時，如果按一下B按鈕就會暫停，再按一下B按鈕則會繼續，在10秒時間到的時候就讓畫面一直閃爍愛心的圖案。

![](https://2988174335-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMo8UCGGycRFYs2Gx9M%2F-LNjpiSf6Z5OlBAGIWO5%2F-LNjsis_CvxdA-e3BD6D%2F2018-10-01_21-47-17.png?alt=media\&token=b29e214d-700c-4dfa-9ac8-b3acbe5c05f4)

上面的程式中使用了兩個變數，其中counter用來計數，這個之前有說明過了，而counting則用來決定是否要進行計數。0的時候不計數，1的時候計數，其實計不計數就是有沒有要加1啦。因此，在次迴圈中我們利用一個如果判斷檢查counting的內容，如果是1才加1，如果不是的話就不加。

{% hint style="info" %}
其實使用counting的內容決定是否要把counter加1還有另外的寫法，不知道同學們有想到了嗎？（不用如果判斷式）
{% endhint %}

由於這個計數器的主迴圈中有兩個功能，最初是計時，而在時間到了之後改為以愛心閃爍來提示，因此，在主迴圈中要以一個如果判斷式，依照目前counter中的值來決定要執行哪一段程式積木，如果大於100，則執行閃爍功能，否則就執行計數的功能。

## 自製25秒計數器

由於LED共有25個，所以是否我們可以在每一秒過去了之後就點亮1個LED（或是相反，一開始的時候全亮，然後逐秒熄滅一個LED），一直到25秒之後全亮呢？當然可以，只是，要點亮或熄滅個別的LED指定位置時是以(x, y)座標來設定，但是在計數的時候卻是以0數到25來決定，因此，我們必須要把1到25的數字轉換成對應的(x, y)座標才行。假設我們的計數變數還是counter，則算式如下：

$$
x = counter % 5
\y= counter  / 5
$$

其中，第一個式子是取其餘數，而第二個式子是整除。使用和上一個程式類似的架構，但是在顯示時，我們是直接操作LED的(x, y)座標。此外，由於是以一點一點顯示為主，所以一開始除了設定變數的初始值之外，還要把所有的LED通通都清除，當啟動時的程式積木以及A按鈕和B按鈕事件的程式積木如下所示：

![](https://2988174335-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMo8UCGGycRFYs2Gx9M%2F-LNjt1HeWle0giTfJG2w%2F-LNjx5Vqi7zAE1Nf_qwM%2F2018-10-01_22-07-04.png?alt=media\&token=ce9f62bb-976e-424d-a5e5-3f0eba94e821)

主迴圈的內容改為如下：

![](https://2988174335-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMo8UCGGycRFYs2Gx9M%2F-LNjt1HeWle0giTfJG2w%2F-LNjxTj2G3DQpLdNL6gZ%2F2018-10-01_22-08-07.png?alt=media\&token=e8a325da-3f2f-4943-96bc-c43e5a1a7dc2)

依照這個方式，我們可以輕易在一個螢幕上顯示0-24或是1-25的數量，而不用等待數字捲動的方式去檢視2個位數的數值了。

## 使用LED來顯示溫度

例如，我們想要知道目前的溫度，最直覺的方法就是使用把溫度使用數字的方式顯示出來，溫度的數值是在「輸入」積木群中：

![](https://2988174335-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMo8UCGGycRFYs2Gx9M%2F-LNlxWtZNb5aEMs8g21q%2F-LNlv4uYMbpxtaFYxxuT%2F2018-10-02_07-17-15.png?alt=media\&token=8739835b-bf85-4fd0-84b6-78767ac6ad64)

一般來說，我們只要使用顯示數字積木把這個數值顯示出來即可：

![](https://2988174335-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMo8UCGGycRFYs2Gx9M%2F-LNlxWtZNb5aEMs8g21q%2F-LNlvLnbDglGvkQfKRxx%2F2018-10-02_07-18-15.png?alt=media\&token=ae672138-5854-4de9-a68f-0d497783813d)

然而這樣會看到的是捲動的數字，為了要看一個溫度還要等一小段時間才行（等兩個數字元都顯示完畢）。

在一個畫面中顯示溫度的方法有很多，其中一個方式是之前使用的長條圖，假設最高溫為50度，則可以利用以下的方式在一個畫面中顯示溫度：

![](https://2988174335-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMo8UCGGycRFYs2Gx9M%2F-LNlxWtZNb5aEMs8g21q%2F-LNlw8E7cbz2g8RLv9xd%2F2018-10-02_07-22-09.png?alt=media\&token=9f16f1cd-f2a3-477a-a0da-c3e8965747d5)

如此，當溫度為25度的時候，如下所示：

![](https://2988174335-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMo8UCGGycRFYs2Gx9M%2F-LNlxWtZNb5aEMs8g21q%2F-LNlwHEKhGm-Osj93u2h%2F2018-10-02_07-22-48.png?alt=media\&token=33a7f68f-da74-4b53-8296-510e7f0c92d0)

如果是38度的時候則為如下所示的畫面：

![](https://2988174335-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMo8UCGGycRFYs2Gx9M%2F-LNlxWtZNb5aEMs8g21q%2F-LNlwSYsSczXrNcdR58G%2F2018-10-02_07-23-32.png?alt=media\&token=51b566cd-eabd-4f8a-b577-772b17a0ef51)

## 控制個別的LED

學會如何控制(x, y)座標的LED之後，我們就可以透過A和B按鈕來移動LED的點了。先假設y固定為4，x一開始是2，當按下A按鈕時把x-1，直到0為止，當按下B按鈕時把y-1，直到4為止，一開始的初始化程式積木設計如下：

![](https://2988174335-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMo8UCGGycRFYs2Gx9M%2F-LNjt1HeWle0giTfJG2w%2F-LNk-AJYh_LuCBF3mhm4%2F2018-10-01_22-20-16.png?alt=media\&token=07f886b8-d50e-4a41-a34e-f8f4f8d43190)

我們希望當使用者按下A+B按鈕時也可以復原此狀態，因此在A+B按鈕之事件中做一個一模一樣的積木如下：

![](https://2988174335-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMo8UCGGycRFYs2Gx9M%2F-LNjt1HeWle0giTfJG2w%2F-LNk-UfLcZwJHqdIsQc-%2F2018-10-01_22-21-56.png?alt=media\&token=09a980c1-e4fd-4b32-8fcb-5f0be198b5b2)

如果使用者按下了A按鈕，我們就要讓這個亮點往左移動，往左移動的程式積木如下所示：

![](https://2988174335-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMo8UCGGycRFYs2Gx9M%2F-LNjt1HeWle0giTfJG2w%2F-LNk-iL-h0ZD3tdhhsWG%2F2018-10-01_22-22-57.png?alt=media\&token=cc961234-9efa-44a0-8c23-c941172de659)

按下B按鈕時要往右移動，如下所示：

![](https://2988174335-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMo8UCGGycRFYs2Gx9M%2F-LNjt1HeWle0giTfJG2w%2F-LNk-ql6eEeJLK78qVZV%2F2018-10-01_22-23-33.png?alt=media\&token=c50a68ad-43aa-4125-b4c1-80753382a5e4)

同學們可以比較一下兩者差異的地方在哪裡喔。

{% hint style="info" %}
這是一個製作動畫的基本技巧，同學們可要仔細研究一下喔。
{% endhint %}

## 使用隨機數來點亮LED

有一個有趣的隨機數積木，它在數學類積木中，可以指定要產生的數字從0到某指定值中任選一個傳回。利用這個特性，我們就可以讓隨機數來產生任意的(x, y)值，並據此切換該位置的LED亮或滅，達到小星星的效果，程式積木如下：

![](https://2988174335-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMo8UCGGycRFYs2Gx9M%2F-LNlxjhtJAM-Yf2hJ_AX%2F-LNlybZ8Gi-0WAJhoBa7%2F2018-10-02_07-32-56.png?alt=media\&token=9e7744c9-e2db-431b-9c38-571c3b71ec05)

以下的程式積木搭配了亮度的設定

![](https://2988174335-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMo8UCGGycRFYs2Gx9M%2F-LNlxjhtJAM-Yf2hJ_AX%2F-LNlyyiIDUuwvRnJy3Ym%2F2018-10-02_07-34-16.png?alt=media\&token=7dc5c235-34b8-4a2c-aea5-987a05c4ffaa)

使用另外一種效果：

![](https://2988174335-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMo8UCGGycRFYs2Gx9M%2F-LNlxjhtJAM-Yf2hJ_AX%2F-LNm-7ASatC3qalm1DNC%2F2018-10-02_07-39-21.png?alt=media\&token=09caa2ef-7544-425d-9158-ad08ca97ab62)

各位同學可以發揮自己的創意，善用隨機數以創造出更有趣的效果。
